zz-am335x时钟clock寄存器配置141214d

//zz//####################################################################################


zz-am335x时钟clock寄存器配置141214d.txt


zz-write:
@2014-12-14 08:22:51
@2014-12-14 19:48:18
@2014-12-14 22:02:50
@2014-12-14 23:51:50
explicitly 显性时钟 PER/Functional Clock;打开则OCP被关断
@


REF:
AM335x_Technical_Reference_Manual(TRM).pdf
AM335x_TRM-zz141211a.pdf

ti-sdk-am335x-evm-06.00.00.00-Linux-x86-Install.bin
u-boot-2013.01-psp06ti-zz141214b.zip


KeyWord:
CLK_M_OSC => CLKINP
CLKOUT
CLKDCOLDO
CLKOUTx2

ADPLLS 为高速(Mpu,Core)
Mpu Core Display DDR 等时钟
ADPLLJ 为外设(低速 Peripheral)
Uart I2C MMC/SD 等时钟


PLL(不论ADPLLS ADPLLJ)设置,输入输出倍率关系
u-boot 的使用方式: M = 需要得到的输出时钟; N = 输入晶振频率-1; M2 = 1
主时钟
CLKOUT = (M / (N+1))*CLKINP*(1/M2)

CLKDCOLDO = (M / (N+1))*CLKINP

若有
CLKOUTX2 = 2 * [M / (N+1)] * CLKINP * [1/M2]

关于 Peripheral 时钟的设置(显性为 ADPLLJ/Per 时钟;使能了Functional就一定是,此时OCP被关断)
Functional Clock: explicitly
Inteface Clock(OCP): implicitly


//zz//####################################################################################
0.
u-boot 中的寄存器地址及结构体声明
s_init() => pll_init() 函数实现时钟 clock 的配置
后面 3. 4. 分析 pll_init() 函数内各函数针对寄存器的操作流程


const struct cm_perpll *cmper = (struct cm_perpll *)CM_PER;
const struct cm_wkuppll *cmwkup = (struct cm_wkuppll *)CM_WKUP;
const struct cm_dpll *cmdpll = (struct cm_dpll *)CM_DPLL;
const struct cm_rtc *cmrtc = (struct cm_rtc *)CM_RTC;


struct cm_wkuppll {
unsigned int wkclkstctrl; /* offset 0x00 */
unsigned int wkctrlclkctrl; /* offset 0x04 */
unsigned int wkgpio0clkctrl; /* offset 0x08 */
unsigned int wkl4wkclkctrl; /* offset 0x0c */
...
}


...


void pll_init()
{
/* Start at 550MHz, will be tweaked up if possible. */
mpu_pll_config(MPUPLL_M_300);
core_pll_config(OPP_50);
per_pll_config();


/* Enable the required interconnect clocks */
enable_interface_clocks();


/* Power domain wake up transition */
power_domain_wkup_transition();


/* Enable the required peripherals */
enable_per_clocks();
}



//zz//####################################################################################
1.
am335x-TRM 手册章节中的配置说明


8 Power, Reset, and Clock Management (PRCM)
8.1.3 Clock Management
8.1.3.3 Clock Domain
时钟域选择与配置..


8.1.6 Clock Generation and Management
8.1.6.3 ADPLLS
8.1.6.4 ADPLLLJ (Low Jitter DPLL)


分别介绍各种时钟的配置方法..
8.1.6.6 Core PLL Description
8.1.6.7 Peripheral PLL Description
8.1.6.8 MPU PLL Description
...


8.1.12 Clock Module Registers
8.1.12.1 CM_PER Registers
8.1.12.1.22 CM_PER_UART1_CLKCTRL Register (offset = 6Ch)
开启 UART1/0 的 functional clock
8.1.12.1.27 CM_PER_TIMER2_CLKCTRL Register (offset = 80h)
开启 TIMER2 的 functional clock


8.1.12.2 CM_WKUP Registers
8.1.12.2.12 CM_CLKSEL_DPLL_MPU Register (offset = 2Ch)
8.1.12.2.27 CM_CLKSEL_DPLL_CORE Register (offset = 68h) 
8.1.12.2.35 CM_CLKMODE_DPLL_MPU Register (offset = 88h)
8.1.12.2.37 CM_CLKMODE_DPLL_CORE Register (offset = 90h)
8.1.12.2.43 CM_DIV_M2_DPLL_MPU Register (offset = A8h)
8.1.12.2.46 CM_WKUP_UART0_CLKCTRL Register (offset = B4h)
8.1.12.3.2 CLKSEL_TIMER2_CLK Register (offset = 8h)
可配置TIMER2 时钟为输入晶振CLKINP频率
8.1.12.2.52 CM_L4_WKUP_AON_CLKSTCTRL Register (offset = CCh) 
开启 interface clock (L4_WKUP), u-boot 中 TIMER2,UART1/0 都没用,用的是 functional clock ?

