当你比别人优秀一点点,别人会嫉妒你。当你比别人优秀很多,别人会羡慕你。
分类: 嵌入式
2013-04-08 10:35:02
我们使用一个芯片,就是要配置这个芯片对应的控制器的SFR,我们汇编代码中一般是直接使用”向一个内存地址赋值”来做的,这里C语言的做法是这样的.
因为一个控制器的多个SFR地址是挨着的,那么我们就可以定义一个结构体来表示这一堆SFR
typedef struct {
S3C24X0_REG32 NFCONF;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG32 NFDATA;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFECC;
} S3C2410_NAND;
像这样,我们就可以用这个结构体来表示NAND的所有SFR
然后再这样:
#define S3C2410_NAND_BASE 0x4E000000
static inline S3C2410_NAND * const S3C2410_GetBase_NAND(void)
{
return (S3C2410_NAND * const)S3C2410_NAND_BASE;
}
这里这个宏定义是用来指定Nand 的一堆SFR的起始地址.
这个函数是用来返回这个地址,而且返回的时候强制类型转换了一下,这里设计到指针类型,我就不罗嗦了.
所以,在C语言中,一般会使用这么三部分的接合来使用一个控制器的SFR:
从本质上说,这三部分肯定是可以放在一个头文件中,然后使用的。
然后因为s3c2400 s3c2410 s3c2440这个系列的CPU比较类似,大部分SFR的结构都一样,但是起始地址可能不同。所以呢,就吧结构的定义放在一个通用的头文件s3c24x0.h 这么个头文件中。 而把获得起始地址的两部分放在CPU相关的一个头文件中。类似的有s3c2400.h s3c2410.h我们这里添加一个s3c2440,应该入相随俗,也使用这个公共的s3c24x0.h,同时创建一个自己的s3c2440.h
u-boot-1.1.6/include/s3c24x0.h
u-boot-1.1.6/include/s3c2410.h