Chinaunix

标题: 如何操作实现字符设备 [打印本页]

作者: yyykkk1229    时间: 2008-08-09 10:11
标题: 如何操作实现字符设备
#define __NO_VERSION__

#include <linux/module.h>
#include <linux/config.h>
#include <linux/version.h>

#include <asm/uaccess.h>

#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <asm/segment.h>

unsigned int test_major = 0;

static ssize_t read_test(struct file *file,char *buf,size_t count,loff_t *f_pos)

{ int left;

if (verify_area(VERIFY_WRITE,buf,count) == -EFAULT )
return -EFAULT;

for(left = count ; left > 0 ; left--)
{
__put_user(1,buf);
buf++;
}

return count;
}


static ssize_t write_test(struct file *file, const char *buf, size_t count, loff_t *f_pos)
{
return count;
}

static int open_test(struct inode *inode,struct file *file )

{
MOD_INC_USE_COUNT;
return 0;
}

static int release_test(struct inode *inode,struct file *file )
{
MOD_DEC_USE_COUNT;
return 0;
}


struct file_operations test_fops = {
read:read_test,
write:write_test,
open: open_test,
release:release_test
};

int init_module(void)
{
int result;
result = register_chrdev(0, "test", &test_fops);
if (result < 0) {
printk(KERN_INFO "test: can't get major number\n");
return result;

}

if (test_major == 0) test_major = result; /* dynamic */

return 0;

}


void cleanup_module(void)

{

unregister_chrdev(test_major, "test");

}
还是老问题,呵呵,这样一个字符设备的驱动程序,已经加载到内核模块中,通过什么操作"用户可以像处理普通文件一样,对硬件设备进行打开(open)、关闭(close)、读写(read/write)等操作"(书上写的一句话)???麻烦高手解答下,其他的问题就解决了,我的意思是不进入程序内部,来对此设备进行操作,该如何实现,谢谢~
作者: Cyberman.Wu    时间: 2008-08-09 10:11
标题: 回复 #6 dreamice 的帖子
你也挺粗心的啊,好像应该是printf("%d\n", buf[ i ])吧,用%d主要是楼主实际上是想传一个整数值,1用%c打印不好看出来。

[ 本帖最后由 Cyberman.Wu 于 2008-8-11 12:50 编辑 ]
作者: yyykkk1229    时间: 2008-08-09 10:37
#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

main()

{

int testdev;

int i;

char buf[10];

testdev = open("/dev/test",O_RDWR);

if ( testdev == -1 )

{

printf("Cann't open file \n");

exit(0);

}

read(testdev,buf,10);

for (i = 0; i < 10;i++)

printf("%d\n",buf);

close(testdev);

}
测试程序,无奈了,输出的不是1
全是-1073746064
作者: yyykkk1229    时间: 2008-08-09 11:32
在请教个问题,测试write这个参数的程序改怎么写?谢谢!
作者: Cyberman.Wu    时间: 2008-08-09 16:14
1. 你打印语句错了,一直在打印buf的地址。
2. 你的读操作没有校验一下返回值。

对于写测试的话确实麻烦一些,但你的测试数据很少不妨用printk打印一下然后用dmesg查看。
作者: tudouren    时间: 2008-08-10 14:37
楼主挺粗心的,
memset(buf,0,sizeof(buf));

printf("%c\n",buf);
作者: dreamice    时间: 2008-08-11 10:05
标题: 回复 #2 yyykkk1229 的帖子
测试程序的问题:

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

main()

{

int testdev;

int i;

char buf[10];

testdev = open("/dev/test",O_RDWR);

if ( testdev == -1 )

{

printf("Cann't open file \n");

exit(0);

}

memset(buf, 0, 10);
read(testdev,buf,10);

for (i = 0; i < 10;i++) {

printf("%c\n",*buf);
buf++;
}

close(testdev);

}

[ 本帖最后由 dreamice 于 2008-8-11 13:12 编辑 ]
作者: dreamice    时间: 2008-08-11 10:11
原帖由 yyykkk1229 于 2008-8-9 11:32 发表
在请教个问题,测试write这个参数的程序改怎么写?谢谢!


和read函数差不多,只是你这个可能看不到什么内核的效果。

先open
然后write操作
最后close
就行了
作者: yyykkk1229    时间: 2008-08-11 15:12
非常感谢大家的回答!!!问题解决了
作者: yyykkk1229    时间: 2008-08-11 15:15
选的答案似乎也出错了,没仔细看,dreamice的答案也很好
%c,buf
%s,buf
buf定义的是字符,%d显示不出的吧




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2