8.1.12.3 CM_DPLL Registers
8.1.12.4 CM_MPU Registers




//zz//####################################################################################
2.
时钟寄存器配置心得总结


1)
各时钟之间相关性不大(类比三星s5pv210的多次再分频)
Mpu Core Display DDR 及 Peripheral 时钟都是从 CLKINP(24M-25M-26M) 经过各自的 PLL 得到


2)
以上所说时钟,在各自的时钟图上都是 CLKOUT,计算公式都如下
CLKOUT = (M / (N+1))*CLKINP*(1/M2)
u-boot代码中用法,可以理解为: M2取1; 则 M 是想得到的CLKOUT的频率值(单位MHz), N 是 CLKINP 晶振的频率值(MHz)减一


3)
在得到以上各时钟后,才开始进行分频
例如 OCP(interface clock)中,给各 M3 M4 M5 设置分频系数,得到针对具体设备/接口的时钟; 例如: Uart Timer SPI I2C ...


像 Uart Timer 这些外设,有多种时钟可以选择: functional clock, interface clock(OCP)
interface clock 使用的是 Core clock (APLLS)中的 M3 M4 等分频作为时钟源的,需要在寄存器中打开 WKUP_L4_WKUP 等


functional clock 使用的是 Peripheral 时钟(APLLJ)设定的外设用的时钟,需要寄存器中打开 wkup_uart0ctrl, timer2clkctrl 或其他


TRM手册 8.1.6.2 Clock Structure 有如下一段话
The ADPLLS module is used for the Core, Display, ARM Subsystem and DDR PLLs
The ADPLLLJ module is used for the peripheral functional clocks


//zz//####################################################################################
3.
以u-boot代码为例,说明时钟输入输出频率的配置流程;
Core Mpu Per 的时钟流程是一样的.
TRM手册 8.1.6.6.1 Core PLL Configuration


1)
将 PLL 切换到 bypass mode; 通过设置 CM_CLKMODE_DPLL_CORE.DPLL_EN = 0x04


2)
while() 等待 CM_IDLEST_DPLL_CORE.ST_MN_BYPASS 为 1;
确保已经进入 bypass mode


3)
配置 CM_CLKSEL_DPLL_CORE.DPLL_MULT 和 DPLL_DIV 
即前面说的 M/(N+1) 和 M2


4)
配置 M4 M5 M6 各设备/接口的分频系数


5)
将 PLL 切换到 lock mode(也即退出了 bypass mode);
通过设置 CM_CLKMODE_DPLL_CORE.DPLL_EN = 0x7


6)
while() 等待 CM_IDLEST_DPLL_CORE.ST_DPLL_CLK 为 1;
确保 PLL 已经 locked


void mpu_pll_config(int mpupll_M)
{
u32 clkmode, clksel, div_m2;


//zz// 8.1.12.2.35 CM_CLKMODE_DPLL_MPU Register (offset = 88h)
clkmode = readl(&cmwkup->clkmoddpllmpu);
//zz// 8.1.12.2.12 CM_CLKSEL_DPLL_MPU Register (offset = 2Ch)
clksel = readl(&cmwkup->clkseldpllmpu);
//zz// 8.1.12.2.43 CM_DIV_M2_DPLL_MPU Register (offset = A8h)
div_m2 = readl(&cmwkup->divm2dpllmpu);


/* Set the PLL to bypass Mode */
writel(PLL_BYPASS_MODE, &cmwkup->clkmoddpllmpu);
while (readl(&cmwkup->idlestdpllmpu) != ST_MN_BYPASS)
;


clksel = clksel & (~CLK_SEL_MASK);
clksel = clksel | ((mpupll_M << CLK_SEL_SHIFT) | MPUPLL_N);
writel(clksel, &cmwkup->clkseldpllmpu);


div_m2 = div_m2 & ~CLK_DIV_MASK;
div_m2 = div_m2 | MPUPLL_M2;
writel(div_m2, &cmwkup->divm2dpllmpu);


//zz// Set the PLL to DPLL and wait for Complete
clkmode = clkmode | CLK_MODE_SEL;
writel(clkmode, &cmwkup->clkmoddpllmpu);


while (readl(&cmwkup->idlestdpllmpu) != ST_DPLL_CLK)
;
}




