「正點原子FPGA連載」第二十五章設備樹下的LED驅動實驗

2020-09-15 正點原子

1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南

2)實驗平臺:正點原子領航者ZYNQ開發板
3)平臺購買地址:https://item.taobao.com/item.htm?&id=606160108761
4)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html
5)對正點原子FPGA感興趣的同學可以加群討論:876744900
6)關注正點原子公眾號,獲取最新資料

第二十五章設備樹下的LED驅動實驗


上一章我們詳細的講解了設備樹語法以及在驅動開發中常用的OF函數,本章我們就開始第一個基於設備樹的Linux驅動實驗。本章在第二十三章實驗的基礎上完成,只是將其驅動開發改為設備樹形式而已。
25.1設備樹LED驅動原理
在《第二十三章 新字符設備驅動實驗》中,我們直接在驅動文件newchrled.c中定義有關寄存器物理地址,然後使用io_remap函數進行內存映射,得到對應的虛擬地址,最後操作寄存器對應的虛擬地址完成對GPIO的初始化。本章我們在第二十三章實驗基礎上完成,本章我們使用設備樹來向Linux內核傳遞相關的寄存器物理地址,Linux驅動文件使用上一章講解的OF函數從設備樹中獲取所需的屬性值,然後使用獲取到的屬性值來初始化相關的IO。本章實驗還是比較簡單的,本章實驗重點內容如下:
①在system-top.dts文件中創建相應的設備節點。
②編寫驅動程序(在第二十三章實驗基礎上完成),獲取設備樹中的相關屬性值。
③使用獲取到的有關屬性值來初始化LED所使用的GPIO以及初始狀態。
25.2硬體原理圖分析
本章實驗硬體原理圖參考33.3小節即可。
25.3實驗程序編寫
本實驗對應的例程路徑為:ZYNQ開發板光碟資料(A盤)\4_SourceCode\ZYNQ_7010\3_Embedded_Linux\Linux驅動例程\4_dtsled。
本章實驗在第二十三章實驗的基礎上完成,重點是將驅動改為基於設備樹形式。
25.3.1修改設備樹文件
打開linux內核源碼目錄下的arch/arm/boot/dts/system-top.dts文件,在根節點「/」下創建一個名為「led」的子節點,led節點內容如下所示:
示例代碼25.3.1.1 led節點

  1. ......
  2. 8 /dts-v1/;
  3. 9 34;zynq-7000.dtsi&include &34;
  4. 11 34;pcw.dtsi&34;Alientek ZYNQ Development Board&34;console=ttyPS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait&34;serial0:115200n8&34;memory&34;alientek,led&34;okay&34;on&34;www.openedv.com&34;_blank&include <linux/types.h>
  5. 13 include <linux/delay.h>
  6. 15 include <linux/init.h>
  7. 17 include <linux/errno.h>
  8. 19 include <asm/mach/map.h>
  9. 21 include <asm/io.h>
  10. 23 include <linux/of.h>
  11. 25 define DTSLED_CNT 1 /* 設備號個數 */
  12. 28 34;dtsled&34;kernel write failed!\r\n&34;/led&34;led node can not found!\r\n&34;status&34;okay&34;compatible&34;alientek,led&34;led device matching successful!\r\n&34;default-state&34;on&34;dtsled major=%d,minor=%d\r\n&34;DengTao <<a href=&34;>773904075@qq.com</a>>&34;Alientek ZYNQ GPIO LED Driver&34;GPL");



dtsled.c文件中的內容和第二十三章的newchrled.c文件中的內容基本一樣,只是dtsled.c中包含了處理設備樹的代碼,我們重點來看一下這部分代碼。
第45行,在設備結構體dtsled_dev中添加了成員變量nd,nd是device_node結構體類型指針,表示設備節點。如果我們要讀取設備樹某個節點的屬性值,首先要先得到這個節點,一般在設備結構體中添加device_node指針變量來存放這個節點。
第118~125行,通過使用of_iomap函數替換之前使用ioremap函數來實現物理地址到虛擬地址的映射,它能夠直接解析給定節點的reg屬性,並將reg屬性中存放的物理地址和長度進行映射,使用不同的下標依次對reg數組中記錄的不同組「物理地址-長度」地址空間進行映射,非常的方便!
第152~156行,通過of_find_node_by_path函數獲取設備樹根節點下的led節點,這裡我們用的是絕對路徑「/led」,因為led節點就在根節點「/」下;只有獲取成功了才會進行下面的步驟!
第159~163行,通過of_property_read_string函數獲取led節點的「status」屬性的內容,當節點中定義了「status」屬性,並且值為「okay」時表示設備是可用的,才會進行下面的操作;如果沒有定義「status」屬性則默認設備樹可用的。
第166~173行,通過of_property_read_string函數獲取led節點的「compatible」屬性的內容,如果節點中沒有定義這個屬性(也就是獲取失敗),則表示這個節點不支持我們的驅動直接退出;如果獲取成功了,則使用strcmp函數進行比較,看是否等於「alientek,led」,如果相同則表示匹配成功,可以接著進行下面的步驟了。
第176行,調用自定義的led_ioremap函數進行物理地址到虛擬地址的映射。
第200~209行,通過of_property_read_string函數獲取led節點的「default-state」屬性的內容,根據讀取到的內容來設置LED燈的初始狀態。
那麼其他的內容前面都已經講過了,沒什麼好說的了,本身驅動也非常的簡單。
25.3.3編寫測試APP
本章直接使用第二十三章的測試APP,將第二十三章實驗工程目錄下的ledApp.c源文件和ledApp可執行文件一併複製到本章實驗工程下即可,這樣就不用再去編譯ledApp.c了。
25.4運行測試
25.4.1編譯驅動程序和測試APP
1、編譯驅動程序
編寫Makefile文件,本章實驗的Makefile文件和第二十三章實驗基本一樣,我們直接將第二十三章實驗目錄下的Makefile文件拷貝到本實驗目錄中,修改Makefile文件,只是將obj-m變量的值改為dtsled.o,Makefile內容如下所示:
示例代碼25.4.1.1 Makefile文件

  1. 1 KERN_DIR := /home/zynq/linux/kernel/linux-xlnx-xilinx-v2018.3
  2. 2
  3. 3 obj-m := dtsled.o
  4. 4
  5. 5 all:
  6. 6 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERN_DIR) M=`pwd` modules
  7. 7
  8. 8 clean:
  9. 9 make -C $(KERN_DIR) M=`pwd` clean


