Red de conocimiento informático - Conocimiento sistemático - ¿Cómo utilizar add_mtd_partitions y del_mtd_partitions durante la programación de controladores Linux o flash?

¿Cómo utilizar add_mtd_partitions y del_mtd_partitions durante la programación de controladores Linux o flash?

Función Add_mtd_partitions, add_mtd_partitions() creará una nueva estructura mtd_part para cada nueva partición, la agregará a mtd_

particiones y llamará a add_mtd_device() para usar esta partición como unión de dispositivos MTD. mtd_table. Devuelve 0 en caso de éxito, o -ENOMEM si no hay memoria suficiente al asignar mtd_part.

1. Antes de hablar de esta función, hablemos de las estructuras relacionadas struct mtd_part y struct

La estructura mtd_partition es la siguiente:

La estructura mtd_part es se usa para describir la partición, y sus miembros de la estructura mtd_info se usan para describir la partición

/* Nuestra estructura de nodo de partición */

struct

mtd_part {

struct mtd_info mtd;

Información de la partición (principalmente determinada por su maestro)

struct mtd_info

*la partición Partición primaria<; /p>

u_int32_t offset;

Dirección de compensación de la partición

int index;número de partición

struct list_head list;

int registrado;

};

struct mtd_partition {

char *nombre; /* cadena de identificador */ cadena de identificación

u_int32_t tamaño; /* tamaño de la partición */ tamaño de la partición

u_int32_t offset; /* desplazamiento dentro del espacio MTD maestro

espacio */ desplazamiento dentro del espacio MTD maestro

u_int32_t

mask_flags;/* domina los indicadores MTD para enmascarar

para esta partición */

struct

nand_ecclayout *ecclayout;/ * diseño fuera de banda

para esta partición (solo NAND)*/

struct mtd_info **mtdp;/* puntero para almacenar el objeto MTD

* /

};

Para entenderlo más claramente, usamos la definición en 6410:

struct mtd_partition s3c_partition_info[] =

{

{

.name =

"Cargador de arranque",

.offset =

0,

.size =

(256*SZ_1K),

.mask_flags = MTD_CAP_NANDFLASH,

},

{

.name = "Kernel",

.offset = (256*SZ_1K),

.size = (4*SZ_1M) - (256 *SZ_1K),

.mask_flags =

MTD_CAP_N

ANDFLASH,

},

#if

definido(CONFIG_SPLIT_ROOT_FILESYSTEM)

{

.name = " Rootfs",

.offset = (4*SZ_1M),

//

.size = (512*SZ_1M), //(48*SZ_1M ),

.size =

(80*SZ_1M), //(48*SZ_1M),

},

# endif

{

.name = "Sistema de archivos",

.offset = MTDPART_OFS_APPEND,

.size = MTDPART_SIZ_FULL,

p>

}

};

struct s3c_nand_mtd_info s3c_nand_mtd_part_info = {

.chip_nr = 1,

.mtd_part_nr =

ARRAY_SIZE(s3c_partition_info),

.partition

= s3c_partition_info,

}; >2. Siguiente Mire la función add_mtd_partitions, el código fuente es el siguiente:

/*

* Esta función, dado un objeto MTD maestro y un

tabla de particiones, crea

* y registra objetos MTD esclavos que están vinculados

al maestro de acuerdo con

* las definiciones de partición

<. p> * (P:

¿Deberíamos registrar también el objeto MTD maestro?)

*/

int

add_mtd_partitions( struct mtd_info *master,

const struct

mtd_partition *parts,

int

nbparts)

{

struct mtd_part

*slave;

u_int32_t cur_offset = 0;

int i;

printk( KERN_NOTICE "Creando

d particiones MTD en \"s\":\n", nbparts, master-gt

for (i = 0; i

lt; nbparts; i ) { Principalmente este cuerpo de bucle, cada estructura debe agregarse por separado

mt

estructura d_partition

slave =

add_one_partition(master, parts i, i, cur_offset);

if (!slave)

return -ENOMEM;

cur_offset = esclavo-gt;offset

esclavo-gt;mtd.size;

}

retorno

p>

0;

}