Я учусь писать встроенный драйвер linux и решил запустить несколько GPIO, чтобы убедиться, что я правильно понимаю книгу (LDD3, chap9.4.1) .
Я могу управлять правильными выводами GPIO, как и предполагалось (делая это на высоком и низком уровне, я проверял мультиметром); Тем не менее, я протестировал 2 кода, один с request_mem_region()
, а другой без. Я ожидаю, что один без сбоев, но оба работают просто отлично.
Код с 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...
Код без 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...
Единственное отличие, которое я могу наблюдать в обоих случаях, это результат выполнения cat /proc/iomem
, в котором с request_mem_region()
появится дополнительная строка, показывающая 49056000-49056097 : GPIO3
.
У меня вопрос, зачем нужен request_mem_region()
, так как я все еще могу общаться с аппаратным адресом только с ioremap()
? Так когда же нам нужно использовать request_mem_region()
?
Спасибо за любые ответы!