黄色大片在线免费观看_黄色大全下载_黄色的app下载_黄色的软件大全_亚洲国产不卡_亚洲国产成人91porn

信盈达—您身边的嵌入式&人工智能专家
全国免费咨询热线:400-8788-909

嵌入式培训:Linux平台下Pci总线驱动详解

时间:2018-08-22 00:00:00 来源:信盈达 作者:信盈达

PCI总线是一种高性能局部总线,是为了满足外设间以及外设与主机间高速数据传输而提出来的。

?

PCI总线系统要求有一个PCI控制卡,它必须安装在一个PCI插槽内。根据实现方式不同,PCI控制器可以与CPU一次交换32位或64位数据,它允许智能PCI辅助适配器利用一种总线主控技术与CPU并行地执行任务。PCI允许多路复用技术,即允许一个以上的电子信号同时存在于总线之上。

?

每个PCI设备有许多地址配置的寄存器,初始化时要通过这些寄存器来配置该设备的总线地址,一旦完成配置以后,CPU就可以访问该设备的各项资源了。PCI标准规定每个设备的配置寄存器组多可以有256个连续的字节空间,开头64个字节叫头部,分为0型(PCI设备)和1型(PCI桥)头部,头部开头16个字节是设备的类型、型号和厂商等。

?

PCI总线架构

?

所有的根总线都链接在pci_root_buses链表中。Pci_bus ->device链表链接着该总线下的所有设备。而pci_bus->children链表链接着它的下层总线,对于pci_dev来说,pci_dev->bus指向它所属的pci_bus. Pci_dev->bus_list链接在它所属bus的device链表上。此外,所有pci设备都链接在pci_device链表中。

?

Linux下PCI驱动的代码模型

?

一个通过PCI总线与系统连接的设备的驱动主要包括两部分:第一PCI总线驱动,第二,设备本身的驱动,包括字符设备,网络设备,tty设备,音频设备等。PCI驱动的核心是pci_driver,在探测函数中完成资源的申请,并注册相应的字符设备,网络设备,tty设备,音频设备等。以下代码以三星平台s3c24XX为例,

?

static struct pci_device_id buttons_pci_tbl[] __initdata={

?

{PCI_ANY_ID,PCI_ANY_ID,PCI_ANY_ID,PCI_ANY_ID,0,0,0},

?

{0,}

?

}; //PCI设备支持项

?

static irqreturn_t buttons_interrupt(int irq, void *dev_id)

?

{

?

//中断处理程序

?

}

?

static int s3c24xx_buttons_open(struct inode *inode, struct file *file)

?

{

?

}

?

static int s3c24xx_buttons_close(struct inode *inode, struct file *file)

?

{

?

}

?

static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

?

{

?

}

?

static struct file_operations dev_fops = {

?

.owner = THIS_MODULE,

?

.open = s3c24xx_buttons_open,

?

.release = s3c24xx_buttons_close,

?

.read = s3c24xx_buttons_read,

?

};

?

static struct miscdevice misc = {

?

.minor = MISC_DYNAMIC_MINOR,

?

.name = DEVICE_NAME,

?

.fops = &dev_fops,

?

};

?

static int pci_key__probe (struct pci_dev *pdev, const struct pci_device_id *ent)

?

{

?

int ret;

?

pci_enable_device(pdev); //使能PCI设备

?

pci_set_master(pdev);

?

ret = misc_register(&misc); //注册杂项设备

?

printk (DEVICE_NAME"\tinitialized\n");

?

return ret;

?

}

?

static int pci_key__remove (struct pci_dev *pdev, const struct pci_device_id *ent)

?

{

?

pci_disable_device(pdev);

?

misc_deregister(&misc);

?

return 0;

?

}

?

static struct pci_driver pci_key_driver = {

?

.name = "pci_key",

?

.id_table =buttons_pci_tbl,

?

.probe = pci_key__probe,

?

.remove = pci_key__remove,

?

};

?

static int __init dev_init(void)

?

{

?

return pci_register_driver(&pci_key_driver);

?

}

?

static void __exit dev_exit(void)

?

{

?

pci_unregister_driver(&pci_key_driver);

?

}

?

module_init(dev_init);

?

module_exit(dev_exit);

?

PCI I/O和PCI内存地址

?

这两个地址空间用来实现PCI设备和Linux核心中设备驱动程序之间的通讯。例如DEC21141快速以太网设备的内部寄存器被映射到PIC I/O空间上时,其对应的Linux设备驱动可以通过对这些寄存器的读写来控制此设备。PCI视频卡通常使用大量的PCI内存空间来存储视频信息。

?

PCI系统建立并通过用PCI配置头中的命令域来打开这些地址空间前,系统决不允许对它们进行存取。值得注意的是只有PCI配置代码读取和写入PCI配置空间,Linux设备驱动只读写PCI I/O和PCI内存地址。 那是因为当系统初始化阶段完成后,每个PCI设备的地址空间都已经应设在PCI总线上了,驱动程序直接通过总线地址就可以访问PCI设备,当然也可以去读写配置空间,但这没有必要。




信盈达2008年在深圳特区南山高新科技园成立。自成立至今近九年来专注为企业和个人提供高端方案设计、高端嵌入式/Android培训等服务。公司下设信盈达实训学院、信盈达研发中心、信盈达教学仪器三大业务板块。九年来公司坚持"技术领先、服务领先",以雄厚的实力和专业的品质成为国内唯一有实力从产品最底层研发到系统层开发的嵌入式实训、产品解决方案提供商。为中国IT行业提供最具价值的职业教育服务。专业嵌入式、物联网、人工智能Java、单片机等课程,想了解更多信息点击立马咨询?

主站蜘蛛池模板: 国内精品福利爱丝视频_速发 | 国产一区二区三区手机在线观看 | 国产高清不卡码一区二区三区 | 91樱桃| 欧美综合视频在线 | 久久精品国产亚洲a不卡 | 国产在线观看成人免费视频 | 黄色毛片网站 | 黄页在线观看免费 | 黄色在线视频网 | 精品日韩欧美一区二区三区 | 久久艹视频| 国产一区二区三区欧美精品 | 国模一区二区三区私啪啪 | 成人毛片免费观看视频大全 | 日韩免费精品一级毛片 | 日本免费不卡一区 | 国产日韩欧美一区二区三区视频 | 日本一级特黄毛片免费视频9 | 欧美cao| 日韩欧美在线观看 | 欧美日韩国产在线 | 成年视频免费观看 | 广州一级毛片 | 老司机精品在线 | 国内自拍偷拍网 | 91久久亚洲国产成人精品性色 | 国产亚洲欧美日韩在线看片 | 黄页在线观看免费 | 成人在免费视频手机观看网站 | 欧美亚洲综合一区 | 成年人在线观看视频 | 97久久草草超级碰碰碰 | 欧美自拍 | 成人欧美在线 | 欧洲一级毛片 | 麻豆精品一区 | 精品免费一区二区三区 | 精品国产亚一区二区三区 | a级人体片免费观看网站 | 国产区精品一区二区不卡中文 |