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 驅動層功能
序號 | 驅動名稱 | 掛載設備 | 技術點 | 備注 |
1 | wd_drv | /dev/wd_drv | i2c總線模型 | 同一總線不同地址 |
2 | light_drv | /dev/light_drv | i2c總線模型 | |
3 | led_drv | /dev/led_drv | platform模型 | |
4 | dd_drv | /dev/dd_drv | spi總線模型 | |
5 | key_drv | /dev/key_drv | io信號驅動 | 阻塞式IO獲取中斷事件; 根據不同按鈕事件開關不同的led燈 |
6 | 電壓測量 | /sys/bus/iio/devices/iio:device0 /in_voltage1_raw | adc數據采集 |
1.3 應用層功能
序號 | 名稱 | api | api描述 |
1 | led1控制 | xx.xx.xx.xx:8080/api/led1 | {"value":true}? value的值控制燈的亮/滅 |
2 | led2控制 | 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工作的最大頻率為10Mreg=<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驅動手動編寫