Ich habe mehrere eingebettete Linux-Geräte an Kundenstandorten installiert. Wir haben einen aktualisierten Linux-Kernel, den wir bereit sind, auf diesen Geräten bereitzustellen. Das Problem ist, dass auf diesen Geräten die U-Boot-Argumente so angegeben sind:
bootargs = {....} mtdparts=atmel_nand:16M(kernel)ro,240M(rootfs)
Ich kann also nicht flash_erase, um den Kernel oder U-Boot über SSH zu schreiben, da MTD0 schreibgeschützt ist. Ich kann die U-Boot-Argumente ohne seriellen Zugriff nicht optimieren. Für viele Kunden wäre es extrem umständlich, alle Geräte herunterzunehmen und sie seriell anzuschließen und U-Boot zu unterbrechen, um zu den Bootargs zu gelangen. Gibt es eine Möglichkeit, MTD0 vom Kernel nach dem Laden von ro auf rw zu ändern?
Haben Sie darüber nachgedacht, ein einfaches Kernelmodul zu erstellen, das Sie einfügen können, um die MTD-Partition(en) beschreibbar zu machen? Ich hatte das gleiche Problem und konnte es umgehen, indem ich ein Kernelmodul schrieb. Der Einfachheit halber habe ich einfach weitergemacht und jedes MTD-Gerät beschreibbar gemacht. Grundsätzlich muss das Modul in seiner Init-Funktion so etwas tun:
struct mtd_info *mtd;
int x;
bool keep_going = true;
for (x = 0; keep_going; x++) {
mtd = get_mtd_device(NULL, x);
if (!IS_ERR(mtd)) {
mtd->flags |= MTD_WRITEABLE;
put_mtd_device(mtd);
} else {
keep_going = false;
}
}
Nachdem ich dieses Modul eingefügt hatte, konnte ich flash_erase und nandwrite erfolgreich verwenden, während ich im Kernel gebootet wurde, während flash_erase mir zuvor sagte: "Fehler 13 (Zugriff verweigert)"
MTD_WRITEABLE
Flag über sysfs in mtdcore.c verfügbar zu machen. Auf diese Weise können Sie es nach Bedarf umschalten, um das MTD-Gerät schreibgeschützt zu halten.Eine andere Möglichkeit besteht darin, das (mit u-boot erstellte) Dienstprogramm zu verwenden fw_setenv
, um die gespeicherten Umgebungsvariablen von u-boot innerhalb von Linux zu ändern. Das würde einen Neustart erfordern, um mit dem neuen zu laufen bootargs
, im Gegensatz zum Laden eines Kernelmoduls, aber das ist viel weniger Arbeit als die Verwendung eines seriellen Kabels. Es ist auch ein nützliches Werkzeug für andere Situationen.
Dokumentation ist hier: https://elinux.org/U-boot_environment_variables_in_linux
Das Wichtigste, was Sie wissen müssen, ist, dass Sie eine Konfigurationsdatei verwenden, um zu wissen, wo u-boot seine Umgebung im nichtflüchtigen Speicher speichert, und sie muss mit dem übereinstimmen, wofür u-boot kompiliert wurde fw_setenv
.fw_printenv
Die übliche Lösung ist
mount / -o remount,rw
Chris Stratton
trycatch
trycatch