溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

cubieboard uboot GPIO的驅(qū)動(dòng)實(shí)例分析

發(fā)布時(shí)間:2022-01-12 16:23:16 來(lái)源:億速云 閱讀:224 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇“cubieboard uboot GPIO的驅(qū)動(dòng)實(shí)例分析”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“cubieboard uboot GPIO的驅(qū)動(dòng)實(shí)例分析”文章吧。

uboot的GPIO相當(dāng)簡(jiǎn)單,其就是三層結(jié)構(gòu)。分別為: 1、頂層接口層,其只定義了通用的接口,并不負(fù)責(zé)實(shí)現(xiàn),實(shí)現(xiàn)是我們具體根據(jù)具體的芯片來(lái)實(shí)現(xiàn)的。
2、中間接口實(shí)現(xiàn)層,用具體的板子的GPIO來(lái)實(shí)現(xiàn)頂層的接口
3、 底層具體芯片GPIO的實(shí)現(xiàn)層 。

現(xiàn)在具體分析:
頂層接口層

int gpio_request(unsigned gpio, const char *label); //申請(qǐng)GPIO資源
int gpio_free(unsigned gpio); //釋放申請(qǐng)的GPIO資源
int gpio_direction_input(unsigned gpio); //設(shè)置GPIO為輸入模式
int gpio_direction_output(unsigned gpio, int value); //設(shè)置GPIO為輸出模式
int gpio_get_value(unsigned gpio); //得到GPIO的值
int gpio_set_value(unsigned gpio, int value);//設(shè)置GPIO的值
說明:unsigned gpio為邏輯號(hào),雖然和實(shí)際的物理GPIO地址有一定的關(guān)系,但并不是實(shí)際的物理GPIO地址。

中間接口實(shí)現(xiàn)層:
用具體的芯片的GPIO來(lái)實(shí)現(xiàn)其頂層接口

int gpio_request(unsigned gpio, const char *label)
{
return 0;
}

int gpio_free(unsigned gpio)
{
return 0;
}

int gpio_direction_input(unsigned gpio)
{
sunxi_gpio_set_cfgpin(gpio, SUNXI_GPIO_INPUT);

return sunxi_gpio_input(gpio);
}

int gpio_direction_output(unsigned gpio, int value)
{
sunxi_gpio_set_cfgpin(gpio, SUNXI_GPIO_OUTPUT);

return sunxi_gpio_output(gpio, value);
}

int gpio_get_value(unsigned gpio)
{
return sunxi_gpio_input(gpio);
}

int gpio_set_value(unsigned gpio, int value)
{
return sunxi_gpio_output(gpio, value);
}

底層具體芯片GPIO的實(shí)現(xiàn)層:
在實(shí)現(xiàn)的時(shí)候,其用了一個(gè)小技巧,其目的是把GPIO的物理寄存器放到結(jié)構(gòu)體里面來(lái),從而把物理的地址操作轉(zhuǎn)換為數(shù)據(jù)結(jié)構(gòu)的操作。
其實(shí)現(xiàn)如下:
把SUNXI_PIO_BASE 強(qiáng)制轉(zhuǎn)換為sunxi_gpio_reg *指針來(lái)實(shí)現(xiàn)。
#define SUNXI_PIO_BASE 0x01c20800

struct sunxi_gpio {
u32 cfg[4];
u32 dat;
u32 drv[2];
u32 pull[2];
};

struct sunxi_gpio_int {
u32 cfg[3];
u32 ctl;
u32 sta;
u32 deb;
};

struct sunxi_gpio_reg {
struct sunxi_gpio gpio_bank[9];
u8 res[0xbc];
struct sunxi_gpio_int gpio_int;
};

我們實(shí)現(xiàn)具體的芯片的GPIO的操作的思想是:
使用邏輯符號(hào)unsigned gpio,通過SUNXI_PIO_BASE 強(qiáng)制轉(zhuǎn)換為sunxi_gpio_reg *指針的指針來(lái)操作相關(guān)寄存器。

但是邏輯符號(hào)unsigned gpio要通過SUNXI_PIO_BASE 強(qiáng)制轉(zhuǎn)換為sunxi_gpio_reg *指針的指針來(lái)操作相關(guān)寄存器,必須要解決一個(gè)問題,即如何在眾多的寄存器的中,找到指定的那個(gè)寄存器,并且在該寄存器上找到指定的那些相關(guān)位。
即gpio---->bank------>bank中的offset

這個(gè)映射關(guān)系和具體的芯片有關(guān)。

以上就是關(guān)于“cubieboard uboot GPIO的驅(qū)動(dòng)實(shí)例分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI