¿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 p>
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>
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>
p>
0;
}