树莓派高阶课程--基于框架编写驱动代码以及编译和测试

    科技2022-07-12  123

    pin4test.c

    #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> int main() { int fd; fd = open("/dev/pin4",O_RDWR); if(fd<0) { printf("open failed\n"); perror("reson:"); } else { printf("open success\n"); } fd = write(fd,'1',1); return 0; }

    pin4driver1.c 驱动代码框架

    #include <linux/fs.h> #include <linux/module.h> #include <linux/init.h> #include <linux/device.h> #include <linux/uaccess.h> #include <linux/types.h> #include <asm/io.h> static struct class *pin4_class; static struct device *pin4_class_dev; static dev_t devno; static int major = 231; static int minor = 0; static char *module_name = "pin4"; static int pin4_read(struct file *file,char __user *buf,size_t count,loff_t *ppos) { printk("pin4_read\n"); return 0; } static int pin4_open(struct inode *inode,struct file *file) { printk("pin4_open\n"); return 0; } static ssize_t pin4_write(struct file *file,const char __user *buf,size_t count,loff_t *ppos) { printk("pin4_write\n"); return 0; } static struct file_operations pin4_fops = { .owner = THIS_MODULE, .open = pin4_open, .write = pin4_write, .read = pin4_read, }; int __init pin4_drv_init(void) { int ret; devno = MKDEV(major,minor); ret = register_chrdev(major,module_name,&pin4_fops); pin4_class = class_create(THIS_MODULE,"myfirstdemo"); pin4_class_dev = device_create(pin4_class,NULL,devno,NULL,module_name); return 0; } void __exit pin4_drv_exit(void) { device_destroy(pin4_class,devno); class_destroy(pin4_class); unregister_chrdev(major,module_name); } module_init(pin4_drv_init); module_exit(pin4_drv_exit); MODULE_LICENSE("GPL v2");

    编译以及测试: 内核驱动编译: 1.把驱动代码拷贝到cd driver/char/ 2.vi Makefile 添加 :obj-m +=pin4driver1.o 修改Makefile,告诉编译器,要编译该驱动文件 3.ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules

    驱动测试步骤: 内核驱动装载:sudo insmod xxx.ko 内核驱动卸载步骤:sudo rmmod xxx 不需要写.ko,xxx是模块名 查看内核(列出驱动内核单元): lsmod 验证步骤: 1.装载驱动 2.驱动装载后生成设备,比如/dev/pin4,通过sudo chmod 666 /dev/pin4添加访问权限 3.运行测试程序调用驱动,比如./pin4test 4.内核的printk是内核层的printk,通过dmesg查看打印信息

    Processed: 0.011, SQL: 8