免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2221 | 回复: 0
打印 上一主题 下一主题

pci驱动的读写函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-25 08:44 |只看该作者 |倒序浏览
又要麻烦各位大哥了!小弟那写的pci采集卡的驱动函数,要求也不高,实现基本的IO访问即可!
设备结构体如下:
struct adlink_device
{
unsigned long mem_len;   //the lence of the memery region
void __iomem *ioaddr; //the base start address of IO memery
//我这里采用内存映射的方式
unsigned long mem_flag; //the flags of the IO port and IO memer
char mem[MEM_SIZE];     //define the buffer memmory whose size is MEM_SIZE
struct pci_dev *pci_dev;
struct cdev cdev;      //thr struct of character device
};
一开始是先尝试通过字符设备来把数据读写到 char mem[MEM_SIZE]; ,这步没有问题!整个驱动程序都很正常!
然后我打算往PCI寄存器的里面读写,就是 void __iomem *ioaddr读写!发现有2个问题:
1:往寄存器里写还好说,要是读的话,事先并不知道是char型还是int或者double什么的,而 *ioaddr类型也是viod的,该怎么进行read呢?
2:我就自己瞎尝试着 void __iomem *ioaddr写入!把原型的字符设备的write函数改为如下:
ssize_t adl_write(struct file *filp,char __user *buf,size_t size,loff_t *ppos)
{
unsigned long p=*ppos;
unsigned int count=size;
int ret=0;
struct adlink_device *dev=filp->private_data;
printk(KERN_ALERT "adlink file_operation's write is called!\n");
char *mem=(char *)dev->ioaddr;
if (p>dev->mem_len)
{
  printk(KERN_ALERT "write %d bytes form %ld\n",count,p);
   return count ? - ENXIO:0;
}
if(count>dev->mem_len-p)
   count=dev->mem_len-p;
if(copy_from_user(mem+p,buf,count))
   ret=-EFAULT;
else
{
   *ppos+=count;
   ret=count;}
printk(KERN_ALERT "write %d bytes form %ld\n",count,p);
return ret;
}
编译加载,并建立/dev/adlink 节点之后,我往该节点写入数据:比如echo “hello" > /dev/adlink
在输出:adlink file_operation's write is called后,不断输出:
write 0 bytes form 0
这是为什么呢?为什么不写入呢?麻烦各位大大帮忙分析分析啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP