(imx6)LED驅動筆記

2021-10-08 01:50:49 字數 4429 閱讀 5186

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define led_major 200

/* 主裝置號 */

#define led_name "led"

/* 裝置名字 */

#define ledoff 0

/* 關燈 */

#define ledon 1

/* 開燈 */

/* 暫存器實體地址 */

#define sw_mux_gpio3_io020_base (0x020e0154)

//gpio_3_io20復用功能設定

#define sw_pad_gpio3_io020_base (0x020e0524)

#define gpio3_dr_base (0x020a4000)

#define gpio3_gdir_base (0x020a4004)

/* 對映後的暫存器虛擬位址指標 */

static

void __iomem *sw_mux_gpio3_io020;

static

void __iomem *sw_pad_gpio3_io020;

static

void __iomem *gpio3_dr;

static

void __iomem *gpio3_gdir;

/* * @description : led開啟/關閉

* @param - sta : ledon(0) 開啟led,ledoff(1) 關閉led

* @return : 無

*/void

led_switch

(u8 sta)

else

if(sta == ledoff)}/*

* @description : 開啟裝置

* @param - inode : 傳遞給驅動的inode

* @param - filp : 裝置檔案,file結構體有個叫做private_data的成員變數

* 一般在open的時候將private_data指向裝置結構體。

* @return : 0 成功;其他 失敗

*/static

intled_open

(struct inode *inode,

struct file *filp)

/* * @description : 從裝置讀取資料

* @param - filp : 要開啟的裝置檔案(檔案描述符)

* @param - buf : 返回給使用者空間的資料緩衝區

* @param - cnt : 要讀取的資料長度

* @param - offt : 相對於檔案首位址的偏移

* @return : 讀取的位元組數,如果為負值,表示讀取失敗

*/static ssize_t led_read

(struct file *filp,

char __user *buf, size_t cnt, loff_t *offt)

/* * @description : 向裝置寫資料

* @param - filp : 裝置檔案,表示開啟的檔案描述符

* @param - buf : 要寫給裝置寫入的資料

* @param - cnt : 要寫入的資料長度

* @param - offt : 相對於檔案首位址的偏移

* @return : 寫入的位元組數,如果為負值,表示寫入失敗

*/static ssize_t led_write

(struct file *filp,

const

char __user *buf, size_t cnt, loff_t *offt)

ledstat = databuf[0]

;/* 獲取狀態值 */

if(ledstat == ledon)

else

if(ledstat == ledoff)

return0;

}/** @description : 關閉/釋放裝置

* @param - filp : 要關閉的裝置檔案(檔案描述符)

* @return : 0 成功;其他 失敗

*/static

intled_release

(struct inode *inode,

struct file *filp)

/* 裝置操作函式 */

static

struct file_operations led_fops =;/*

* @description : 驅動出口函式

* @param : 無

* @return : 無

*/static

int __init led_init

(void

)return0;

}/** @description : 驅動出口函式

* @param : 無

* @return : 無

*/static

void __exit led_exit

(void

)module_init

(led_init)

;module_exit

(led_exit)

;module_license

("gpl"

);

以上**為操作暫存器的驅動,通過配置以下暫存器

#define sw_mux_gpio3_io020_base		(0x020e0154) 

//gpio_3_io20復用功能設定

#define sw_pad_gpio3_io020_base (0x020e0524)

//gpio_3_io20電器屬性設定

#define gpio3_dr_base (0x020a4000)

//gpio_3_io20輸入輸出操作

#define gpio3_gdir_base (0x020a4004)

//gpio_3_io20輸入輸出設定

很明顯以上操作少了乙個io口時鐘的暫存器設定,結果參考晶元手冊(mcimx6u7cvm08ab)找到結果如下:

沒有模組時鐘門控使能設定……

具體的設定我也不太懂,決定不設定時鐘先試試再說

#include

"stdio.h"

#include

"unistd.h"

#include

"sys/types.h"

#include

"sys/stat.h"

#include

"fcntl.h"

#include

"stdlib.h"

#include

"string.h"

#define ledoff 0

#define ledon 1

/* * @description : main主程式

* @param - argc : ar**陣列元素個數

* @param - ar** : 具體引數

* @return : 0 成功;其他 失敗

*/int

main

(int argc,

char

*ar**)

filename = ar**[1]

;/* 開啟led驅動 */

fd =

open

(filename, o_rdwr);if

(fd <0)

databuf[0]

=atoi

(ar**[2]

);/* 要執行的操作:開啟或關閉 */

/* 向/dev/led檔案寫入資料 */

retvalue =

write

(fd, databuf,

sizeof

(databuf));

if(retvalue <0)

retvalue =

close

(fd)

;/* 關閉檔案 */

if(retvalue <0)

return0;

}

設定號makefile,輸入指令編譯檔案,上電測試成功輸出高電平和低電平!

Tiny6410 LED 裸機驅動筆記

1.先檢視 tiny6410 1170 cpu 核心板原理圖 找到 led部分 從上圖可知,當nled 1 為低電平時,ledx 就會亮。2.再在 tiny6410 1170 cpu 核心板原理圖 中找到 nled x 連線圖 應該就在附近 從上圖可知 led1 連線 gpk4 led2 連線 gp...

驅動筆記(3)

併發 多個執行單元同時被執行 竟態 併發的執行單元對共享資源 硬體資源或全域性變數等 的共享訪問 通過semaphore機制和spin lock機制實現 獲取訊號量不成功 該阻塞或者睡眠 1.定義訊號量 struct semaphore sem 2.初始化訊號量 void sema init str...

LINUX SPI驅動筆記

spi匯流排由miso 序列資料輸入 mosi 序列資料輸出 sck 序列移位時鐘 cs 使能訊號 4個訊號線組成 linux下spi驅動開發 首先明確spi驅動層次,如下圖 我們以上面的這個圖為思路 spi bus spi匯流排對應的匯流排型別為spi bus type,在核心的drivers s...