日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

嵌入式 Linux LED 驱动开发实验

發布時間:2023/12/20 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式 Linux LED 驱动开发实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

41.1 Linux 下 LED 燈驅動原理

Linux 下的任何外設驅動,最終都是要配置相應的硬件寄存器。所以本章的 LED 燈驅動最 終也是對 I.MX6ULL 的 IO 口進行配置,與裸機實驗不同的是,在 Linux 下編寫驅動要符合 Linux 的驅動框架。 41.1.1 地址映射 在編寫驅動之前,我們需要先簡單了解一下 MMU 這個神器, MMU 全稱叫做 Memory Manage Unit,也就是內存管理單元。在老版本的 Linux 中要求處理器必須有 MMU,但是現在 Linux 內核已經支持無 MMU 的處理器了。 MMU 主要完成的功能如下: ①、完成虛擬空間到物理空間的映射。 ②、內存保護,設置存儲器的訪問權限,設置虛擬存儲空間的緩沖特性。 我們重點來看一下第①點,也就是虛擬空間到物理空間的映射,也叫做地址映射。首先了 解兩個地址概念:虛擬地址(VA,Virtual Address)、物理地址(PA, Physcical Address)。對于 32 位 的處理器來說,虛擬地址范圍是 2^32=4GB,我們的開發板上有 512MB 的 DDR3,這 512MB 的 內存就是物理內存,經過 MMU 可以將其映射到整個 4GB 的虛擬空間。 物理內存只有 512MB,虛擬內存有 4GB,那么肯定存在多個虛擬地址映射到同一個物理地 址上去,虛擬地址范圍比物理地址范圍大的問題處理器自會處理,這里我們不要去深究,因為 MMU 是很復雜的一個東西。 Linux 內核啟動的時候會初始化 MMU,設置好內存映射,設置好以后 CPU 訪問的都是虛 擬 地 址 。 比 如 I.MX6ULL 的 GPIO1_IO03 引 腳 的 復 用 寄 存 器 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 的地址為 0X020E0068。如果沒有開啟 MMU 的話 直接向 0X020E0068 這個寄存器地址寫入數據就可以配置 GPIO1_IO03 的復用功能。現在開啟 了 MMU,并且設置了內存映射,因此就不能直接向 0X020E0068 這個地址寫入數據了。我們必 須得到 0X020E0068 這個物理地址在 Linux 系統里面對應的虛擬地址,這里就涉及到了物理內 存和虛擬內存之間的轉換,需要用到兩個函數: ioremap 和 iounmap。 1、 ioremap 函數 ioremap 函 數 用 于 獲 取 指 定 物 理 地 址 空 間 對 應 的 虛 擬 地 址 空 間 , 定 義 在 arch/arm/include/asm/io.h 文件中,定義如下: 示例代碼 41.1.1.1 ioremap 函數 1 #define ioremap(cookie,size) __arm_ioremap((cookie), (size),MT_DEVICE) 2 void __iomem * __arm_ioremap(phys_addr_t phys_addr, size_t size,unsigned int mtype) 4 {5 return arch_ioremap_caller(phys_addr, size, mtype,__builtin_return_address(0)); 6 } ioremap 是個宏,有兩個參數: cookie 和 size,真正起作用的是函數__arm_ioremap,此函 數有三個參數和一個返回值,這些參數和返回值的含義如下: phys_addr:要映射給的物理起始地址。 size:要映射的內存空間大小。 mtype: ioremap 的類型,可以選擇 MT_DEVICE、 MT_DEVICE_NONSHARED、 MT_DEVICE_CACHED 和 MT_DEVICE_WC, ioremap 函數選擇 MT_DEVICE。 返回值: __iomem 類型的指針,指向映射后的虛擬空間首地址。 假如我們要獲取 I.MX6ULL 的 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器對應 的虛擬地址,使用如下代碼即可: #define SW_MUX_GPIO1_IO03_BASE (0X020E0068) static void __iomem* SW_MUX_GPIO1_IO03; SW_MUX_GPIO1_IO03 = ioremap(SW_MUX_GPIO1_IO03_BASE, 4); 宏 SW_MUX_GPIO1_IO03_BASE 是寄存器物理地址, SW_MUX_GPIO1_IO03 是映射后 的虛擬地址。對于 I.MX6ULL 來說一個寄存器是 4 字節(32)的,因此映射的內存長度為 4。 映射完成以后直接對 SW_MUX_GPIO1_IO03 進行讀寫操作即可。2、 iounmap 函數 卸載驅動的時候需要使用 iounmap 函數釋放掉 ioremap 函數所做的映射, iounmap 函數原 型如下: 示例代碼 41.1.1.2 iounmap 函數原型 void iounmap (volatile void __iomem *addr) iounmap 只有一個參數 addr,此參數就是要取消映射的虛擬地址空間首地址。假如我們現 在要取消掉 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器的地址映射,使用如下代碼 即可: iounmap(SW_MUX_GPIO1_IO03);41.1.2 I/O 內存訪問函數 這里說的 I/O 是輸入/輸出的意思,并不是我們學習單片機的時候講的 GPIO 引腳。這里涉 及到兩個概念: I/O 端口和 I/O 內存。當外部寄存器或內存映射到 IO 空間時,稱為 I/O 端口。 當外部寄存器或內存映射到內存空間時,稱為 I/O 內存。但是對于 ARM 來說沒有 I/O 空間這個 概念,因此 ARM 體系下只有 I/O 內存(可以直接理解為內存)。使用 ioremap 函數將寄存器的物 理地址映射到虛擬地址以后,我們就可以直接通過指針訪問這些地址,但是 Linux 內核不建議 這么做,而是推薦使用一組操作函數來對映射后的內存進行讀寫操作。 1、讀操作函數 讀操作函數有如下幾個: 示例代碼 41.1.2.1 讀操作函數 1 u8 readb(const volatile void __iomem *addr) 2 u16 readw(const volatile void __iomem *addr) 3 u32 readl(const volatile void __iomem *addr) readb、 readw 和 readl 這三個函數分別對應 8bit、 16bit 和 32bit 讀操作,參數 addr 就是要 讀取寫內存地址,返回值就是讀取到的數據。 2、寫操作函數 寫操作函數有如下幾個: 示例代碼 41.1.2.2 寫操作函數 1 void writeb(u8 value, volatile void __iomem *addr) 2 void writew(u16 value, volatile void __iomem *addr) 3 void writel(u32 value, volatile void __iomem *addr) writeb、 writew 和 writel 這三個函數分別對應 8bit、 16bit 和 32bit 寫操作,參數 value 是要 寫入的數值, addr 是要寫入的地址。

