與硬體無關的操作寫在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 層 上層實現硬...