PCI子系统(三)- PCI设备驱动
程序员文章站
2022-03-27 21:53:27
这里拿linux/drivers/leds/leds-ss4200.c来做模板参考学习注册struct pci_driverstatic struct pci_driver nas_gpio_pci_driver = { .name = KBUILD_MODNAME, .id_table = ich7_lpc_pci_id, .probe = ......
这里拿linux/drivers/leds/leds-ss4200.c来做模板参考学习
注册struct pci_driver
static struct pci_driver nas_gpio_pci_driver = {
.name = KBUILD_MODNAME,
.id_table = ich7_lpc_pci_id,
.probe = ich7_lpc_probe,
.remove = ich7_lpc_remove,
};
static int __init nas_gpio_init(void)
{
ret = pci_register_driver(&nas_gpio_pci_driver);
}
static void __exit nas_gpio_exit(void)
{
pci_unregister_driver(&nas_gpio_pci_driver);
}
module_init(nas_gpio_init);
module_exit(nas_gpio_exit);
probe
使能PCI设备,读取PCI设备对应在CPU总线上的寄存器地址
/* ICH7 LPC/GPIO PCI Config register offsets */
#define PMBASE 0x040
#define GPIO_BASE 0x048
#define GPIO_CTRL 0x04c
#define GPIO_EN 0x010
/* The ICH7 GPIO register block is 64 bytes in size. */
#define ICH7_GPIO_SIZE 64
static int ich7_lpc_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
status = pci_enable_device(dev);
status = pci_read_config_dword(dev, PMBASE, &g_pm_io_base);
status = pci_read_config_dword(dev, GPIO_CTRL, &gc);
status = pci_read_config_dword(dev, GPIO_BASE, &nas_gpio_io_base);
gp_gpio_resource = request_region(nas_gpio_io_base, ICH7_GPIO_SIZE, KBUILD_MODNAME);
}
除了可以用pci_read_config_word读取pci设备的访问地址之外,一般是通过pci_resource_start(pci_dev, 0),然后再通过request_region申请访问这块地址。
操作PCI设备
通过从PCI设备配置信息中读取的nas_gpio_io_base寄存器地址操作led
static void __nasgpio_led_set_attr(struct led_classdev *led_cdev, u32 port, u32 value)
{
struct nasgpio_led *led = led_classdev_to_nasgpio_led(led_cdev);
u32 gpio_out;
gpio_out = inl(nas_gpio_io_base + port);
if (value)
gpio_out |= (1<<led->gpio_bit);
else
gpio_out &= ~(1<<led->gpio_bit);
outl(gpio_out, nas_gpio_io_base + port);
}
参考文章
本文地址:https://blog.csdn.net/luckywang1103/article/details/85990349
推荐阅读
-
Linux系统中列出PCI设备和USB设备的命令详解
-
Linux设备驱动之IIO子系统——IIO框架及IIO数据结构
-
Linux设备驱动之IIO子系统——IIO框架数据读取
-
Linux设备驱动--字符设备(三、自动创建设备文件)
-
3.3【Linux驱动基础之三】:设备号、主设备号、次设备号
-
linux设备驱动:中断下半部的三种实现机制
-
手把手教你写Linux设备驱动---input子系统(四)--电容屏驱动ft5x06编写(一)(基于友善之臂4412开发板)...
-
Linux驱动学习(三)平台总线设备驱动模型
-
linux 驱动开发之平台设备驱动设备树 input子系统的使用:按键中断驱动
-
三大绝技!技嘉发布B250挖矿专用主板:12条PCI-E插槽