第3行,設置obj-m變量的值為dtsled.o。
輸入如下命令編譯出驅動模塊文件:

  1. make



編譯成功以後就會生成一個名為「dtsled.ko」的驅動模塊文件,如下所示:


圖 36.4.1 編譯驅動模塊


2、編譯測試APP
直接使用第二十三章編譯好的可執行文件ledApp。
25.4.2運行測試
將上編譯出來的dtsled.ko和ledApp這兩個文件拷貝到開發板根文件系統/lib/modules/4.14.0-xilinx目錄中,重啟開發板,進入到/lib/modules/4.14.0-xilinx目錄,輸入如下命令加載dtsled.ko驅動模塊:

  1. depmod //第一次加載驅動的時候需要運行此命令
  2. modprobe dtsled.ko //加載驅動



驅動加載成功以後會在終端中輸出一些信息,如下圖所示:


圖 36.4.2 加載驅動


從圖 36.4.2可以看出,led驅動已經和led設備節點匹配成功了!並且開發板上的PS_LED0被點亮了,因為我們在設備樹中將led節點的「default-state」屬性的值設置為「on」,所以初始化LED的時候會將其點亮。
驅動加載成功以後就可以使用ledApp軟體來測試驅動是否工作正常,輸入如下命令打開LED燈:

  1. ./ledApp /dev/dtsled 0 //關閉LED等



輸入上述命令以後查看開發板上的PS_LED0燈是否熄滅,如果熄滅的話說明驅動工作正常。在輸入如下命令點亮燈:

  1. ./ledApp /dev/dtsled 1 //點亮LED燈



輸入上述命令以後查看開發板上的PS_LED0燈是否被點亮。如果要卸載驅動的話輸入如下命令即可:

  1. rmmod dtsled.ko

相關焦點

  • 「正點原子FPGA連載」第二十七章子系統下的LED驅動實驗
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第二十七章gpio子系統下的驅動實驗
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第二十三章新字符設備驅動實驗
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第二十八章Linux蜂鳴器驅動實驗
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第二十二章Linux LED驅動開發
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第三十章Linux並發與競爭實驗
    &id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第八章Linux基礎外設的使用
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第三章按鍵控制LED實驗
    1)摘自【正點原子】領航者ZYNQ之HLS 開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)正點原子資料更新和新品發布,請加正點原子公眾號:正點原子關注方法:微信→添加好友→公眾號→輸入:正點原子
  • 「正點原子FPGA連載」第三十一章Linux按鍵輸入實驗
    1)摘自【正點原子】領航者 ZYNQ 之Linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第二十六章gpio子系統簡介
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第九章Linux顯示設備的使用
    1)摘自【正點原子】領航者 ZYNQ 之Linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第二章LED閃爍實驗
    1)摘自【正點原子】領航者ZYNQ之HLS 開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)正點原子資料更新和新品發布,請加正點原子公眾號:正點原子關注方法:微信→添加好友→公眾號→輸入:正點原子
  • 「正點原子FPGA連載」第四章呼吸燈實驗
    1)摘自【正點原子】領航者ZYNQ之HLS 開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)正點原子資料更新和新品發布,請加正點原子公眾號:正點原子關注方法:微信→添加好友→公眾號→輸入:正點原子
  • 「正點原子FPGA連載」第二十四章Linux設備樹(一)
    1)摘自【正點原子】領航者 ZYNQ 之Linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第三十二章Linux內核定時器實驗
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第三章AXI GPIO控制LED實驗
    1)實驗平臺:正點原子達文西FPGA開發板/docs/boards/fpga/zdyz_dafenqi.html5) 正點原子官方B站:https嵌入式微處理器通常用GPIO控制這些設備,本次實驗我們將通過AXI GPIO進行LED流水燈實驗。
  • 「正點原子FPGA連載」第二十四章Linux設備樹(二)
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第二十一章字符設備驅動開發
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第六章自定義IP核-呼吸燈實驗
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料
  • 「正點原子FPGA連載」第十八章Linux內核移植
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?&id=6061601087614)全套實驗源碼+手冊+視頻下載:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)對正點原子FPGA感興趣的同學可以加群討論:8767449006)關注正點原子公眾號,獲取最新資料