imx6ull-linux開發學習
以下內容是我在學習正點原子imx6ull
開發板alpha
中記錄的筆記,部分摘錄自正點原子imx6ull開發手冊
。
因為linux
使用mmc
,因此在驅動開發時,不能直接對暫存器實體地址進行讀寫操作。
在linux
裡面操作的都是虛擬位址,所以需要先得到實體地址對應的虛擬位址。獲得實體地址對應的虛擬位址使用va = ioremap(cookie,size)
函式,第乙個引數是實體地址起始位址,第二個引數就是要轉換的位元組數量,返回的是申請到的虛擬位址。解除安裝驅動的時候使用iounmap(va)
;
操作虛擬位址時使用
初始化時鐘、io、gpio等。/**
* @brief 出口
* */
static
int __init led_init
(void
)printk
("led_init\r\n");
return0;
}/**
* @brief 出口
* */
static
void __exit led_exit
(void
)
如果要在解除安裝驅動時關閉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 ...