-1

如何在设备驱动程序或寄存器上的特定位置/地址上写入?

我认为我们应该创建一个指向给定寄存器地址的无符号指针,以便访问寄存器的内容。

 #define REG *(unsigned int *)&0xABCBBABA

谁能告诉我一些有关硬件级编程的基础知识/先决条件?

如果有人对 Qualcom 的软件配置文件工作有所了解。请告诉我

4

1 回答 1

2

&是的,除了您示例中的无关运算符之外,基本上就是这样。您只需创建一个指向特定地址的指针,然后您就可以通过该指针读取或写入。

当然,它不是可移植的,但是,由于您是在嵌入式空间中,所以这不是什么大问题。

您往往会看到一个头文件,其中包含您指定的各种地址:

// 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 中的“常规”编码没有什么不同。您可能需要阅读按位运算符,因为某些低级设备可能需要这种级别的操作。

于 2012-07-27T07:22:04.480 回答