1、注册去注册一个设备驱动
devno = MKDEV(major, minor);
result = register_chrdev_region(devno, 1, "zlytest");
unregister_chrdev_region(devno, 1);
2、编译运行在用户空间的应用程序
arm-linux-gcc moduleProgtest.c -o zlytest2
3、创建设备节点
mknod /dev/zlytest c 250 0
查看节点ls /dev -al
insmod 之后,可在/proc/devices查看设备编号
在应用程序中打开节点:
fd = open("/dev/zlytest", O_RDWR);//man 2 open查询帮助
执行open后,内核找到对应file_operations中的open过程:
4、写字符设备驱动流程
static unsigned int major = 250;
static unsigned int minor = 0;
static dev_t devno = 0;
static struct cdev t_cdev;
static int hello_open(struct inode *inode, struct file *filep)
{
printk("hello open/n");
return 0;
}
static struct file_operations hello_ops=
{
.open = hello_open,
};
static int hello_init(void)
{
printk(KERN_EMERG"hello int \n");
int result;
int error;
devno = MKDEV(major, minor);
result = register_chrdev_region(devno, 1, "zlytest");
if(result < 0)
{
printk("register fail\n");
return result;
}
cdev_init(&t_cdev, &hello_ops);
error = cdev_add(&t_cdev, devno, 1);
if(error < 0)
{
printk("cdev_add fail\n");
unregister_chrdev_region(devno, 1);
return error;
}
return 0;
}
static int hello_exit(void)
{
printk(KERN_ERR"hello exit \n");
cdev_del(&t_cdev);
unregister_chrdev_region(devno, 1);
return 0;
}