void core_pll_config(int opp)
{
u32 clkmode, clksel, div_m4, div_m5, div_m6;


//zz// 8.1.12.2.37 CM_CLKMODE_DPLL_CORE Register (offset = 90h)
clkmode = readl(&cmwkup->clkmoddpllcore);
//zz// 8.1.12.2.27 CM_CLKSEL_DPLL_CORE Register (offset = 68h)
clksel = readl(&cmwkup->clkseldpllcore);
//zz// 8.1.12.2.33 CM_DIV_M4_DPLL_CORE Register (offset = 80h) 
// 80h 84h D8h
div_m4 = readl(&cmwkup->divm4dpllcore);
div_m5 = readl(&cmwkup->divm5dpllcore);
div_m6 = readl(&cmwkup->divm6dpllcore);

/* Set the PLL to bypass Mode */
writel(PLL_BYPASS_MODE, &cmwkup->clkmoddpllcore);
while (readl(&cmwkup->idlestdpllcore) != ST_MN_BYPASS)
;

//zz// if opp == OPP_50) ... else OPP_100
//zz// OPP_100 packaging chip: 1GHz (the highest frequency)
clksel = clksel & (~CLK_SEL_MASK);
//zz// 1GHz: 1000<<8 | (OSC-1)
clksel = clksel | ((COREPLL_M << CLK_SEL_SHIFT) | COREPLL_N);
writel(clksel, &cmwkup->clkseldpllcore);


div_m4 = div_m4 & ~CLK_DIV_MASK;
//zz// 200MHz: 10 
div_m4 = div_m4 | COREPLL_M4;
writel(div_m4, &cmwkup->divm4dpllcore);


//zz// 250MHz: 8
div_m5 = div_m5 & ~CLK_DIV_MASK;
div_m5 = div_m5 | COREPLL_M5;
writel(div_m5, &cmwkup->divm5dpllcore);


//zz// 500MHz: 4
div_m6 = div_m6 & ~CLK_DIV_MASK;
div_m6 = div_m6 | COREPLL_M6;
writel(div_m6, &cmwkup->divm6dpllcore);


//zz// 0x7: CLK_MODE(out of bypass mode)
clkmode = clkmode | CLK_MODE_SEL;
writel(clkmode, &cmwkup->clkmoddpllcore);


while (readl(&cmwkup->idlestdpllcore) != ST_DPLL_CLK)
;
}


void per_pll_config()
{
u32 clkmode, clksel, div_m2;


//zz// 8.1.12.2.35 CM_CLKMODE_DPLL_MPU Register (offset = 88h) 
clkmode = readl(&cmwkup->clkmoddpllper);
//zz// 8.1.12.2.40 CM_CLKSEL_DPLL_PERIPH Register (offset = 9Ch) 
clksel = readl(&cmwkup->clkseldpllper);
//zz// 8.1.12.2.44 CM_DIV_M2_DPLL_PER Register (offset = ACh)
div_m2 = readl(&cmwkup->divm2dpllper);


/* Set the PLL to bypass Mode */
writel(PLL_BYPASS_MODE, &cmwkup->clkmoddpllper);


while (readl(&cmwkup->idlestdpllper) != ST_MN_BYPASS)
;


clksel = clksel & (~CLK_SEL_MASK);
//zz// 960MHz: 960<<8 | (OSC-1)
clksel = clksel | ((PERPLL_M << CLK_SEL_SHIFT) | PERPLL_N);
writel(clksel, &cmwkup->clkseldpllper);


div_m2 = div_m2 & ~CLK_DIV2_MASK;
//zz// 192MHz: 5
div_m2 = div_m2 | PERPLL_M2;
writel(div_m2, &cmwkup->divm2dpllper);


//zz// 0x07: out of bypass mode, CLK_MODE
// and wait for CLK_MODE complete
clkmode = clkmode | CLK_MODE_SEL;
writel(clkmode, &cmwkup->clkmoddpllper);


while (readl(&cmwkup->idlestdpllper) != ST_DPLL_CLK)
;


writel(DPLL_CLKDCOLDO_GATE_CTRL, &cmwkup->clkdcoldodpllper);
}
//zz//####################################################################################
4.
外设functional clock 时钟的选择
以 UART0(1) TIMER2 为例做说明,u-boot代码中,用作console和精确的硬件定时器


