arm linux clock implement

本文介绍了在移植新版内核过程中遇到的时钟管理问题及解决方案。针对缺少时钟管理代码的情况,通过参考其他板子的内核代码和数据手册,实现了时钟使能、禁用和获取频率等功能。

随性写的,不够完整,暂时先记着,还有一些没搞清楚呢!~

 

近日在做新版内核的移植工作,将原来的BSP弄进最新内核2.6.31-rc7中(已经又出新的了)。

 

在改写系统定时器(sys_timer)部分时,发现总缺少什么东西,我也不知道少什么,老大的提议+参考大牛的代码,发现这个BSP竟然没有clock管理的代码,不过也对,他们是本着能跑的理念来完成这个BSP,没有用到的就省略了,也不能怪他们。那我们就得自己实现咯!硬件、时钟对我来说还是比较吃力的,原理至今还不太清楚,参看了几块板子的内核代码和datasheet,发现时钟这些,起码在名字上是基本同一的,原来我还以为每个板子自己瞎定的。

 

时钟管理,主要的功能是使能某个时钟,因为一个时钟源通过PLL出来的频率,再加上divisor处理,就能达到可编程的时钟频率,每个硬件模块都可以有自己的频率,每个硬件模块都可以单独开关时钟。所以需要管理,因为多嘛!

 

我们的板子主要涉及到的时钟有:

PLL:时钟源出来时钟,这里可以理解为xtal时钟源;

    PLL_CPU:为其他硬件模块提供时钟的时候;

        PLL_USB:为USB HOST 控制器时钟

        FCLK: CPU 时钟(ARM926)

        HCLK: AHB总线上的硬件模块时钟

        PCLK: PHB总线上的硬件模块时钟

           RTC:实时时钟

           WDT:看门狗时钟

           TIMER:定时器时钟

因为TIMER的时钟源是可以选择的,1KHZ或者PCLK,如果选择PCLK,那就得从上面的层级结构中算出PCLK频率为定时器所用,时钟管理看似可有可无,不过为了扩展,有还是比没有好。

 

下面就是实现了,发现clk在arm linux下,主要有2类,一类如  mach-s3c24xx之类的,自己管理clock,一类如 mach-epxxx使用common/clock.c 的代码,通过内核来管理clock,这个common对代码 是 Russell 写的,也是新提倡的方式,那我当然得用,直接把mach-epxxx/clock.c 和头文件copy过来,根据需要加以修改,ops都不需要,提供3个API就是了: enable / disable / get_rate,因为我们这块板子时钟操作比较简单,这已经够用了,就这样实现啦!~呵呵,没啥东西,对了,还需要在mach-xxx/include/mach/下加个 clkdev.h,复制其他人的就好了,为什么需要,看代码就知道了。

 

也就是说,在arm linux 下实现 clock 管理很简单,3个文件:

mach-xxx/clock.c

mach-xxx/clock.h

mach-xxx/include/mach/clkdev.c

需要的其他文件就是,注册一些时钟,做做工作,配置配置,需要用的时候,clk_get()就能得到,然后操作,相当简单。我们现在就是这样做的。

       

在i.MX8平台上启用Cortex-M内核并配置SWD(Serial Wire Debug)接口,需要涉及多个步骤和关键配置点。以下是一个详细的实现指南: ### 启用Cortex-M内核 i.MX8系列芯片通常包含一个或多个Cortex-A内核以及一个Cortex-M内核(如Cortex-M7)。要启用Cortex-M内核,首先需要确保固件或操作系统正确加载到设备中,并且能够与Cortex-M进行通信。 1. **启动模式配置**:i.MX8平台支持多种启动模式,包括从内部ROM、外部NOR Flash、SD卡等启动。为了启用Cortex-M内核,必须通过SCU(System Control Unit)配置其启动地址。这可以通过SCFW(System Controller Firmware)提供的API来完成[^1]。 2. **SCU配置**:SCU负责管理多核系统的资源分配和电源管理。使用SCFW API可以设置Cortex-M内核的启动地址,并将其从低功耗状态唤醒。例如,在SCFW中调用`sc_pm_set_resource_power_mode()`函数来控制Cortex-M的电源域[^2]。 3. **加载固件**:Cortex-M内核需要运行特定的应用程序或固件。该固件可以通过Bootloader(如U-Boot)加载到SRAM或外部存储器中,或者直接烧写到非易失性存储器中。对于Linux系统,可以使用`firmware_loader`机制将固件加载到Cortex-M内核中[^3]。 4. **中断和DMA配置**:为了实现Cortex-M与其他处理器之间的高效通信,可能还需要配置中断控制器(GIC)和DMA通道。这涉及到对寄存器的直接操作,确保Cortex-M能够响应来自其他外设或处理器的中断请求[^4]。 ### 配置SWD接口 SWD(Serial Wire Debug)是一种用于调试ARM Cortex-M系列微控制器的标准调试接口。它比传统的JTAG接口更简单,仅需两根信号线:SWCLK(时钟)和SWDIO(数据输入/输出)。在i.MX8平台上配置SWD接口主要包括以下几个方面: 1. **引脚复用配置**:i.MX8平台的GPIO引脚具有多种复用功能。为了启用SWD接口,需要将相应的GPIO引脚配置为SWD功能。这通常是通过IOMUXC(Input/Output Multiplexer Controller)模块完成的。例如,在i.MX8M Mini上,SWDCLK和SWDIO对应的引脚可能是`GPIO1_IO00`和`GPIO1_IO01`,需要将它们的复用模式设置为`ALT5`以启用SWD功能[^5]。 2. **时钟配置**:SWD接口依赖于特定的时钟源。在i.MX8平台上,可以通过CCM(Clock Control Module)配置SWD的时钟频率。通常情况下,默认的时钟配置已经满足调试需求,但在某些特殊场景下可能需要调整时钟分频系数以适应不同的调试速度要求[^6]。 3. **调试工具连接**:一旦硬件引脚和时钟配置完成,就可以使用标准的SWD调试工具(如J-Link、ST-Link等)连接到目标设备进行调试。调试工具会通过SWD接口与Cortex-M内核建立连接,并提供断点、单步执行等功能[^7]。 4. **安全性和权限管理**:在某些情况下,可能需要对SWD接口进行安全性限制,防止未经授权的访问。i.MX8平台提供了多种安全机制,如TrustZone和HAB(High Assurance Boot),可以通过这些机制限制对Cortex-M内核的调试访问[^8]。 ### 示例代码:配置SWD引脚复用 以下是使用C语言配置i.MX8M Mini上的SWD引脚复用的示例代码片段: ```c #include <imx8mm_registers.h> void configure_swd_pins(void) { // 配置SWDCLK (GPIO1_IO00) 为SWD功能 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00 = IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00_MUX_MODE(5); // 配置SWDIO (GPIO1_IO01) 为SWD功能 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO01 = IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO01_MUX_MODE(5); } ``` 在这个示例中,`IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00_MUX_MODE(5)`表示将`GPIO1_IO00`引脚的复用模式设置为`ALT5`,即SWD功能。同样地,`GPIO1_IO01`也被配置为SWD功能。 ### 总结 启用i.MX8平台上的Cortex-M内核并配置SWD接口是一个涉及多个层次的任务,包括启动模式配置、SCU设置、固件加载、中断和DMA配置,以及SWD引脚复用和时钟配置。每一步都需要仔细检查和验证,以确保整个系统的稳定性和可靠性。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值