【发布时间】:2011-10-07 02:09:54
【问题描述】:
我正在研究编写嵌入式 linux 驱动程序,并决定触发一些 GPIO 以确保我正确理解这本书 (LDD3, chap9.4.1)。
我能够按预期控制正确的 GPIO 引脚(使其高低,我用万用表探测);但是,我测试了两段代码,一段带有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()呢?
感谢您的回复!
【问题讨论】:
标签: c linux-kernel linux-device-driver embedded-linux