//zz// 19.2.1 UART Connectivity Attributes
/* UART0 
//Power Domain: Wake-Up Domain
//Clock Domain: PD_WKUP_L4_WKUP_GCLK (OCP) <=> implicitly
PD_WKUP_UART0_GFCLK (Func) <=> explicitly
*/


//zz// 20.1.2.1 Timer Connectivity Attributes
/*  Timer[2–7] 
//Clock Domain: PD_PER_L4LS_GCLK (OCP) <=> implicitly
// Functional Clocks: <=> explicitly
// PD_PER_TIMER2_GCLK (Timer 2)
// ...
*/
void enable_per_clocks()
{
/* Enable the module clock */
writel(PRCM_MOD_EN, &cmper->timer2clkctrl);
while (readl(&cmper->timer2clkctrl) != PRCM_MOD_EN)
;


/* Select the Master osc 24 MHZ as Timer2 clock source */
writel(0x1, &cmdpll->clktimer2clk);


//zz// we don't enable WKUP_L4_WKUP(interface clock)
// so Uart0 Clock is WKUP_UART0 functional clock
// Table 19-4. UART0 => Uart0 clk is (PER_CLKOUTM2/4)
/* UART0 */
writel(PRCM_MOD_EN, &cmwkup->wkup_uart0ctrl);
while (readl(&cmwkup->wkup_uart0ctrl) != PRCM_MOD_EN)
;


}


//zz// 8.1.12.2.52 CM_L4_WKUP_AON_CLKSTCTRL Register (offset = CCh)
// L4_WKUP(did not set,and implicitly) for OCP/interface clock
/* Enable the required interconnect clocks */
enable_interface_clocks();
/* Power domain wake up transition */
power_domain_wkup_transition();


//zz//####################################################################################
5.
寄存器 地址查找


1)
寄存器基址
手册 2 Memory Map (寄存器基址)
Table 2-2. L4_WKUP Peripheral Memory Map
CM_PER 0x44E0_0000 0x44E0_3FFF 1KB Clock Module Peripheral Registers
CM_WKUP 0x44E0_0400 0x44E0_04FF 256 Bytes Clock Module Wakeup Registers
CM_DPLL 0x44E0_0500 0x44E0_05FF 256 Bytes Clock Module PLL Registers
CM_MPU 0x44E0_0600 0x44E0_06FF 256 Bytes Clock Module MPU Registers


2)
寄存器位偏移,位值意义


手册 8.1.12.2.12 CM_CLKSEL_DPLL_MPU Register (offset = 2Ch) [reset = 0h]
[18:8] DPLL_MULT DPLL multiplier factor (2 to 2047)
倍频(M),通常设置为想得到的 CLKOUT 频率
[6:0] DPLL_DIV DPLL divider factor (0 to 127) 
分频(N),通常设置为输入晶振频率(CLKINP,单位MHz)减1


手册 8.1.12.2.43 CM_DIV_M2_DPLL_MPU Register (offset = A8h) [reset = 1h]
[4:0] 设置 M2 分频系数为 1-31
通常设置为1,不再分频


手册 8.1.12.2.35 CM_CLKMODE_DPLL_MPU Register (offset = 88h) [reset = 4h]
[2:0] 设置 DPLL 模式
0x4 = DPLL_MN_BYP_MODE
0x7 = DPLL_LOCK_MODE


//zz//####################################################################################
6.
关于 Peripheral 时钟的设置(显性为 ADPLLJ/Per 时钟;使能了Functional就一定是,此时OCP被关断)
Functional Clock: explicitly
Inteface Clock(OCP): implicitly


例如 UART0 的 Functional Clock 使能有如下这段说明 
8.1.12.2.46 CM_WKUP_UART0_CLKCTRL Register (offset = B4h) 
0x02: Module is explicitly enabled. Interface clock (if not
used for functions) may be gated according to the clock domain
state. Functional clocks are guarantied to stay present. As long as in
this configuration, power domain sleep transition cannot happen

