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

Linux驱动开发练习案例

1 开发目标

1.1 架构图

操作系统:基于Linux5.10.10源码和STM32MP157开发板,完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪;

驱动层:为每个外设配置DTS并且单独封装外设驱动模块。其中电压ADC测试,采用linux内核自带的stm32mp-xx驱动。

应用层:在linux环境下,通过xxx、xxx、xxx使用c语言开发一款WebServer,对内访问驱动获取数据或遥控硬件,向外部用户提供restful api访问接口;

1.2 驱动层功能

序号驱动名称挂载设备技术点备注
1wd_drv/dev/wd_drvi2c总线模型同一总线不同地址
2light_drv/dev/light_drvi2c总线模型
3led_drv/dev/led_drvplatform模型
4dd_drv/dev/dd_drvspi总线模型
5key_drv/dev/key_drvio信号驱动

阻塞式IO获取中断事件;

根据不同按钮事件开关不同的led灯

6电压测量

/sys/bus/iio/devices/iio:device0

/in_voltage1_raw

adc数据采集

1.3 应用层功能

序号名称apiapi描述
1led1控制xx.xx.xx.xx:8080/api/led1

{"value":true}  value的值控制灯的亮/灭

2led2控制xx.xx.xx.xx:8080/api/led2{"value":false}
3数显管控制  xx.xx.xx.xx:8080/api/dd_show

{"value":"0-温度"}  显示温度,2位小数

{"value":"1-湿度"}  显示湿度,2位小数

{"value":"2-光照"}  显示光照,整数

{"value":"3-电压值"}  显示电压值,整数,单位mV

4获取测量值xx.xx.xx.xx:8080/api/state

返回值:

{

    "voltage": 95.9244,  //电压值,单位mV

    "light": 83,         //光照强度

    "sd": 54.8788,        //湿度

    "wd": 24.7079        //温度

}

2 效果展示(部分)

2.1 webserver的界面效果

PS:并非通过html/css写的,而是通过mongoose官网编辑器生成: Mongoose官网

2.2 驱动模块安装列表

2.3 控制效果展示

(1)在web上,通过点击LED1或LED2的Toggle组件,可以实时控制LED亮灭

(2)在web上,通过下拉框,可以选择当前数显管显示什么内容(例如:温度和电压)

2.4 postman测试restful-api接口(部分)

3  源码

源码地址

iot_drivers:  驱动源码(见git)

webserver:  webserver源码(见git)

linux设备树配置(部分):

/ {
	myled{  //led设备树
		compatible = "zr,myled";
		led-gpios = <&gpioe 10 0>,<&gpiof 10 0>,<&gpioe 8 0>;
	};

    mykey{  //按键设备树
		interrupt-parent = <&gpiof>;
		interrupts=<9 0>,<7 0>,<8 0>;
	};

};

//基于I2C总线的 温度度传感器树 和 光照传感器设备树
&i2c1{
	pinctrl-names = "default", "sleep";//指定管脚复用的两种不同模式
    pinctrl-0 = <&i2c1_pins_b>;//设置默认模式下的管脚复用
    pinctrl-1 = <&i2c1_sleep_pins_b>;
    i2c-scl-rising-time-ns = <100>;//设置时钟线上升沿的时间
    i2c-scl-falling-time-ns = <7>;
    status = "okay";//状态设置为OKAY
    /delete-property/dmas;  //删除无用的属性
    /delete-property/dma-names;
   	mywd@40{
    	compatible="zr,mywd";
    	reg=<0X40>;
   };

	mylight@1e{
		compatible="zr,mylight";
		reg=<0x1e>;
	};
};

//基于spi总线的 数显管设备树
&spi4{
    pinctrl-names="default","sleep";
    pinctrl-0=<&spi4_pins_b>;
    pinctrl-1=<&spi4_sleep_pins_b>;
    //添加对片选线管脚的描述
    cs-gpios=<&gpioe 11 0>;
    status="okay";
    mydd@0{
        compatible="zr,mydd";
        spi-max-frequency = <10000000>;//设置当前spi工作的最大频率为10M
        reg=<0>;    
    };
};

//基于iio的电压采集设备树
&adc {
	vdd-supply = <&vdd>;
	vdda-supply = <&vdd>;
	vref-supply = <&vdd>;
	status = "okay";
	adc1: adc@0 {
		st,adc-channels = <0 1>;
		st,min-sample-time-nsecs = <10000>;
		status = "okay";
	};
};

4、待探索问题

(1)基于webserver的websocket的实现

(2)pwm、dma、定时器的输入捕获中断驱动的编写

(3)ADC驱动手动编写

http://www.dtcms.com/a/111880.html

相关文章:

  • 三、Jenkinsfile 的使用
  • 数字人代言人如何提升品牌信任度?
  • [C/C++]文件输入输出
  • 【YOLO系列(V5-V12)通用数据集-电梯内电动车检测数据集】
  • Temu物流成本或上涨?南非海关140项减免取消倒计时
  • 明清两朝全方位对比
  • 计算机视觉算法实战——基于YOLOv8的汽车试验场积水路段识别系统
  • SpringMVC+Spring+MyBatis知识点
  • Buildroot与Yocto介绍比对
  • 【MySQL】常用SQL--持续更新ing
  • Linux make与makefile 项目自动化构建工具
  • 26考研——排序(8)
  • 每日算法-250404
  • 南京大学与阿里云联合启动人工智能人才培养合作计划,已将通义灵码引入软件学院课程体系
  • Swift LeetCode 246 题解:中心对称数(Strobogrammatic Number)
  • Maven的下载配置及在Idea中的配置
  • 【云计算互联网络】 专线、VPN与云网关技术对比
  • Vue2 组件创建与使用
  • TDengine 中的视图
  • Spring Boot 可扩展脱敏框架设计全解析 | 注解+策略模式+模板方法模式实战
  • Python Requests 库终极指南
  • Redis-13.在Java中操作Redis-Spring Data Redis使用方式-操作哈希类型的数据
  • 免费内网穿透方法
  • LocaDate、LocalTime、LocalDateTime
  • 如何设计好一张表
  • LLM 性能优化有哪些手段?
  • 软件工程面试题(二十七)
  • 硬件电路(23)-输入隔离高低电平有效切换电路
  • MYOJ_4342:(洛谷P1087)[NOIP 2004 普及组] FBI 树(二叉树实操,递归提高)
  • SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案