Estoy estudiando cómo escribir un controlador de Linux integrado y decidí disparar algunos GPIO para asegurarme de que entiendo el libro. (LDD3, cap9.4.1) correctamente.
Puedo controlar los pines GPIO correctos según lo previsto (haciéndolo alto y bajo, probé con un multímetro); sin embargo, probé 2 piezas de código, una con request_mem_region()
, y uno sin. Espero que el que no tiene falle, pero ambos funcionan bien.
Código con request_mem_region
:
if( request_mem_region( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF,DEVICE_NAME ) == NULL )
{
printk( KERN_ALERT
"GPIO_140_141_conf_phys error:%s: unable to obtain I/O memory address 0x%08llX\n",
DEVICE_NAME, PIN3_CONF_PHYS );
return -EBUSY;
}
pin3_conf = (u32)ioremap( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin4_conf = (u32)ioremap( PIN4_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin5_conf = (u32)ioremap( PIN5_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin6_conf = (u32)ioremap( PIN6_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
//-----------------------------------------------------------------
if( request_mem_region( GPIO_BANK5_PHYS, MAPPED_SIZE_GPIO_5,DEVICE_NAME ) == NULL )
{
printk( KERN_ALERT
"error:%s: unable to obtain I/O memory address 0x%08llX\n",
DEVICE_NAME, GPIO_BANK5_PHYS );
return -EBUSY;
}
gpio_virt = (u32)ioremap( GPIO_BANK5_PHYS, MAPPED_SIZE_GPIO_5 );
//some iowrite32() functions continue...
código sin request_mem_region()
:
pin3_conf = (u32)ioremap( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin4_conf = (u32)ioremap( PIN4_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin5_conf = (u32)ioremap( PIN5_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin6_conf = (u32)ioremap( PIN6_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
gpio_virt = (u32)ioremap( GPIO_BANK5_PHYS, MAPPED_SIZE_GPIO_5 );
//some iowrite32() functions continue...
La única diferencia que puedo observar de ambos casos es el resultado de hacer un cat /proc/iomem
el que tiene request_mem_region()
mostrará una línea adicional que muestra 49056000-49056097 : GPIO3
.
mi pregunta es porque request_mem_region()
es necesario ya que todavía puedo comunicarme con la dirección de hardware con solo ioremap()
? Entonces, ¿cuándo realmente necesitamos usar request_mem_region()
?
¡Gracias por cualquier respuesta!