如何操作实现字符设备
#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)等操作"(书上写的一句话)???麻烦高手解答下,其他的问题就解决了,我的意思是不进入程序内部,来对此设备进行操作,该如何实现,谢谢~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
你也挺粗心的啊,好像应该是printf("%d\n", buf[ i ])吧,用%d主要是楼主实际上是想传一个整数值,1用%c打印不好看出来。
[ 本帖最后由 Cyberman.Wu 于 2008-8-11 12:50 编辑 ]
#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
在请教个问题,测试write这个参数的程序改怎么写?谢谢!
1. 你打印语句错了,一直在打印buf的地址。
2. 你的读操作没有校验一下返回值。
对于写测试的话确实麻烦一些,但你的测试数据很少不妨用printk打印一下然后用dmesg查看。
楼主挺粗心的,
memset(buf,0,sizeof(buf));
printf("%c\n",buf);
测试程序的问题:
#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 编辑 ]
和read函数差不多,只是你这个可能看不到什么内核的效果。
先open
然后write操作
最后close
就行了
非常感谢大家的回答!!!问题解决了
选的答案似乎也出错了,没仔细看,dreamice的答案也很好
%c,buf
%s,buf
buf定义的是字符,%d显示不出的吧