gpt4 book ai didi

c - request_mem_region() 实际上做了什么以及何时需要?

转载 作者:太空狗 更新时间:2023-10-29 16:25:12 24 4
gpt4 key购买 nike

我正在研究编写嵌入式 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()

感谢您的任何回复!

最佳答案

request_mem_region告诉内核你的驱动程序将使用这个范围的 I/O 地址,这将防止其他驱动程序通过 request_mem_region 对同一区域进行任何重叠调用。 .这种机制不做任何类型的映射,它是一种纯粹的保留机制,它依赖于所有内核设备驱动程序必须很好,并且它们必须调用 request_mem_region 的事实。 ,检查返回值,并在出现错误时正确处理。

因此,您的代码在没有 request_mem_region 的情况下工作是完全合乎逻辑的,只是不符合内核编码规则而已。

但是,您的代码不符合内核编码风格。此外,还有一个现有的基础设施来处理 GPIO,名为 gpiolib,您应该使用它而不是手动重新映射您的 GPIO bank 寄存器。您在哪个平台上工作?

关于c - request_mem_region() 实际上做了什么以及何时需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7682422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com