linux内核学习初笔记(4)u-boot的board_init()函数clk_power与gpio妙用
2012-11-12 00:54
357 查看
在学到board_init()函数内部时发现,居然通过结构指针就可以设置cpu寄存器的值了,这还蛮有意思,研究一炮吧~
经研究发现其实原理很简单,都不好意思写在这里了,所以大神看到这篇文章就请默默移驾吧~
归根结底,就是这两句
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
而函数S3C24X0_GetBase_CLOCK_POWER():
static inline S3C24X0_CLOCK_POWER * const S3C24X0_GetBase_CLOCK_POWER(void)
{
return (S3C24X0_CLOCK_POWER * const)S3C24X0_CLOCK_POWER_BASE;
我草还是个内敛函数,算了,都差不多,继续研究。
S3C24X0_CLOCK_POWER_BASE:
#define S3C24X0_CLOCK_POWER_BASE 0x4C000000
啊,原来如此呀~
其实就是在S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();处定义一个指针常量并初始化之。这个指针的类型是:
typedef struct {
S3C24X0_REG32 LOCKTIME;
S3C24X0_REG32 MPLLCON;
S3C24X0_REG32 UPLLCON;
S3C24X0_REG32 CLKCON;
S3C24X0_REG32 CLKSLOW;
S3C24X0_REG32 CLKDIVN;
} /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;
OK!那么S3C24X0_GetBase_GPIO();这个函数返回值是一个S3C24X0_CLOCK_POWER类型的指针常量,而且这个指针常量其实是s3c2440时钟控制寄存器组的基地址(可以在数据手册中查明,这里不多说),那么就显而易见了,最终我们初始化clk_power这个指针的值为s3c2440时钟控制寄存器组的基地址,而且指针指向的是一个S3C24X0_CLOCK_POWER类型的数据,而恰好,这个S3C24X0_CLOCK_POWER结构体中的数据分布与s3c2440时钟控制寄存器组的寄存器分布情况一样(当然是故意这么做的),那这样对应看来,我们就可以通过这个指针访问他指向的这个位于s3c2440时钟控制寄存器组的基地址处的S3C24X0_CLOCK_POWER结构体来访问s3c2440的时钟控制寄存器组,那么这样就很方便了啊,不用老是要和寄存器地址打交道,那样很麻烦。
经研究发现其实原理很简单,都不好意思写在这里了,所以大神看到这篇文章就请默默移驾吧~
归根结底,就是这两句
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
而函数S3C24X0_GetBase_CLOCK_POWER():
static inline S3C24X0_CLOCK_POWER * const S3C24X0_GetBase_CLOCK_POWER(void)
{
return (S3C24X0_CLOCK_POWER * const)S3C24X0_CLOCK_POWER_BASE;
我草还是个内敛函数,算了,都差不多,继续研究。
S3C24X0_CLOCK_POWER_BASE:
#define S3C24X0_CLOCK_POWER_BASE 0x4C000000
啊,原来如此呀~
其实就是在S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();处定义一个指针常量并初始化之。这个指针的类型是:
typedef struct {
S3C24X0_REG32 LOCKTIME;
S3C24X0_REG32 MPLLCON;
S3C24X0_REG32 UPLLCON;
S3C24X0_REG32 CLKCON;
S3C24X0_REG32 CLKSLOW;
S3C24X0_REG32 CLKDIVN;
} /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;
OK!那么S3C24X0_GetBase_GPIO();这个函数返回值是一个S3C24X0_CLOCK_POWER类型的指针常量,而且这个指针常量其实是s3c2440时钟控制寄存器组的基地址(可以在数据手册中查明,这里不多说),那么就显而易见了,最终我们初始化clk_power这个指针的值为s3c2440时钟控制寄存器组的基地址,而且指针指向的是一个S3C24X0_CLOCK_POWER类型的数据,而恰好,这个S3C24X0_CLOCK_POWER结构体中的数据分布与s3c2440时钟控制寄存器组的寄存器分布情况一样(当然是故意这么做的),那这样对应看来,我们就可以通过这个指针访问他指向的这个位于s3c2440时钟控制寄存器组的基地址处的S3C24X0_CLOCK_POWER结构体来访问s3c2440的时钟控制寄存器组,那么这样就很方便了啊,不用老是要和寄存器地址打交道,那样很麻烦。
相关文章推荐
- Linux内核学习笔记之使用ioctl函数实现用户态命令
- findChessboardCorners函数学习笔记
- STM32学习笔记——SystemInit()函数
- 四极管:WinCE Bootloader学习笔记之 OEMPlatformInit()函数
- linux内核学习初笔记(6)uboot第…
- linux内核学习初笔记(6)uboot第…
- ZigBee学习笔记_HAL_BOARD_INIT()
- linux内核学习初笔记(3)u-boot执行第二阶段typedef int (init_fnc_t) (void)解释
- 低功耗蓝牙cc2541学习笔记之无线通信- 分析SimpleBLEPeripheral_Init()函数
- mysql字符串函数学习笔记
- Python 2.7 学习笔记 基本语法和函数定义
- Python学习笔记(4)——常用函数
- Python学习笔记(七)函数的使用
- 神经网络学习笔记 - 激活函数的作用、定义和微分证明
- 《python基础教程(第二版)》学习笔记 函数(第6章)
- OpenCv学习笔记(六)----图像空间缩减,OpenCv中的计时函数和OpenCv中操作图像单个像素点的方法
- 【C++】学习笔记三十四——函数和结构
- 【学习笔记】自定义关于wchar_t*的相关函数
- SpringBoot学习笔记
- Qt中SQL QSqlQuery 对象中prepare()函数的用法(初学者,学习笔记,还望指正)