linux驱动程序之PCI驱动程序设计
文章目录
- PCI驱动描述
- PCI驱动注册
- 使能PCI设备
- 获取PCI配置寄存器基地址
- 中断
- 部分代码
PCI驱动描述
在linux内核中,PCI驱动使用 struct pic_driver 结构来描述:
struct pci_driver
{/*以上还有很多成员*///id_table 中包含了PCI设备的相关信息const struct pci_device_id *id_table;int (*probe) (struct pci_dev *dev,const struct pci_device_id *id);void (*remove) (struct pci_dev *dev);/*Device removed (NULL if not a hot-plug capable driver)*/
};
PCI驱动注册
注册PCI驱动,使用
pci_register_driver(struct pci_driver *drv);
使能PCI设备
在PCI驱动使用PCI设备的任何资源(I/O区或者中断)之前,驱动必须调用如下函数来使能设备:
int pci_enable_device(struct pci_dev *dev)
获取PCI配置寄存器基地址
一个PCI设备最多可以实现6个地址区域,大多数PCI设备在这些区域实现I/O寄存器。Linux提供了一组函数来获取这些区间的基地址:
pci_resource_start(struct pci_dev *dev,int bar)
返回指定区域的起始地址;这个区域通过参数 bar 指定,范围从 0—5,表示6个PCI区域的一个
pci_resource_end(struct pci_dev *dev,int bar)
返回指定区域的末地址
中断
中断号存放于配置寄存器 PCI_INTERRUPT_LINE 中,驱动不必去检查它,因为从PCI_INTERRUPT_LINE 中找到的值保证是正确的。**如果设备不支持中断,寄存器 PCI_INTERRUPT_LINE 中的值是0,**否则它是非0的值。但因为驱动开发者通常知道设备是否是支持中断,所以常常不需要访问 PCI_INTERRUPT_LINE。
相关的驱动程序分析,在内核文件 /driver/net/hamachi.c
部分代码
init函数
static int __init hamachi_init (void)
{/* when a module, this is printed whether or not devices are found in probe */
#ifdef MODULEprintk(version);
#endifif (pci_register_driver(&hamachi_driver) > 0)return 0;pci_unregister_driver(&hamachi_driver);return -ENODEV;
}
驱动描述
static struct pci_driver hamachi_driver = {name: DRV_NAME,id_table: hamachi_pci_tbl,probe: hamachi_init_one,remove: __devexit_p(hamachi_remove_one),
};
PCI 设备表
static struct pci_device_id hamachi_pci_tbl[] = {{ 0x1318, 0x0911, PCI_ANY_ID, PCI_ANY_ID, },{ 0, }
};
该表记录的能够支持的PCI设备,分别是厂商号,设备号,子厂商号,子设备号,其中子厂商号,子设备号为 PCI_ANY_ID ,表示支持各种子类型。
其他更多函数可在内核代码 /driver/hamachi.c
linux驱动程序之PCI驱动程序设计相关推荐
- UBOOT下IXP425 PCI驱动程序设计
UBOOT下IXP425 PCI驱动程序设计 2009-04-07 13:32 摘要: 本文说明了IXP425 PCI控制器的结构和操作方法,然后说明了如何在UBOOT下为IXP425编写PCI驱动程 ...
- Linux 驱动程序之字符驱动
Linux 驱动程序之字符驱动 系统调用.内核.驱动程序的关系 主要驱动类型: -> 字符设备 ( c) -> 块设备 (b) -> 网络设备 (ifconfig) 字符设备和块设备 ...
- 基于块的linux驱动程序,基于块的Linux驱动程序 块设备驱动 centos内核编译过程 操作系统课程设计...
操作系统的课程设计,本人也是一头雾水地做完了课程设计,在这里贴下操作过程,放下当时参考的一篇CSDN文章链接:https://blog.csdn.net/cxy_chen/article/detail ...
- 实时linux下的PCI驱动开发(上)
第一篇博客,忆苦思甜下先,当然,我尽量长话短说,但说来话长倒也无妨......这是我研究生阶段写的第一个Linux驱动,一入Linux深似海,从此Windows是路人.那是2009年冬天的第一场雪,王 ...
- linux下ad数模转换驱动程序设计,iTOP-4412开发板实现3路ADC数模转换驱动例程
学习下 linux 数模程序驱动的编写,本节我们实现的功能是实现三路 ADC 数模转换. 驱动程序 驱动程序的名字:"itop4412_adc.c". 要想把这个驱动注册到内核,先 ...
- tl-wn821n linux驱动程序,tl wn821n驱动下载
适用于TL-WN821N V4.0版本网卡的驱动程序,本驱动适用于TL-WN821N V1.0和v2.0无线网卡,增加了PSP XLink功能. 支持32位windows2k/xp/win7,也支持6 ...
- 基于龙芯 2K1000 的嵌入式 Linux 系统移植和驱动程序设计(二)
第 3 章 嵌入式软件系统移植 本课题中嵌入式系统正常工作的前提是嵌入式软件系统完整且能正常工作, 以便为之后的软件开发提供一个能够正常工作的平台.引导程序 PMON 需要完成 内核引导,嵌入式 Li ...
- 基于S3C2410的触摸屏驱动程序设计
基于S3C2410的触摸屏驱动程序设计 作者:沈阳农业大学 关键词: ADS7843 S3C2410 触摸屏 嵌入式Linux 消费电子 触摸屏 消费电子 摘要: 本文介绍了基于三星 ...
- c 调用 linux驱动程序,Linux下的C编程实战(五)――驱动程序设计
Linux下的C编程实战(五) ――驱动程序设计 1.引言 设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能: (1)初始 ...
最新文章
- mysql图片路径varchar大小_Mysqlvarchar大小长度问题_MySQL
- php如何通过变量销毁unset的过程讲解
- RDA PQ工具使用 (Adi Analysis)
- Spring WebSocket初探2 (Spring WebSocket入门教程)
- 由于TempDB设置错误导致SQL Server无法重启错误的解决方案
- CDMA系统的三种码
- CentOS下的Mysql的安装和使用
- C++的decltype
- java如何声明一个数组用来存储随机生成的字母并且保证不重复
- C语言程序设计第三版微课版,C语言程序设计(第3版 微课版)
- STM32电机库(ST-MC-Workbench)学习记录——电机参数及传感器设置
- win10的 程序员计算器
- journalctl查看服务日志
- Ubuntu14下安装使用SVN RabbitVCS客户端
- 物联网终端安全系列(之四) -- 终端安全方案之SIM卡篇
- 数据探查平台-元数据对标专利 -- 普帝
- 简单的ps去掉图片上不想留的文字
- java通过API给企业微信用户发送微信消息
- 高并发、高性能、高可用
- 黎明之路如何用电脑玩 黎明之路PC电脑版玩法教程
热门文章
- BZOJ2893:征服王(费用流)
- 炒股软件和量化接口与自动(智能)炒股知识大盘点
- win10休眠按钮在“选择电源按钮功能”配置中找不到
- C++笔记之return的用法
- 学校私有云盘(私有云存储)解决方案!
- Object.freeze的使用
- facebook instant game 发布指南-设置智能助手
- 跨界创业的中年人浪起来有多野?- 西凉阿土伯读书笔记
- 拥抱人工智能新时代 做真“英雄”还需靠“联盟”
- 【图像处理】图像视频压缩编码技术综述