嵌入式linux驅動開發 點燈大師(舊版)

2021-10-25 00:24:49 字數 3275 閱讀 6109

實驗程式編寫

執行測試

本章開始編寫第乙個真正的 linux 字元裝置驅動。

led 燈驅動最終也是對 i.mx6ull 的 io 口進行配置,並配置相應的硬體暫存器,與裸機實驗不同的是,在 linux 下編寫驅動要符合 linux的驅動框架

mmu 全稱叫做 memorymanage unit,也就是記憶體管理單元

mmu 主要完成的功能如下:

①、完成虛擬空間到物理空間的對映。

②、記憶體保護,設定儲存器的訪問許可權,設定虛擬儲存空間的緩衝特性。

如下圖:

物理記憶體和虛擬記憶體之間的轉換,需要用到兩個函式: ioremap 和 iounmap。

1、 ioremap 函式

ioremap 函 數 用 於獲 取 指 定 物 理 地 址 空 間 對 應 的 虛 擬 地 址 空 間, 定 義 在arch/arm/include/asm/io.h

1 #define ioremap

(cookie,size)

__arm_ioremap

((cookie)

,(size)

, mt_device)23

void __iomem *

__arm_ioremap

(phys_addr_t phys_addr, size_t size,

unsigned

int mtype)

4size:要對映的記憶體空間大小。

mtype: ioremap 的型別,可以選擇 mt_device、 mt_device_nonshared、mt_device_cached 和 mt_device_wc, ioremap 函式選擇 mt_device。

2、 iounmap 函式

解除安裝驅動的時候需要使用 iounmap 函式釋放掉 ioremap 函式所做的對映

void iounmap (

volatile

void __iomem *addr)

3、載入/解除安裝驅動

sw_mux_gpio1_io03 就是乙個__iomem型別的指標。

//載入

#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)

;//解除安裝

iounmap

(sw_mux_gpio1_io03)

;

i/o 埠:當外部暫存器或記憶體對映到 io 空間時;

i/o 記憶體:當外部暫存器或記憶體對映到記憶體空間時。

對於 arm 來說沒有 i/o 空間這個概念,因此 arm 體系下只有 i/o 記憶體(可以直接理解為記憶體)。

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)

2、寫操作函式

1

void

writeb

(u8 value,

volatile

void __iomem *addr)

2void

writew

(u16 value,

volatile

void __iomem *addr)

3void

writel

(u32 value,

volatile

void __iomem *addr)

以上函式不做太多說明,有眼就行。

程式的編寫和上一章虛擬裝置驅動的編寫類似,不用寫注釋了,自己能看懂就行了,理解大概意思就行,後邊兒還會學習新字元裝置驅動。

led.c

在這裡插入**片
在這裡插入**片
makefile

kerneldir :

=/home/zxy/linux/kernel_lib/linux-imx-rel_imx_4.

1.15_2.

1.0_ga_alientek

current_path :

= $(shell pwd)

obj-m :

= led.o

build: kernel_modules

kernel_modules:

$(make)

-c $(kerneldir) m=$(current_path) modules

clean:

$(make)

-c $(kerneldir) m=$(current_path) clean

depmod //第一次載入驅動的時候需要執行此命令

modprobe led.ko //載入驅動

(或insmod,兩個命令都行,上邊兒那個就是能查詢依賴關係)

mknod /dev/led c 2000.

//開啟 led 燈

.//關閉 led 燈

rmmod led.ko //解除安裝驅動模組

沒啥好說,沒啥新知識。

就是原子出廠的裝置樹中內建了led的裝置樹,裡邊兒有心跳燈功能,進入到裝置樹檔案.dts中,將其中的led裝置樹相關的狀態"on"改為"off",然後在核心目錄make dtbs即可重新編譯裝置樹,mfgtool燒寫即可。

嵌入式Linux驅動開發 簡要備忘

一 搭建編譯環境 1.從天嵌盤拷出 linux 2.6.30.4 20100531.tar.bz2 到 opt下,並解壓到當前目錄 2.shell到目錄 embedsky linux 2.6.30.4 3.cp config embedsky w43 config 4.make menuconfig...

嵌入式Linux裝置驅動開發 1

使用者程序是通過裝置檔案來與實際的硬體打交道。每個裝置檔案都有其檔案屬性 c b 如表示是字元裝置還是塊裝置。另外每個檔案都有兩個裝置號,第乙個是主裝置號,用於標識驅動程式 第二個是從裝置號,用於標識使用同一裝置驅動的不同的硬體裝置。裝置檔案的主裝置號必須與裝置驅動程式在登記時申請的主裝置號一致,否...

嵌入式Linux驅動開發之helloword心得

自從選擇了物聯網這個專業,智慧型xx的字樣牽動著每乙個學習這個專業的孩子。大家興致勃勃的來到了學校,結果一切想象和自己的設想並不一樣。想象中的各種智慧型般夢幻的場景變成了真實的高數 電路 模電等等諸如此類!不知道這個世界什麼時候變得如此的浮躁,當大家的一段時間的努力看不到結果的時候就往往會不太感興趣...