当前位置: 首页 > news >正文

笔记 25 - 2 :linux 驱动模块移植,创建自定义驱动(编译为模块),调整 shell 里字体大小,

(298 - a)

++

++接着解释下这个 makefile 文件


++

(298 - b)解释 makefile 的二次编译

++

(298 - c)开始执行 make ,编译,以及运行

++

++USB 挂载,跟 NFS 一样,老师教了又一种方式

++

(299)以下是一些注释

(230)


(231)

// 头文件#include<linux/fs.h>#include<linux/cdev.h>#defineLED_MAJOR500// 和 mknod 的 500 一致#defineLED_MINOR0// 设备操作集:open/read/write/releasestaticstructfile_operationsled_fops={.owner=THIS_MODULE,.open=led_open,.write=led_write,};staticint__initled_drv_init(void){// 注册字符设备,主号500,名字"led",绑定fopsintret=register_chrdev(LED_MAJOR,"led",&led_fops);if(ret<0){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");

#include<linux/fs.h>#include<linux/cdev.h>#include<linux/device.h>#include<linux/module.h>staticintmajor;staticstructcdevled_cdev;staticstructclass*led_class;staticstructdevice*led_dev;staticstructfile_operationsled_fops={.owner=THIS_MODULE,.open=led_open,.write=led_write,};staticint__initled_drv_init(void){dev_tdevno;// 1. 动态申请主次设备号(不用自己硬写500)intret=alloc_chrdev_region(&devno,0,1,"led_auto");if(ret)returnret;major=MAJOR(devno);// 2. 初始化cdev,绑定操作函数集cdev_init(&led_cdev,&led_fops);led_cdev.owner=THIS_MODULE;cdev_add(&led_cdev,devno,1);// 3. 创建设备类 /sys/class/ledled_class=class_create(THIS_MODULE,"led");if(IS_ERR(led_class)){ret=PTR_ERR(led_class);gotoerr_cdev;}// 4. 自动生成 /dev/led 节点!【重点】led_dev=device_create(led_class,NULL,devno,NULL,"led");if(IS_ERR(led_dev)){ret=PTR_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_tdevno=MKDEV(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#include<stdio.h>#include<fcntl.h>#include<unistd.h>intmain(void){intfd=open("/dev/led",O_WRONLY);if(fd<0){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 led

(232)devtmpfs 在内核态;udev 是用户态守护进程




(233)

(234)

(235)

谢谢

http://www.cnnetsun.cn/news/4068828.html

相关文章:

  • Ryujinx模拟器终极配置指南:从五分钟上手到性能拉满
  • Plain Craft Launcher 2 快速上手指南:免费开源 Minecraft 启动器的完整玩法
  • 国产大模型落地业务系统的优选载体:京微智枢信创 AI 业务支撑平台
  • iperf3 Windows版完整实测指南:8条命令测穿带宽上限,新手避坑与版本选择全解析
  • 为什么选择Llama-3.1-8B-Instruct-w4a16-asym-torchao-v0.17.0?16GB模型瘦身至5.8GB的W4A16量化方案解析
  • 单片机毕设选题推荐:基于 STM32 的雨水光照传感器数据监测与执行系统设计 基于 STM32 的步进电机模拟雨刮智能控制系统设计(013403)
  • Windows 驱动优化终极指南:AutoGpuAffinity、GoInterruptPolicy 与 MSI Utility V3 三剑客实战手册
  • AMD 显卡也能用 DLSS?OptiScaler 带你玩转显卡超采样切换
  • 装完这个免费开源的英雄联盟游戏助手,我把排队选人的时间还给了自己
  • Unity 脚本层与原生引擎层分离架构:原理、实现与工程实践
  • 智能体开发全流程:从框架选型到落地实践
  • 台州热水器壁挂炉维修-欧米到家持证师傅同城上门全家电检修维保|承诺全类故障根治|先报价再维修不加价不返工
  • MySQL表差集查询:NOT IN、LEFT JOIN、NOT EXISTS与EXCEPT性能对比与实战指南
  • 嵌入式开发必备:5款高效串口网络调试工具深度解析与实战指南
  • 铝合金氩弧焊实战指南:从氧化膜清理到熔池控制的工艺精髓
  • YOLO技术应用11-YOLO 工业质检实战:从 0 到 1 搭建汽车零件缺陷检测系统
  • D2DX宽屏补丁快速上手指南:让暗黑破坏神2在现代PC上跑出高清画面与60帧流畅体验
  • 基于Java的医院综合管理系统实现与设计
  • 排位遇到高手还是菜鸟?英雄联盟战绩查询工具 Seraphine 用3秒给你答案
  • C语言运算符深度解析:从优先级到实战避坑指南
  • JDBC从入门到连接池小白教程
  • 国产奥迪Q2定价策略与市场前景分析:豪华入门SUV新变数
  • 黑苹果EFI工具怎么选?OpCore-Simplify:15分钟一键生成EFI的免费神器
  • 洛雪音乐音源资源库完整指南:一篇文章轻松搞定免费高品质音源导入与选择
  • 自研 Geo 地域优化源码,批量构建城市分站技术思路
  • elli WebSocket 实现指南:Handover 机制让双工通信更简单的 30 分钟实战
  • PingFangSC字体免费开源:绕过中文网页跨平台排版的三道坎
  • Linux系统下R语言环境搭建与包管理全攻略
  • KMS激活工具完整实战记录:一条脚本让 Windows 和 Office 激活不再是难题
  • 呼叫中心服务商怎么选?技术能力、服务保障、合规资质3核心