我有一个输入输出卡,我通过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,所以任何帮助都会很好。