在学习S5P6818芯片的串口时钟初始化部分,结合代码,总结一下结构体初始化的 几种方式。
struct nxp_clk_periph {
const char *dev_name;
int dev_id;
char periph_id;
void *base_addr;
/* clock config */
char level;
unsigned int clk_mask0;
unsigned int clk_mask1;
short clk_src0;
short clk_div0;
char clk_inv0;
short clk_src1;
short clk_div1;
char clk_inv1;
long clk_ext1;
long clk_ext2;
spinlock_t lock;
};
下面是结构体初始化代码:
static struct nxp_clk_periph clk_periphs [] = {
CLK_PERI_1S(DEV_NAME_TIMER , 0, CLK_ID_TIMER_0 , PHY_BASEADDR_CLKGEN14, (_PLL_0_2_)),
......
}
其中CLK_PERI_1S的宏展开为:
#define CLK_PERI_1S(name, devid, id, base, mk) [id] = { \
.dev_name = name, .dev_id = devid,.periph_id = id, .level = 1, \
.base_addr = (void*)base, .clk_mask0 = mk, }
把CLK_PERI_1S宏展开,代入原来的代码:
static struct nxp_clk_periph clk_periphs [] = {
[CLK_ID_TIMER_0] = { \
.dev_name = DEV_NAME_TIMER, .dev_id = 0,.periph_id = CLK_ID_TIMER_0, .level = 1, \
.base_addr = (void*)PHY_BASEADDR_CLKGEN14, .clk_mask0 = _PLL_0_2_, },
......
}
上述初始化方式为选择数组中的某一个元素进行初始化:
struct nxp_clk_periph clk_periphs [ ] =
{
[3] = { },
[4] = { },
}
常见的是直接用大括号按顺序来进行初始化:
struct nxp_clk_periph clk_periphs [ ] =
{
{ },
{ },
{ },
}
还有的方式就是这样的:
struct nxp_clk_periph clk_periphs [ ] =
{
[1].dev_id = 10,
[2].dev_name = "nxp-uart0",
}