IMX6ULL嵌入式Linux驅動學習筆記(三)

2021-10-09 15:12:57 字數 3345 閱讀 7316

imx6ull-linux開發學習

以下內容是我在學習正點原子imx6ull開發板alpha中記錄的筆記,部分摘錄自正點原子imx6ull開發手冊

因為linux使用mmc,因此在驅動開發時,不能直接對暫存器實體地址進行讀寫操作。

linux裡面操作的都是虛擬位址,所以需要先得到實體地址對應的虛擬位址。獲得實體地址對應的虛擬位址使用va = ioremap(cookie,size)函式,第乙個引數是實體地址起始位址,第二個引數就是要轉換的位元組數量,返回的是申請到的虛擬位址。解除安裝驅動的時候使用iounmap(va)

操作虛擬位址時使用

/**

* @brief 出口

* */

static

int __init led_init

(void

)printk

("led_init\r\n");

return0;

}/**

* @brief 出口

* */

static

void __exit led_exit

(void

)

初始化時鐘、io、gpio等。

如果要在解除安裝驅動時關閉led,一定要在取消位址對映前操作led。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define led_major 100

// 主裝置號

#define led_name "led"

/* 暫存器實體地址 */

#define ccm_ccgr1_base (0x020c406c)

#define sw_mux_gpio1_io03_base (0x020e0068)

#define sw_pad_gpio1_io03_base (0x020e02f4)

#define gpio1_gdir_base (0x0209c004)

#define gpio1_dr_base (0x0209c000)

/* 虛擬位址的指標 */

static

void __iomem *ccm_ccgr1;

static

void __iomem *sw_mux_gpio1_io03;

static

void __iomem *sw_pad_gpio1_io03;

static

void __iomem *gpio1_gdir;

static

void __iomem *gpio1_dr;

#define ledoff 0

#define ledon 1

void

led_toggle

(u8 state)

else

}static

intled_open

(struct inode *inode,

struct file *filp)

static

intled_release

(struct inode *inode,

struct file *filp)

static ssize_t led_write

(struct file * fp,

const

char __user *buf, size_t len, loff_t * off)

if(databuff[0]

== ledon)

else

return0;

}/* 字元裝置操作集 */

static

const

struct file_operations led_fops =

;/**

* @brief 模組入口函式

* */

static

int __init led_init

(void

)printk

("led_init\r\n");

return0;

}/**

* @brief 出口

* */

static

void __exit led_exit

(void

)/**

* 驅動的載入和解除安裝

* */

module_init

(led_init)

;module_exit

(led_exit)

;module_license

("gpl"

);

#include

#include

#include

#include

#include

/** * @param argc 應用程式引數個數

* @param ar** 儲存的引數,字串形式。

* */

intmain

(int argc,

char

*ar**)

filename = ar**[1]

; fd =

open

(filename, o_rdwr);if

(fd <0)

/* 讀 */

/* if (atoi(ar**[2]) ==1 ) // 傳遞過來的是字串,需要轉換成數字

else

} */

databuff[0]

=atoi

(ar**[2]

);/* 寫 */

ret =

write

(fd, databuff,

sizeof

(databuff));

if(ret <0)

/* 關閉 */

ret =

close

(fd)

;return0;

}

先輸入depmod

然後輸入modprobe led.ko載入驅動

再輸入mknod /dev/led建立裝置節點

IMX6ULL啟動流程

假設板子設定為sd tf卡啟動,boot rom程式會做什麼?把程式從sd tf卡讀出來,執行。從 讀?從sd tf卡讀,這需要先初始化sd tf卡 根據efuse或gpio的設定初始化sd tf卡。讀到 去?讀到記憶體即ddr去,這需要先初始化ddr。除了初始化啟動裝置 初始化ddr,還需要初始化...

IMX6ULL學習筆記(一)

imx6ull裸機開發學習 以下內容是我在學習正點原子imx6ull開發板alpha中記錄的筆記,部分摘錄自正點原子imx6ull開發手冊。bin檔案前面要新增頭部 ivt boot data dcd資料 由官方手冊可知要燒寫到sd卡中的load.imx檔案在sd卡中的起始位址是0x400,也就是1...

IMX6ULL學習筆記(三)

imx6ull裸機開發學習 以下內容是我在學習正點原子imx6ull開發板alpha中記錄的筆記,部分摘錄自正點原子imx6ull開發手冊。鏈結指令碼的例子 sections rodata align 4 data align 4 bss start bss align 4 bss end bss ...