2.字符设备模板
Posted 我爱一次性
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.字符设备模板相关的知识,希望对你有一定的参考价值。
1.驱动代码
#include <linux/module.h>
#include <linux/init.h>
//纯模块
#include <linux/cdev.h>
#include <linux/fs.h>
//字符设备
static dev_t led_num;
static struct cdev led_cdev;
static int status;
static int led_open(struct inode *ip, struct file *fp)
printk("led_open status:%d\\n led_num:%d",status,led_num);
return 0; //得返回0
static int led_close (struct inode *ip, struct file *fp)
printk("led_close\\n");
return 0;
static struct file_operations led_fops=
.owner = THIS_MODULE,
.open = led_open,
.release = led_close,
;
static int __init q4_init(void)
int ret;
//led_num = MKDEV(239,0);
status = 0;
ret = alloc_chrdev_region(&led_num,0,1,"myled");
//自动分配好,如果手动的话,设备号没搞对会出现
// can‘t execute: Permission denied
if(ret < 0)
printk("register_chrdev_region \\n");
goto dev_number_error;
printk("major:%d min:%d\\n",MAJOR(led_num),MINOR(led_num));
cdev_init(&led_cdev,&led_fops);
ret = cdev_add(&led_cdev,led_num,1);
if(ret < 0)
printk("cdev_add \\n");
goto err_cdev_add;
return 0;
err_cdev_add:
cdev_del(&led_cdev);
dev_number_error:
unregister_chrdev_region(led_num,1);
return ret;
static void __exit q4_exit(void)
cdev_del(&led_cdev);
unregister_chrdev_region(led_num,1);
printk("q4_exit exit\\n");
module_init(q4_init);
module_exit(q4_exit);
MODULE_AUTHOR("oncethings");
MODULE_DESCRIPTION("q4 module ex");
MODULE_LICENSE("GPL");
注意事项:
1.手动分配设备号的话容易出现:can‘t execute: Permission denied 并不是说没有root权限,而是是设备号重复了。改成自动分配就好了
2.open函数返回0;不然会影响open时得不到fd。
2.安卓驱动
平台安卓 debug版本:
1.把module.ko 放到/data/ 目录。 其他目录可能不可操作。
2.insmod module.ko 如果出现签名问题,就得去安卓源码编辑kernel ,去掉签名认证的选项,才能insmod。
cat /proc/devices
cat /proc/modules
(这个是编译成模块在insmod才有,如果直接编译在内核没有)
3. 手动创建设备文件
ps:无论是编译在内核,还是编译成模块都需要手动创建设备文件。当然可以用自动创建函数class_create&device_create,下一章会介绍;重启后依旧得重新手动创建;设备号就看 cat /proc/devices的设备号。
mknod /dev/my_led c 215 0
mknod 设备文件 设备类型 主设备号 次设备号
chmod 777 /dev/my_led
3.测试
test.c:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc,char **argv)
//访问myled设备
printf("oncethings\\n");
int fd_led = open("/dev/my_led",O_RDWR);
printf("oncethings led_fd:%d\\n",fd_led);
if(fd_led < 0)
printf("oncethings <0\\n");
perror("open");
return -1;
else
printf("oncethings success\\n");
printf("oncethings 111111\\n");
//睡眠一会
sleep(3);
printf("oncethings 222222222\\n");
//关闭myled设备
close(fd_led);
printf("oncethings 4444444\\n");
return 0;
2.编译
只用交叉编译链 编译时用静态库 否则执行时可能会出现:No such file or directory
arm-linux-gnueabi-gcc test.c -o test -static
3.推入到data 分区并chmod 777
4.执行
以上是关于2.字符设备模板的主要内容,如果未能解决你的问题,请参考以下文章