,调整 shell 里字体大小,)
298 - a接着解释下这个 makefile 文件298 - b解释 makefile 的二次编译298 - c开始执行 make 编译以及运行USB 挂载跟 NFS 一样老师教了又一种方式299以下是一些注释230231// 头文件#includelinux/fs.h#includelinux/cdev.h#defineLED_MAJOR500// 和 mknod 的 500 一致#defineLED_MINOR0// 设备操作集open/read/write/releasestaticstructfile_operationsled_fops{.ownerTHIS_MODULE,.openled_open,.writeled_write,};staticint__initled_drv_init(void){// 注册字符设备主号500名字led绑定fopsintretregister_chrdev(LED_MAJOR,led,led_fops);if(ret0){pr_err(register_chrdev fail\n);returnret;}pr_info(led drv register ok, major%d\n,LED_MAJOR);return0;}staticvoid__exitled_drv_exit(void){unregister_chrdev(LED_MAJOR,led);}module_init(led_drv_init);module_exit(led_drv_exit);MODULE_LICENSE(GPL);#includelinux/fs.h#includelinux/cdev.h#includelinux/device.h#includelinux/module.hstaticintmajor;staticstructcdevled_cdev;staticstructclass*led_class;staticstructdevice*led_dev;staticstructfile_operationsled_fops{.ownerTHIS_MODULE,.openled_open,.writeled_write,};staticint__initled_drv_init(void){dev_tdevno;// 1. 动态申请主次设备号不用自己硬写500intretalloc_chrdev_region(devno,0,1,led_auto);if(ret)returnret;majorMAJOR(devno);// 2. 初始化cdev绑定操作函数集cdev_init(led_cdev,led_fops);led_cdev.ownerTHIS_MODULE;cdev_add(led_cdev,devno,1);// 3. 创建设备类 /sys/class/ledled_classclass_create(THIS_MODULE,led);if(IS_ERR(led_class)){retPTR_ERR(led_class);gotoerr_cdev;}// 4. 自动生成 /dev/led 节点【重点】led_devdevice_create(led_class,NULL,devno,NULL,led);if(IS_ERR(led_dev)){retPTR_ERR(led_dev);gotoerr_class;}pr_info(auto create /dev/led, major%d minor%d\n,major,MINOR(devno));return0;err_class:class_destroy(led_class);err_cdev:cdev_del(led_cdev);unregister_chrdev_region(devno,1);returnret;}staticvoid__exitled_drv_exit(void){dev_tdevnoMKDEV(major,0);device_destroy(led_class,devno);class_destroy(led_class);cdev_del(led_cdev);unregister_chrdev_region(devno,1);}module_init(led_drv_init);module_exit(led_drv_exit);MODULE_LICENSE(GPL); 四、用户态测试代码极简示例配套上面驱动 // test_led.c#includestdio.h#includefcntl.h#includeunistd.hintmain(void){intfdopen(/dev/led,O_WRONLY);if(fd0){perror(open /dev/led);return-1;}write(fd,1,1);// 传给驱动write点亮LEDclose(fd);return0;}五、实操命令汇总# 加载驱动insmod led.ko# 查看字符设备cat/proc/devices# 看/dev/led信息ls-l/dev/led# 卸载rmmod led232devtmpfs 在内核态udev 是用户态守护进程233234235谢谢