阅读:2073回复:4
偶的PCI卡驱动模板(请cyliu大侠帮忙看看)
请各位侠客高手来看看,hoho
正在做一块PCI卡(用的是PLX9052),第一次写PCI驱动,看了网上给的驱动结构,没找到file_operations结构如何和设备联系起来的(在代码中应该就是一个注册的过程) 这个结构最初是在2.4下的,看了LDD3,发现2.6下也差不多,当然makefile和函数的具体实现什么的要变变 请大家给点建议(2.4下和2.6下是否都可行),毕竟是第一次写PCI驱动 #ifndef __KERNEL__ #define __KERNEL__ #endif #ifndef MODULE #define MODULE #endif #include "test.h" //乱七八糟的包含定义等等都在这里了 //定义一下支持的设备 static struct pci_device_id __initdata test_pci_tbl[]= { {VENDOR_ID, DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0,} }; MODULE_DEVICE_TABLE(pci, test_pci_tbl); // 对自己的PCI设备进行描述的数据结构 typedef struct{ struct pci_dev *pdev; unsigned long int config_base; unsigned long int wr_base; unsigned long int wr_len; unsigned int irq; /*。。。。。*/ }test_card_info; static test_card_info *my_test=NULL; //接下来是一堆的函数声明 /*..............................*/ static struct pci_driver test_pci_driver = { name: MODULE_NAME id_table:test_pci_tbl, probe: test_probe, remove:__devexit_p(test_remove) }; static struct file_operations test_fops = { owner:THIS_MODULE, read:test_read, write:test_write, ioctl:test_ioctl, open:test_open, release:test_release /*..................*/ }; static struct miscdevice test_miscdev= { TEST_MINOR, "mytestcard", &test_fops //这里算是把设备方法和设备初步关联的过程吧 }; //接下来是函数的实现部分啦 //在probe中对test_card_info结构体初始化,还要实现misc_register (&test_miscdev),这个算是把设备的方法和设备真正关联起来了吧 //open要实现request_irq等等 /*..............................................*/ //最后是几个千篇一律的东西 static int __init test_init (void) { return pci_register_driver(&test_pci_driver); } static void __exit test_cleanup (void) { pci_unregister_driver(&test_pci_driver); } // 加载驱动程序模块入口 module_init(test_init); // 卸载驱动程序模块入口 module_exit(test_cleanup); |
|
最新喜欢:Leopar... |
沙发#
发布于:2007-05-17 16:00
厉害,努力。测试一下,一切了然。呵呵,-:)
|
|
|
板凳#
发布于:2007-05-17 16:48
感谢cyliu大侠
不过碰到新问题了,惭愧的说 卡插在机子上后,开机,进虚拟机,找不到卡 insmod 模块后果真没卡。。。 看/proc下也没有,不过windows下发现了 不知道这个问题怎么解决,PCI发现的过程是在BIOS里完成的,难道要装个Linux? 希望能帮忙确认一下问题发生在什么地方,是驱动代码还是其他地方 再次感谢! |
|
地板#
发布于:2007-05-18 16:17
Vmware的问题,在做个系统了。。。
偶又发现新的问题了... 如果驱动需要支持多块卡(卡都一样,通过跳线设置不同的卡ID) 驱动应该怎么做? 偶的想法: static struct pci_device_id __initdata test_pci_tbl[]= { {PCI_VENDOR_ID, DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0,} }; 这个结构的成员还是只有一个,靠卡ID来识别不同的卡 驱动维护一个链表,每个结点代表一个设备,链表的初始化和结点的添加在probe里完成,但是中断什么的该怎么办?(中断申请一个中断?来中断了怎么判定是哪一块卡的?难道要遍历一遍链表?) open、close呢?难道要为每块卡建个设备文件?比如有3块卡,建立设备文件的时候难道要mknod /dev/test c 10 8 mknod /dev/test c 10 9 mknod /dev/test c 10 10 (具体设备号请别介意,例子而已) 请高手特别是cyliu大侠指点啊 //bow |
|
地下室#
发布于:2007-05-22 12:11
中断通过设备号来区分阿。你不是保留了Id了吗?可以把id等私有信息保存在设备的私有空间中。
设备文件是对应用层的接口,应该是每个设备对应一个。 |
|
|