41.3 實驗程序編寫

本實驗對應的例程路徑為: 開發板光盤-> 2、 Linux 驅動例程-> 2_led。 示例代碼 41.3.1.1 led.c 驅動文件代碼 第 94~114 行, led_write 函數,實現對 LED 燈的開關操作,當應用程序調用 write 函數向 led 設備寫數據的時候此函數就會執行。首先通過函數 copy_from_user 獲取應用程序發送過來 的操作信息(打開還是關閉 LED),最后根據應用程序的操作信息來打開或關閉 LED 燈。 第 140~185 行,驅動入口函數 led_init,此函數實現了 LED 的初始化工作, 147~151 行通過 ioremap 函數獲取物理寄存器地址映射后的虛擬地址,得到寄存器對應的虛擬地址以后就可以 完成相關初始化工作了。比如是能 GPIO1 時鐘、設置 GPIO1_IO03 復用功能、配置 GPIO1_IO03 的屬性等等。最后,最重要的一步!使用 register_chrdev 函數注冊 led 這個字符設備。 第 192~202 行,驅動出口函數 led_exit,首先使用函數 iounmap 取消內存映射,最后使用函 數 unregister_chrdev 注銷 led 這個字符設備。 第 205~206 行,使用 module_init 和 module_exit 這兩個函數指定 led 設備驅動加載和卸載 函數。 第 207~208 行,添加 LICENSE 和作者信息。41.3.2 編寫測試 APP 編寫測試 APP, led 驅動加載成功以后手動創建/dev/led 節點,應用 APP 通過操作/dev/led 文件來完成對 LED 設備的控制。向/dev/led 文件寫 0 表示關閉 LED 燈,寫 1 表示打開 LED 燈。 新建 ledApp.c 文件

41.4 運行測試

