裸機驅動模板

2021-07-04 02:14:17 字數 985 閱讀 1167

編寫裸機驅動,一般都比較隨意。這通常導致**不統一,移植性差。

本例以spi flash來分析一種優秀的裸機驅動編寫模板。

首先定義乙個裝置類。

/*

*flash device class */

typedef struct flash_dev_s flash_dev_t;

/* structure of pointers to functions inthe device driver */

struct  flash_dev_funs ;

同一種裝置型別可能有不同廠家和不同引數的差異,但它的大體功能屬性是一致的。我們首先把一致的屬性剝離出來,構建乙個裝置類。類似c++的類,包含資料和操作方法。乙個裝置驅動模板的雛形就出來了。

我們來看乙個裝置例項來看它的方便之處。

struct flash_dev_funs mx25l_funs = ;

flash_dev_t n25q256_dev = ;

flash_dev_t w25q16_dev = ;

/*end*/

flash_dev_t w25q64cv_dev = ;

這裡用乙個通用裝置結構體定義和初始化了多個不同的spi裝置例項。我們看到每個裝置的不同之處在它們的功能函式和裝置屬性。當我們需要新增乙個裝置時,只需定義乙個通用裝置類,再去新增它自己的操作方法和資料屬性就行了。實現這些之後,對外部呼叫來說就簡單了,直接操作這個裝置類的統一介面,上層**不需要做任何改動,提高了驅動移植性。

我們還可以做進一步的函式封裝。

例如:把裝置操作完全遮蔽,上層**不需要管是什麼裝置。

sys_error_t

flash_read(hsaddr_t flash_base, void *ram_base, size_t len)

rv = (*dev->funs->flash_read)(dev, addr, ram, this_read);

...... }

驅動裸機程式編譯

arm linux gcc 編譯 arm linux gcc nostartfiles nostdlib ttext 40008000 e led led.c o led nostartfiles 不加入起始檔案開始 nostdlib 不加入標準庫 ttext 指定 在裸機執行位址 e 表示程式入口...

裸機IIC協議 模擬IO驅動

實際注意 iic也有叫i2c,是半雙工的,不能同時收發,有sda和clk兩條線,一條匯流排上可以掛載多個從裝置,要求從裝置位址不同。下面以bosh的gsensor的bma253為例,來講解iic。從bma253的datasheet可知,通過io接gnd還是vdd可以得到不同的iic位址,我實際是連線...

tq2440 的dma裸機驅動

dma是一種提高cpu效率的工具。如果讓cpu去負責搬運資料,效率是十分低下的,因為在這個過程中,cpu就只能做這麼一件事。因此dma就應運而生。只要告訴dma,要搬運的資料源位址,以及要搬運到 去的位址,何種方式,使能它,dma就會獲取匯流排控制權,自動地搬運資料,從而解放cpu,提高效率。tq2...