如何编写Linux驱动程序IOCTL例程?

时间:2016-08-31 12:40:42

标签: c linux linux-device-driver ioctl

我有一个输入输出卡,我通过PCIe连接到我的PC 接口

我已经为linux编写了一个驱动程序来访问设备,这是IOCTL 例程。

static int _ioctl(struct inode *inode, struct file *file,
                              unsigned int cmd, unsigned long arg)
{
  U32 temp;
  U32 Add = 0;
  U32 Data = 0;
  U32 nCmd = 0;

       // __get_user(nCmd,(int *)cmd)); 
    switch ( cmd )
    {
        case NOOFCARDS:
            __put_user(NumberOfCards,(U32 *)arg);
            break;

        case IOMEMORY:
            temp = pci1553[0].Mem1;
            __put_user(temp,(U32 *)arg);
                     printk("IOMEMORY :%x\n",temp);
            break;

        case IOPORTS:
            temp = pci1553[CardCount].Mem4;
//          temp = PCI_BASE_ADDRESS[3];
            __put_user(temp,(U32 *)arg);
            break;

        case DEVICEID:
            printk("DEVICE_ID :%x\n",DEVICE_ID);

            temp = DEVICE_ID;
            __put_user(temp,(U32 *)arg);
            break;

        case VENDORID:
            printk("VENDOR_ID :%x\n",VENDOR_ID);
            temp = VENDOR_ID;
            __put_user(temp,(U32 *)arg);
            break;

        case BUSNO:
            temp = pci1553[CardCount].BusNum;
            __put_user(temp,(U32 *)arg);
            break;
        case READ16IO:
             __get_user(Add,(U32 *)arg);
                 temp =  inw(pci1553[CardCount].Mem4 + Add);
             __put_user(temp,(U32 *)arg);
                break;
        case READ8IO:
              __get_user(Add,(U32 *)arg);
              temp =  inb(pci1553[CardCount].Mem4 + Add);
              __put_user(temp,(U8 *)arg);
              break;

        case WRITE16IO:
             __get_user(Add,(U32 *)(arg + 0));
                 __get_user(Data,(U32 *)(arg + 4));
                 outw(Data,pci1553[CardCount].Mem4 + Add);
//          printk("W16IO Add:%x\n",Add);
//          printk("W16IO MemAdd:%x\n",pci1553[CardCount].Mem4 + Add);
//          printk("W16IO Data:%x\n",Data);
//              temp =  inw(pci1553[CardCount].Mem4 + Add);
//          printk("R16IO Data:%x\n",temp);
                 break;

            case WRITE8IO:
                   printk("WRITE8IO\n");
             __get_user(Add,(U32 *)(arg + 0));
                 __get_user(Data,(U32 *)(arg + 4));
                 outb(Data,pci1553[0].Mem1 + Add);
                 break;
}

我正在尝试通过我的应用程序调用{​​{1}}来使用此功能 程序

我的ioctl电话 ioctl 这里ioctl(fd,WRITEIO16,Data1);是我上传的文件描述符 打开设备文件fd这是WRITIO16,Data1是cmd

但无论我传递什么参数,我都不会在驾驶员中得到这个。 司机进入arg例程,但没有得到 从应用程序传递的参数。 当我直接在驱动程序中提供参数时,驱动程序正在工作 IOCTL例程。

这是我第一次编写Linux Driver,所以任何帮助都会很好。

0 个答案:

没有答案