41.4.1 編譯驅動程序和測試 APP 1、編譯驅動程序 編寫 Makefile 文件,本章實驗的 Makefile 文件和第四十章實驗基本一樣,只是將 obj-m 變 量的值改為 led.o 輸入如下命令編譯出驅動模塊文件: make -j32 編譯成功以后就會生成一個名為“ led.ko”的驅動模塊文件。 2、編譯測試 APP 輸入如下命令編譯測試 ledApp.c 這個測試程序: arm-linux-gnueabihf-gcc ledApp.c -o ledApp41.4.2 運行測試 將上一小節編譯出來的 led.ko和 ledApp這兩個文件拷貝到 rootfs/lib/modules/4.1.15 目錄中, 重啟開發板,進入到目錄 lib/modules/4.1.15 中,輸入如下命令加載 led.ko 驅動模塊: depmod //第一次加載驅動的時候需要運行此命令 modprobe led.ko //加載驅動 驅動加載成功以后創建“ /dev/led”設備節點,命令如下: mknod /dev/led c 200 0 驅動節點創建成功以后就可以使用 ledApp 軟件來測試驅動是否工作正常,輸入如下命令打 開 LED 燈: ./ledApp /dev/led 1 //打開 LED 燈 在輸入如下命令關閉 LED 燈: ./ledApp /dev/led 0 //關閉 LED 燈 如果要卸載驅動的話輸入如下命令即可: rmmod led.ko

參考文獻

【正點原子】I.MX6U嵌入式Linux驅動開發指南V1.3.pdf

總結

以上是生活随笔為你收集整理的嵌入式 Linux LED 驱动开发实验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本爽爽爽爽爽爽在线观看免 | 国产一区二区不卡视频 | 人妻久久一区二区 | 日韩一及片 | 日韩毛片中文字幕 | 日韩在线视频一区二区三区 | 啪啪小视频网站 | www.国产视频.com | 日本一二三区视频在线 | 热热色国产 | 暖暖视频日本 | 久久国产乱子伦精品 | 国产cao| 做爰视频毛片视频 | 69xx网站| 国产传媒一区二区三区 | 最新av网站在线观看 | 亚洲不卡在线 | 国产成人精品视频 | av福利院| jizz日本在线 | 亚洲成熟女性毛茸茸 | 欧美美女黄色 | 在线观看精品国产 | av电影在线观看网址 | 欧美一区二区三区精品 | 日韩在线观看不卡 | 超碰97在线人人 | 一本色道综合久久欧美日韩精品 | 日韩专区一区二区三区 | 四虎影视永久免费 | 亚洲人在线视频 | 日韩三级国产精品 | 成人av中文字幕 | 欧美干干干 | 久久影院一区二区 | 欧美三级免费看 | 国产一区二区自拍视频 | 欧美激情一二三 | 影音先锋中文字幕资源 | 免费久久久久 | 国产一区二区三区视频免费观看 | 欧美一级一区二区三区 | 激情六月| 成人精品福利视频 | 国产高清无密码一区二区三区 | 国产精品传媒 | 一级h片 | 狠狠亚洲 | 四虎在线视频免费观看 | 欧美黄视频 | www.九九九 | 亚洲九九夜夜 | 特大黑人巨交性xxxx | 一区二区三区在线视频播放 | 成人午夜视频免费看 | 成人午夜性视频 | h视频免费在线观看 | 天堂综合网| 亚洲色图网站 | 国内精品久久久久久久久 | 在线观看国产福利 | 女优中文字幕 | 欧美极品在线播放 | 成人毛片网 | www.蜜臀av.com| 婷婷在线免费视频 | 国产91香蕉 | 欧美激情视频在线播放 | 性猛交xxxx乱大交孕妇2十 | 在线观看亚洲成人 | xxxx69视频| 麻豆视频成人 | av天天色| 国产精品中文无码 | 老色鬼av| 在线观看成人免费 | 精品国产av无码一区二区三区 | 国产在线一二三区 | 午夜在线一区二区三区 | 亚洲精品久久久蜜桃 | 日日夜夜2017 | 在线亚洲免费 | 国产同性人妖ts口直男 | 中国女人做爰视频 | 一区二区三区免费视频观看 | 影音先锋中文字幕在线播放 | 久久精品久久久久 | 亚洲永久免费av | h视频免费在线观看 | 婷婷国产在线 | 欧美精品免费一区二区三区 | 国产一区二区视频在线观看 | av在线黄色 | 一级特黄肉体裸片 | 日本不卡一区二区三区视频 | 久久精品国产免费 | 女生脱裤子让男生捅 | 日本大胆欧美人术艺术 |