[转]PCI的Linux实现及其驱动
2008-11-26 13:57
447 查看
PCI的Linux实现及其驱动
在Linxu下面driver/pci目录是PCI的初始化和bus的驱动,实现了dev和bus的常用的services
在driver其他目录那,比如ide和net目录下面,有相应的具体pci设备的驱动。
一个完整的PCI驱动必要的数据结构都有:
pci_driver
这个数据结构在文件include/linux/pci.h里,这是Linux内核版本2.4之后为新型的PCI设备驱动程序所添加的,其中最主要的是用于识别设备的id_table结构,以及用于检测设备的函数probe( )和卸载设备的函数remove( )
pci_dev
这个数据结构也在文件include/linux/pci.h里,它详细描述了一个PCI设备几乎所有的硬件信息,包括厂商ID、设备ID、各种资源等:
在PCI驱动中常见的由Linux所提供的services例程有:
注册/注销PCI上的设备
pci_register_driver()
pci_unregister_driver()
找到指定PCI设备:
pci_get_device()
pci_get_class()
pci_get_subsys()
启用/禁用PCI设备
pci_enable_device()
pci_disable_device()
寻址和中断
request_io_region()
request_mem_region()
配置空间访问相关:
pci_(read|write)_config_(byte|word|dword)
Misc.
pci_enable_device()
pci_set_master()
pci_set_swi()
一个完整的PCI驱动编写框架为:
Code
/* 指明该驱动程序适用于哪一些PCI设备 */
static struct pci_device_id demo_pci_tbl [] __initdata = {
{PCI_VENDOR_ID_DEMO, PCI_DEVICE_ID_DEMO,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEMO},
{0,}
};
/* 对特定PCI设备进行描述的数据结构 */
struct demo_card {
unsigned int magic;
/* 使用链表保存所有同类的PCI设备 */
struct demo_card *next;
/* */
}
/* 中断处理模块 */
static void demo_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
/* */
}
/* 设备文件操作接口 */
static struct file_operations demo_fops = {
owner: THIS_MODULE, /* demo_fops所属的设备模块 */
read: demo_read, /* 读设备操作*/
write: demo_write, /* 写设备操作*/
ioctl: demo_ioctl, /* 控制设备操作*/
mmap: demo_mmap, /* 内存重映射操作*/
open: demo_open, /* 打开设备操作*/
release: demo_release /* 释放设备操作*/
/* */
};
/* 设备模块信息 */
static struct pci_driver demo_pci_driver = {
name: demo_MODULE_NAME, /* 设备模块名称 */
id_table: demo_pci_tbl, /* 能够驱动的设备列表 */
probe: demo_probe, /* 查找并初始化设备 */
remove: demo_remove /* 卸载设备模块 */
/* */
};
static int __init demo_init_module (void)
{
/* */
}
static void __exit demo_cleanup_module (void)
{
pci_unregister_driver(&demo_pci_driver);
}
/* 加载驱动程序模块入口 */
module_init(demo_init_module);
/* 卸载驱动程序模块入口 */
module_exit(demo_cleanup_module);
在Linxu下面driver/pci目录是PCI的初始化和bus的驱动,实现了dev和bus的常用的services
在driver其他目录那,比如ide和net目录下面,有相应的具体pci设备的驱动。
一个完整的PCI驱动必要的数据结构都有:
pci_driver
这个数据结构在文件include/linux/pci.h里,这是Linux内核版本2.4之后为新型的PCI设备驱动程序所添加的,其中最主要的是用于识别设备的id_table结构,以及用于检测设备的函数probe( )和卸载设备的函数remove( )
pci_dev
这个数据结构也在文件include/linux/pci.h里,它详细描述了一个PCI设备几乎所有的硬件信息,包括厂商ID、设备ID、各种资源等:
在PCI驱动中常见的由Linux所提供的services例程有:
注册/注销PCI上的设备
pci_register_driver()
pci_unregister_driver()
找到指定PCI设备:
pci_get_device()
pci_get_class()
pci_get_subsys()
启用/禁用PCI设备
pci_enable_device()
pci_disable_device()
寻址和中断
request_io_region()
request_mem_region()
配置空间访问相关:
pci_(read|write)_config_(byte|word|dword)
Misc.
pci_enable_device()
pci_set_master()
pci_set_swi()
一个完整的PCI驱动编写框架为:
Code
/* 指明该驱动程序适用于哪一些PCI设备 */
static struct pci_device_id demo_pci_tbl [] __initdata = {
{PCI_VENDOR_ID_DEMO, PCI_DEVICE_ID_DEMO,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEMO},
{0,}
};
/* 对特定PCI设备进行描述的数据结构 */
struct demo_card {
unsigned int magic;
/* 使用链表保存所有同类的PCI设备 */
struct demo_card *next;
/* */
}
/* 中断处理模块 */
static void demo_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
/* */
}
/* 设备文件操作接口 */
static struct file_operations demo_fops = {
owner: THIS_MODULE, /* demo_fops所属的设备模块 */
read: demo_read, /* 读设备操作*/
write: demo_write, /* 写设备操作*/
ioctl: demo_ioctl, /* 控制设备操作*/
mmap: demo_mmap, /* 内存重映射操作*/
open: demo_open, /* 打开设备操作*/
release: demo_release /* 释放设备操作*/
/* */
};
/* 设备模块信息 */
static struct pci_driver demo_pci_driver = {
name: demo_MODULE_NAME, /* 设备模块名称 */
id_table: demo_pci_tbl, /* 能够驱动的设备列表 */
probe: demo_probe, /* 查找并初始化设备 */
remove: demo_remove /* 卸载设备模块 */
/* */
};
static int __init demo_init_module (void)
{
/* */
}
static void __exit demo_cleanup_module (void)
{
pci_unregister_driver(&demo_pci_driver);
}
/* 加载驱动程序模块入口 */
module_init(demo_init_module);
/* 卸载驱动程序模块入口 */
module_exit(demo_cleanup_module);
相关文章推荐
- PCI的Linux实现及其驱动
- linux下 PCI驱动实现
- Linux kernel驱动相关抽象概念及其实现 之“linux设备模型kobject,kset,ktype”
- 嵌入式Linux下PCI设备驱动的设计与实现
- Linux 千兆网卡驱动实现机制浅析(PCI Network Card)
- Linux I2C驱动分析与实现--例子
- [linux-kernel] 实现支持poll的驱动设备
- Linux的PCI驱动分析
- PCI驱动程序实现(linux)
- Linux进程的创建函数fork()及其fork内核实现解析
- sd卡驱动在linux 2.6.24上的实现简易心得
- linux驱动结构pci之pci_dev
- FS4412开发板使用Linux IIO驱动框架实现ADC驱动
- Linux I2C驱动分析与实现(一)
- Linux下的管道容量及其实现机制
- Linux进程的创建函数fork()及其fork内核实现解析【转】
- 如何实现Linux下的U盘(USB Mass Storage)驱动 分类: arm-linux-Ubuntu 2014-05-04 18:03 565人阅读 评论(0) 收藏
- linux驱动开发FL2440开发板-LED驱动及其测试程序
- 70 linux网络设备驱动之虚拟网卡及arp应答的实现
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核抢占实现机制分析