Linux学习笔记

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);






你可能感兴趣的:(应用程序,驱动开发,linux驱动)