Tengo varios dispositivos Linux integrados instalados en los sitios de los clientes. Tenemos un kernel de Linux actualizado que estamos preparados para implementar en estos dispositivos. El problema es que en estos dispositivos, los argumentos de U-Boot se especifican de manera que:
bootargs = {....} mtdparts=atmel_nand:16M(kernel)ro,240M(rootfs)
Por lo tanto, no puedo flash_erase para escribir nand en el kernel o U-Boot sobre SSH porque MTD0 es de solo lectura. No puedo modificar los argumentos de U-Boot sin acceso en serie. Para muchos de los clientes, desarmar todos los dispositivos y conectarlos en serie e interrumpir el U-Boot para llegar a los bootargs sería extremadamente engorroso. ¿Hay alguna forma de cambiar MTD0 de ro a rw desde el kernel una vez que se carga?
¿Ha considerado crear un módulo kernel simple que pueda insertar para hacer que las particiones MTD se puedan escribir? Tuve este mismo problema y pude solucionarlo escribiendo un módulo del kernel. Para simplificar, seguí adelante e hice que todos los dispositivos MTD tuvieran capacidad de escritura. Básicamente, el módulo tiene que hacer algo como esto en su función de inicio:
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;
}
}
Después de insertar este módulo, pude usar flash_erase y nandwrite con éxito mientras arrancaba en el kernel, mientras que antes, flash_erase me decía: "error 13 (Permiso denegado)"
MTD_WRITEABLE
indicador a través de sysfs en mtdcore.c. De esa manera, puede alternarlo según sea necesario para mantener el dispositivo MTD protegido contra escritura.Otra opción es usar la fw_setenv
utilidad (construida con u-boot) para modificar las variables de entorno guardadas de u-boot desde dentro de Linux. Eso requeriría un reinicio para ejecutar con el nuevo bootargs
, a diferencia de cargar un módulo del kernel, pero eso es mucho menos trabajo que usar un cable serie. También es una herramienta útil para otras situaciones.
La documentación está aquí: https://elinux.org/U-boot_environment_variables_in_linux
Lo principal que debe saber es eso fw_setenv
y fw_printenv
usar un archivo de configuración para saber dónde u-boot almacena su entorno en un almacenamiento no volátil, y tiene que coincidir con lo que se compiló u-boot.
La solución habitual es
mount / -o remount,rw
chris stratton
trata de atraparlo
trata de atraparlo