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);唤醒一个实时线程任务
}