如何在设备驱动程序或寄存器上的特定位置/地址上写入?
我认为我们应该创建一个指向给定寄存器地址的无符号指针,以便访问寄存器的内容。
#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 中的“常规”编码没有什么不同。您可能需要阅读按位运算符,因为某些低级设备可能需要这种级别的操作。