工作总结日志<二> 有关PCI的

本文详细介绍了PCI设备初始化的过程,包括通过厂商ID和设备ID查找设备、启用设备、获取资源地址、映射内存空间以及配置中断等步骤。同时给出了具体的实现代码示例。

PCI初始化

变量:pci_dev *dev=NULL;设备句柄

           static unsigned char irq;中断号

           usnigned char Map1,Map2.......;设备地址映射指针

           unsigned long Addr1,Addr2......;设备I/O区域首地址标识

函数:pci_find_device(unsigned int vendor,unsigned int device ,struct pci_dev *from);厂商ID,设备ID,设备句柄

           pci_resource_start(pci_dev *,int bar);

           pci_enable_device(pci_dev *);

           ioremap();

           pci_read_config_byte(pci_dev *,int ,u8 *);  

实现:

dev=pci_find_device(VENDOR_ID,DEVICE_ID,dev);
pci_enable_device(dev)

 Addr0  = pci_resource_start(dev, 3); 
 Addr1  = pci_resource_start(dev, 4); 
 
 Map0=(unsigned char *)ioremap(LocalAddr0 ,pci_resource_len(dev, 3));
 Map1=(unsigned char *)ioremap(LocalAddr1 ,pci_resource_len(dev, 4));

 pci_read_config_byte(dev,0x3c,&irq);

PCI中断:

retValue = rtl_request_irq (irq, isr_schedule);实时中断注册函数

rtl_hard_enable_irq(irq);实时中断使能函数 实际需要硬件电平信号支持 需要拉低或抬高实际硬件电平 具体操作寄存器

MCB_INIT:初始化自己的总线协议:

 pcomm = (comm_t *)(Map1);
 pdebug = (debug_t *)(Map1 + sizeof(comm_t));
 pmsg_s = (msg_t *)(Map1 + sizeof(debug_t) + sizeof(comm_t));
 pmsg_r = (msg_t *)(Map1 + sizeof(debug_t) + sizeof(comm_t) + sizeof(msg_t));
 paxis = (axis_t *)(Map1 + sizeof(debug_t) + sizeof(comm_t) + sizeof(msg_t)+ sizeof(msg_t));
 pint = (INT32U *)(Map1 + (4095<<2));

将驱动指针pcomm pdebug等关联到PCI地址空间Map1

memcpy_toio();I/O空间写入,实际写入PCI设备

中断响应函数 isr_schedule:

unsigned int isr_schedule(int irq,void *dev,struct pt_regs *regs)

{

 1.memcpy_fromio(&m,pint,4); I/O空间读 判断是否为该硬件产生的中断信号 PCI中断共享情况下使用

 2.*Map2=0x00;关中断 具体实现方式依据硬件

 3.数据交换

 4.*Map2=0x51;开中断 具体实现

 5.附加功能:可以唤醒与中断同步的线程或者进程 完成同步使能等工作

        本代码附加:pthread_wakeup_np(emcmotTask);唤醒一个实时线程任务

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值