S3C2410的时钟驱动分析

本文详细分析了S3C2410的时钟驱动,从机器配置开始,介绍了如何初始化IO、时钟源以及UART。在启动过程中,通过`s3c24xx_init_clocks`函数进行时钟初始化,特别是`s3c2410_init_clocks`函数用于计算和设置不同类型的时钟速度。最后,文章提到了时钟在驱动程序(如NAND Flash)中的使用,包括获取和启用时钟的步骤。
摘要由CSDN通过智能技术生成

S3C2410的时钟驱动分析


1 起点

我们以QT2410这个机器配置为例来说明 .

在文件 .../arch/arm/mach-s3c2410/mach-qt2410.c中我们定义一个机器配置

MACHINE_START(QT2410, "QT2410")

.phys_io = S3C2410_PA_UART,

.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

.boot_params= S3C2410_SDRAM_PA + 0x100,

.map_io = qt2410_map_io,

.init_irq = s3c24xx_init_irq,

.init_machine = qt2410_machine_init,

.timer = &s3c24xx_timer,

MACHINE_END


当内核启动时以QT2410的配置启动时,start_kernel(...)中会调用map_io()qt2410_map_io()函数.

// start_kernel(...)中被调用 .

static void __init qt2410_map_io(void)

{

// 添加IO地址映射 .

s3c24xx_init_io(qt2410_iodesc, ARRAY_SIZE(qt2410_iodesc));

// 初始化各种时钟源.

s3c24xx_init_clocks(12*1000*1000);

// 初始化UART

s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs));

}

在说s3c24xx_init_clocks(12*1000*1000);之前我们需要先看一下前面那个函数.

其中在 s3c24xx_init_io(...)

void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)

{

unsigned long idcode = 0x0;


/* initialise the io descriptors we need for initialisation */

// 初始化我们需要的IO描述符,

iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));


// CPU的结构代码,当前为0x32410000

if (cpu_architecture() >= CPU_ARCH_ARMv5) {

idcode = s3c24xx_read_idcode_v5();

} else {

idcode = s3c24xx_read_idcode_v4();

}

// 根据当前CPUchip id查找到当前是的cpu_table结构.

cpu = s3c_lookup_cpu(idcode);


if (cpu == NULL) {

printk(KERN_ERR "Unknown CPU type 0x%08lx/n", idcode);

panic("Unknown S3C24XX CPU");

}


printk("CPU %s (id 0x%08lx)/n", cpu->name, idcode);


if (cpu->map_io == NULL || cpu->init == NULL) {

printk(KERN_ERR "CPU %s support not enabled/n", cpu->name);

panic("Unsupported S3C24XX CPU");

}


// 赋值机器重启调用 函数.

arm_pm_restart = s3c24xx_pm_restart;


// 调用 当前cpuIO映射函数.

(cpu->map_io)(mach_desc, size);

}

其中对于s3c2410芯片来说读到的ID0x32410000,则对应的cpu_table结构为:

static struct cpu_table cpu_ids[] __initdata = {

{

.idcode = 0x32410000,

.idmask = 0xffffffff,

.map_io = s3c2410_map_io,

.init_clocks = s3c2410_init_clocks,

.init_uarts = s3c2410_init_uarts,

.init = s3c2410_init,

.name = name_s3c2410

},

终于说到了这个cpu_table结构,这个结构在s3c24xx_init_clocks(12*1000*1000)中会用到

2 初始化

.../arch/arm/plat-s3c24xx/cpu.c

void __init s3c24xx_init_clocks(int xtal)

{

if (xtal == 0)

xtal = 12*1000*1000;<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值