//zz//####################################################################################



  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 赛题.xlsx是针对计算机检测维修与数据恢复的竞赛项目的文件。该文件可能包含关于各种计算机问题的数据和信息。 在计算机检测维修赛项中,参赛者可能需要利用给定的信息和数据,识别和解决计算机故障或问题。这些问题可能涵盖硬件故障、软件错误、系统崩溃等各种方面。比赛可能要求参赛者通过分析和检测来确定问题的根本原因,并提供相应的维修方法或方案。 在数据恢复赛项中,参赛者可能需要应对意外数据删除、文件损坏、病毒攻击等情况下的数据恢复操作。他们可能需要使用专业的数据恢复软件或工具来恢复损坏或丢失的数据,还可能需要进行数据重建和修复。 这个赛题的目的是考察参赛者在计算机检测维修和数据恢复方面的技能和知识。参赛者需要有扎实的计算机硬件和软件知识,能够熟练操作相关设备和工具,并能够运用逻辑和分析能力解决各类计算机问题。 通过参加这样的竞赛,参赛者可以不断提升自己在计算机领域的技能和经验,并与其他专业人士进行交流和学习。这有助于推动计算机技术的发展和创新,提高整个行业的水平和质量。 ### 回答2: zz-2022031 计算机检测维修与数据恢复赛项赛题.xlsx 是一个计算机检测维修与数据恢复赛项的赛题文件。这个文件包含了一系列问题和数据,旨在测试参赛者在计算机检测维修和数据恢复方面的能力。 根据赛题文件的名称,我们可以推断出参赛者需要通过这个文件来完成计算机检测维修和数据恢复的任务。这可能涉及到从已损坏的计算机系统中检测并修复各种问题,以及从受损的存储介质中恢复丢失的数据。 赛题文件很可能由多个表格组成,其中每个表格可能都有一些列和行,包含了相关的问题和数据。参赛者可能需要仔细阅读文件中的每个表格,理解每个问题的要求,并找到解决问题所需的数据。 为了完成这个赛题,参赛者很可能需要具备计算机检测维修和数据恢复方面的相关知识和技能。他们需要了解不同类型的计算机问题和故障,以及如何使用适当的工具和技术进行修复。此外,他们还需要了解数据恢复的原理和方法,以便从受损的存储介质中恢复数据。 参赛者在完成赛题时可能需要遵循一定的步骤和规定,以确保他们的解决方案符合要求。他们可能需要记录下他们的思路和解决方法,并最终在规定的时间内提交他们的答案和结果。 综上所述,zz-2022031 计算机检测维修与数据恢复赛项赛题.xlsx 是一份用于测试参赛者计算机检测维修和数据恢复能力的赛题文件。通过仔细阅读其中的问题和数据,参赛者需要运用相关知识和技能来识别和解决计算机问题,并从受损的存储介质中恢复丢失的数据。完成赛题需要一定的步骤和规定,并最终提交解决方案和结果。 ### 回答3: 《zz-2022031 计算机检测维修与数据恢复赛项赛题.xlsx》是一份比赛题目文件,主要涉及计算机检测维修和数据恢复两个方面。该文件可能包含以下内容: 1. 计算机检测:赛题文件中可能包含计算机硬件或软件故障的相关信息。参赛者可能需要根据提供的数据,进行故障诊断和修复。比如,可能涉及计算机启动问题、蓝屏错误、软件崩溃等常见故障,参赛者需要通过分析提供的相关数据,找出故障原因,并给出相应的修复方案。 2. 数据恢复:赛题文件还可能包含数据恢复的相关内容。参赛者可能需要从损坏或意外删除的文件中恢复数据。比如,可能会给出一个损坏的硬盘镜像文件或者被删除的文件碎片,参赛者需要通过恢复数据的技术手段,尽可能地还原损失的文件信息。 参与该比赛的选手需要具备计算机故障诊断、维修以及数据恢复的技能和知识。这些技能包括但不限于:计算机硬件和软件基础知识、故障排除方法、数据恢复技术等。 此外,该赛题对参赛者的操作能力、分析能力和解决问题的能力有一定要求。参赛者需要能够迅速准确地分析问题,提出相应的解决方案,并进行实施。 总之,《zz-2022031 计算机检测维修与数据恢复赛项赛题.xlsx》是一份涉及计算机检测维修和数据恢复的比赛题目文件,参赛者需要通过分析提供的数据,诊断计算机故障并提供相应的修复方案,或者从损坏或删除的文件中恢复数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值