linux内核学习初笔记(4)u-boot的board_init()函数clk_power与gpio妙用

在学到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的时钟控制寄存器组,那么这样就很方便了啊,不用老是要和寄存器地址打交道,那样很麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值