1、关于 private_data
在驱动开发中,大部分的Linux驱动工程师会遵循一个规则,就是将文件的私有数据private_data 指向设备结构体,在read (), write(), ioctl(), llseek()等函数中通过private_data 访问设备结构体。 这是因为在这些函数的原型参数中没有struct inode* 这个结构体。这样就很容易封装好设备结构与字符设备的内容,而在字符设备的关闭中则不做任何动作,因为当应用程序关闭打开的驱动文件之后,我们的驱动只需要返回一个0 表示返回成功即可。
2、s3c2440的初始化
启动从是从0 地址开始运行的,如果从NAND FLASH 启动会把前4k拷贝到片内SRAM, 若果从NOR FLASH 启动会直接指向NOR FLASH 的 0 地址启动;对2440进行初始化的时候,需要关闭看门狗,WATCON寄存器地址为0x53000000,写入0x0就关闭了;
其实启动文件就是一个硬件的初始化(2440就是关闭看门狗,初始化时钟(不必需),初始化SDRAM(不必需))和软件初始化(设置栈sp指针,设置返回地址,调用main函数,)
LDR SP,4*1024;设置了4K的栈,这就初始化完毕了
片内SRAM不用初始化就可以使用;
3、BL指令
BL main; 指令即跳转指令,跳转到main,同时把返回地址保存到 LR寄存器里面;
4、C语言的内寄存器地址宏定义描述
define GPBCON (*(volatile unsigned long *)0x53000000) //volatile关键字是避免该条指令被编译器优化掉
int main(){ GPBCON=0X00000100; }
其实上面语句就好像是 int a; int *p; p =&a ; 那么怎么给a 赋值,其中一种就是 *p=5; p就是等于(int *)0x53000
5、C语言中的按位操作,可以避免影响到其他为;(清零 &, 置1 用| )
例如想把 a的第 3 位清零; a= a& ~(1<<3); 也就是 a &=~(1<<3);
例如想把 a的第3 位置1 ; a |=(1<<3);