int io_devctl(resmgr_context_t *ctp,io_devctl_t *msg,RESMGR_OCB_T ocb)
{。。。。。。。switch( dcmd ) {
case DCMD_C429:
printf(“DCMD_C429”);
cmd=pctlc429->cmd;
switch(cmd)
{ case IOCTL_C429_READ_REGISTER_ULONG:
pctlc429->longdata=12;
nbytes=sizeof (Ctl_c429);
// resmgr_msgwrite(ctp,pctlc429,sizeof(Ctl_c429),sizeof(msg->o));
break;
case IOCTL_C429_WRITE_REGISTER_ULONG:
// out8( addrio+pctlc429->offset,pctlc429->longdata);
nbytes=0;
break;
default: printf(“c429 defaultn”);
}
}
addrmem=NULL;
addrio=NULL;
memset(&msg->o, 0, sizeof(msg->o));
munmap_device_memory(addrmem,0x1f);
msg->o.nbytes = nbytes ;
return _RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) + nbytes);
}
下面是一个结构:typedef struct _ctl_c429{
unsigned short cmd; // Command to run
unsigned long longdata; // read & write
unsigned long offset; //
} Ctl_c429, *pctl_c429;
这是一个前辈的io_devctl()文件。但我有很多不明白。
我始终不明白io_devctl()是怎么样把用户需要的数据传递给用户。用_RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) + nbytes); 吗?我知道它的意思说把需要的n字节数挂在msg->o后面,那我怎么知道这n个字节到底是不是我要的呢?是不是要配合resmgr_msgwrite(ctp,pctlc429,sizeof(Ctl_c429),sizeof(msg->o));我觉得是,但它注释掉了。??
还有我的PCI基址寄存器中除了io基地址(0xe000)以外都是0,我用ioport=mmap_dev_io(…port),port就是io基地址,之后ioport也是0xe000,与port一样,总觉得怪怪的。如果是对的那我是不是就可以用in,out函数了,当然先用threadctl()!
小弟新手,问题难免流于肤浅,望各位大哥不吝赐教。