openwrt lee y escribe uboot_env

Los sistemas integrados a menudo necesitan guardar algunos datos privados en el dispositivo y asegurarse de que el sistema no se pierda durante las actualizaciones y reinicios.
Prácticas comunes
1. Plug-in eeprom, flash
2. Medios de almacenamiento existentes, abra una nueva partición mtd para operar.
Etc. En
esta sección, use uboot_envtools para operar la partición uboot_env

uboot_envtools es en realidad parte del código fuente de uboot. La implementación específica está en el directorio uboot / tools / env /, al ejecutar make env en el directorio raíz de u-boot, puede generar el programa de aplicación fw_printenv y copiar el programa de aplicación al sistema de archivos raíz, puede ver el correspondiente uboot variables de entorno también.

1. Ver la partición del sistema

root@OpenWrt:/usr# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00030000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00010000 00010000 "factory"
mtd3: 00fa0000 00010000 "firmware"
mtd4: 0016c8dc 00010000 "kernel"
mtd5: 00e33724 00010000 "rootfs"
mtd6: 00750000 00010000 "rootfs_data"

2. menuconfig agregar módulo uboot_envtools

 .config - OpenWrt Configuration
 > Utilities > Boot Loaders ─────────────────────────────────────────────────────────────────
  ┌──────────────────────────────────── Boot Loaders ─────────────────────────────────────┐
  │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty submenus      │  
  │  ----).  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, <M>   │  
  │  modularizes features.  Press <Esc><Esc> to exit, <?> for Help, </> for Search.       │  
  │  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable                   │  
  │ ┌───────────────────────────────────────────────────────────────────────────────────┐ │  
  │ │      < > fconfig..................................... RedBoot configuration editor│ │  
  │ │      <*> uboot-envtools................. read/modify U-Boot bootloader environment│ │  
  │ │                                                                                   │ │  
  │ │                                                                                   │ │  
  │ └───────────────────────────────────────────────────────────────────────────────────┘ │  
  ├───────────────────────────────────────────────────────────────────────────────────────┤  
  │               <Select>    < Exit >    < Help >    < Save >    < Load >                │  
  └───────────────────────────────────────────────────────────────────────────────────────┘  

3. Después de compilar, ingrese al sistema y pruebe

  • Ver env
root@OpenWrt:/# fw_printenv
bootcmd=bootp; setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; bootm
bootdelay=5
baudrate=115200
ssid=12345678
  • Agregar env, uuid = 1234567890
root@OpenWrt:/# fw_setenv uuid 1234567890
root@OpenWrt:/# fw_printenv
bootcmd=bootp; setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; bootm
bootdelay=5
baudrate=115200
ssid=12345678
uuid=1234567890
  • Eliminar env
root@OpenWrt:/# fw_setenv uuid
root@OpenWrt:/# fw_printenv
bootcmd=bootp; setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; bootm
bootdelay=5
baudrate=115200
ssid=12345678
root@OpenWrt:/#

4. Leer y escribir operaciones en código c a través del sistema y canales abiertos


int fw_env_del(char *key)
{
    
    
	char buffer[256];
	sprintf(buffer,"fw_setenv %s",key);
	
	return system(buffer);
}

int fw_env_set(char *key,char *val)
{
    
    
	char buffer[256];
	sprintf(buffer,"fw_setenv %s %s",key,val);
	
	return system(buffer);
}

int fw_env_get(char *key,char *val)
{
    
    
	FILE * fp;
	char buffer[256];
	char read_key[32];
	char read_val[128];

	fp=popen("fw_printenv","r");
	if (fp<0){
    
    
		return -1;
	}

	while(fgets(buffer,sizeof(buffer),fp)){
    
    
		sscanf(buffer,"%[^=]=%s",read_key,read_val);

		if(!strcmp(key,read_key)){
    
    
			strcpy(val,read_val);

			pclose(fp);
			return 0;
		}
	}
		
	pclose(fp);
	return -404;
}

5. El script lee env

#!/bin/sh

# 加载ubootenv中的数据,抓取uuid的值,赋给变量data
data="$(fw_printenv | grep uuid | cut -d= -f2)"

echo data=$uuid

exit 0

6. Modifique la partición fw_env

  • Ver la partición fw_env actual
root@OpenWrt:/# cat /etc/fw_env.config
/dev/mtd1 0x0 0x10000 0x1000
  • fw_env.config es generado por script, paquete de ruta / boot / uboot-envtools / files / ramips
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x10000"
  • Los parámetros se definen en el paquete de archivos / boot / uboot-envtools / files / uboot-envtools.sh
ubootenv_add_uci_config() {
    
    
	local dev=$1
	local offset=$2
	local envsize=$3
	local secsize=$4
	local numsec=$5
	uci batch <<EOF
add ubootenv ubootenv
set ubootenv.@ubootenv[-1].dev='$dev'
set ubootenv.@ubootenv[-1].offset='$offset'
set ubootenv.@ubootenv[-1].envsize='$envsize'
set ubootenv.@ubootenv[-1].secsize='$secsize'
set ubootenv.@ubootenv[-1].numsec='$numsec'
EOF
	uci commit ubootenv
}
parámetro sentido
/ dev / mtd1 Especifique la partición en la memoria flash donde se encuentra boot_env
0x0 Especifique el desplazamiento en la partición donde se encuentra boot_env (tiene un significado práctico, el desplazamiento se ha especificado para la partición mtd)
0x1000 Especifique el tamaño del espacio de almacenamiento de la variable de entorno de uboot para que sea coherente con ENV_SIZE definido en el paquete / boot / uboot - $ {boardname} / Makefile; de ​​lo contrario, se informará un error de verificación de CRC. Por ejemplo, el tamaño de la partición mtd1 es 1MiB, y el tamaño especificado por uboot es 0x40000, entonces se debe usar 0x40000
0x10000 Especifique el tamaño del sector flash
  • Modifique el paquete / boot / uboot-envtools / files / ramips para guardar los datos en otras particiones mtd.
    Por ejemplo:
ubootenv_add_uci_config "/dev/mtd7" "0x0" "0x10000" "0x1000"

Supongo que te gusta

Origin blog.csdn.net/pyt1234567890/article/details/107705472
Recomendado
Clasificación