RK3288驅動設計分層的思想

2021-10-20 18:03:27 字數 2658 閱讀 9208

與硬體無關的操作寫在led_drv.c中,在led_drv中通過呼叫結構體led_operations間接初始化硬體。

而led_operations具體的實現就在board_demo.c中實現。這裡是關於硬體的實現。如果有不同的板子,不需要重複修改board_demo.c。只需要不斷新增新的c檔案,修改makefile編譯的不同板子的c檔案。來使得適配更多不同的板子。

然而現實情況卻更複雜,比如同樣的晶元會有兩塊資源分配不一樣的開發板。如果使用上面的方式,就需要重複編寫很多相似的**,比如不同引腳的led驅動。

於是就有了關於某個chip的特定通用驅動程式,關於特定晶元的gpio的操作,都可以用它實現。所以可以把board_demoo.c分成board_a_led.c和chip_gpio.c兩個檔案。board_a_led.c來決定使用哪些引腳,chip_gpio.c來實現對gpio的操作。

總的來說就是把board_demoo.c裡的函式進行了拆分。舊的操作函式框架在chip_demo_gpio.c中實現,初始化,和操作引腳也在這個檔案中。

但是使用多少引腳被分離了出來,board_a_led.c裡存放了板子上的引腳配置,使用第幾組的第幾個引腳。

相比於之前的版本,引腳的使用改動被提取出來,這使得如果板子需要更換引腳的功能變得更簡單。

而且在chip_demo_gpio.c中編寫了統一的驅動**,適配類似的引腳功能。

chip_demo_gpio.c

#include

#include

#include

"led_resource.h"

#include

"led_ops.h"

static

struct led_resource *led_rsc;

#define cru_base_phy_address ((unsigned long)(0xff760000))

#define grf_base_phy_address ((unsigned long)(0xff770000))

#define gpio8_base_phy_address ((unsigned long)(0xff7f0000))

#define cru_clkgate14_phy_con (0x0198)

#define grf_gpio8a_phy_iomux (0x0080)

#define gpio_swporta_phy_dr (0x0000)

#define gpio_swporta_phy_ddr (0x0004)

static

volatile

unsigned

int*cru_clkgate14_con;

static

volatile

unsigned

int*grf_gpio8a_iomux;

static

volatile

unsigned

int*gpio8_swporta_ddr;

static

volatile

unsigned

int*gpio8_swporta_dr;

static

intboard_demo_led_init

(int which)

printk

("%s which %d"

, __function__, which);if

(group

(led_rsc->pin)==8

)if(pin

(led_rsc->pin)==1

)}return0;

}static

intboard_demo_led_ctrl

(int which,

char status)

else

}return0;

}static

struct led_operations led_opr =

;struct led_operations *

get_board_led_ops

(void

)

board_a_led.c

#include

"led_resource.h"

static

struct led_resource board_a_led =

;struct led_resource *

get_led_resource

(void

)

led_resource.h

#ifndef _led_resouce_h

#define _led_resouce_h

/* bit[31:16] = group */

/* bit[15:0] = which pin */

#define group(x) (x>>16)

#define pin(x) (x&0xffff)

#define group_pin(g, p) ((g<<16| (p)))

struct led_resource

;struct led_resource *

get_led_resource

(void);

#endif

PopMetal 基於RK3288的開源硬體平台

芯客網聯合瑞芯微推出一款基於rk3288四核處理器的開源硬體平台popmetal今日正式上市。popmetal將重新定義基於rk3288產品的二次開發概念,它面向所有群體開放,具有革命性意義。popmetal平台內建2gb記憶體,8gbemmc儲存。支援最新的802.11a b g n ac協議,2...

RK3288 編譯不過遇到的問題

配置ssh鏈結後sync 一下 執行命令repo sync j2把原始碼拉下來後編譯遇到一些問題 mkdir rk3288 android 7.0 cd rk3288 android 7.0 repo sync j2 build cd rk3288 android 7.0 u boot mkv7.s...

《驅動設計的思想 物件導向 分層 分離》

1.物件導向 字元裝置驅動程式抽象出乙個 file operations 結構體 我們寫的程式針對硬體部分抽象出 led operations 結構體。在linux核心中,所謂的物件導向可以理解為用結構體來表示某個物件。2.分層 上下分層,比如我們前面寫的 led 驅動程式就分為 2 層 上層實現硬...