-1
如何寫入設備驅動程序或寄存器上的特定位置/地址?硬件編程
我想我們應該做一個無符號的指針指向給定的寄存器的地址,以訪問寄存器的內容。
#define REG *(unsigned int *)&0xABCBBABA
任何人都可以告訴我一些關於硬件級編程的基礎知識/先決條件嗎?
如果有人對Qualcom中的軟件配置文件作業有一些瞭解。請告訴我
如何寫入設備驅動程序或寄存器上的特定位置/地址?硬件編程
我想我們應該做一個無符號的指針指向給定的寄存器的地址,以訪問寄存器的內容。
#define REG *(unsigned int *)&0xABCBBABA
任何人都可以告訴我一些關於硬件級編程的基礎知識/先決條件嗎?
如果有人對Qualcom中的軟件配置文件作業有一些瞭解。請告訴我
是的,基本上就是這樣,除了你的例子中無關的&
操作符。您只需創建一個指向特定地址的指針,然後您就可以通過該指針進行讀取或寫入。
當然,它不是可移植的,但是,由於您處於嵌入式空間,這不是一個問題。
什麼你往往看到的是含有指定爲您的各種地址的頭文件有:
// Bit masks for control, and control/data locations.
#define UART_CTRL_READREADY 0x01
#define UART_CTRL_WRITREADY 0x01
#define UART_CTRL (*((unsigned char *)(0xcafebabe)))
#define UART_DATA_READ (*((unsigned char *)(0xdeadbeef)))
#define UART_DATA_WRIT (*((unsigned char *)(0xca11ab1e)))
(和volatile
關鍵字可以在這裏派上用場),這樣就可以簡單地編寫了起來:
// Wait for data to become available.
while (!(UART_CTRL & UART_CTRL_READREADY))
;
// Get it then clear flag for next byte
databyte = UART_DATA_READ;
UART_CTRL &= ~UART_CTRL_READREADY;
當然,您也可以考慮隱藏函數內部的複雜性,以便您可以在沒有太大影響的情況下更改它。事情是這樣:
int getFlag (char *location, unsigned char mask);
void setFlag (char *location, unsifgned char mask, int setFlag);
unsigned char getData (char *location);
雖然這可能是慢,這將大大緩解你的任務,如果你需要更改代碼。
就像這樣的低級編碼指針而言,它與C中的「常規」編碼沒有區別。您可能需要閱讀bitwise operators,因爲某些低級設備可能需要這種級別的操作。
@perreal CPU寄存器不會,但許多其他設備具有內存映射的配置,也稱爲「寄存器」。 – 2012-07-27 07:28:26
@perreal:那麼你將如何訪問這些......? – 2012-07-30 05:07:50
@AmitSingh,我的壞,在一些cpus他們被命名。 – perreal 2012-07-30 05:21:24