Freescale P4080是一款8核心网络处理器,功能强大,外设齐全,基于powerpc e500 core。在嵌入式网络应用上被广泛使用。
今天只讨论P4080的I2C部分。
P4080片上集成了4个I2C 控制器,在我们的应用中,这4个I2C Controller 都是作为master来使用。
先来一张I2C 控制器的结构图
这张图描述了一I2C 控制器应该有的寄存器,描述了各寄存器应有的功能。
其实,实现I2C驱动的关键就在于按照文档进行配置这些寄存器。不单是I2C,大部分驱动程序都是这样,比如DDR,SPI,DMA等都是按照文档,
提供一个接口(函数)来访问硬件,这就是所谓的驱动啦。
来看一下p4080上是怎么规定这么资源(registers)的地址的
规定了各I2C控制器的基地址,以及各控制器中的寄存器偏移。我们要按照这个地址进行组织代码,写一个结构体进行
描述I2C控制器,下面的结构体来自freescale
typedef struct fsl_i2c {
u8 adr; /* I2C slave address */
u8 res0[3];
#define I2C_ADR 0xFE
#define I2C_ADR_SHIFT 1
#define I2C_ADR_RES ~(I2C_ADR)
u8 fdr; /* I2C frequency divider register */
u8 res1[3];
#define IC2_FDR 0x3F
#define IC2_FDR_SHIFT 0
#define IC2_FDR_RES ~(IC2_FDR)
u8 cr; /* I2C control redister */
u8 res2[3];
#define I2C_CR_MEN 0x80
#define I2C_CR_MIEN 0x40
#define I2C_CR_MSTA 0x20
#define I2C_CR_MTX 0x10
#define I2C_CR_TXAK 0x08
#define I2C_CR_RSTA 0x04
#define I2C_CR_BCST 0x01
u8 sr; /* I2C status register */
u8 res3[3];
#define I2C_SR_MCF 0x80
#define I2C_SR_MAAS 0x40
#de