您好,欢迎来到61ic! | [登录] [注册] 忘记密码 | 设为首页 帮助
 . 网站首页 . 业界新闻 . 设计中心 . 移动技术 . TI专栏 . ADI专栏 . FPGA专栏 . 代码工厂 . 官方商城 . 
 . 活动专区 . 新品快递 . 解决方案 . 前沿科技 . TI资源 . ADI资源 . FPGA资源 . 下载中心 . 产品展示 . 
加入收藏
付款方式
联系我们
您现在的位置: 61IC电子在线 >> TI专栏 >> TI C6000 DSP和ARM >> OMAP-L1x处理器 >> 正文
  基于OMAPL138的linux内核移植           ★★★ 【字体:
基于OMAPL138的linux内核移植
作者:xjf616    文章来源:xjf616    点击数:    更新时间:2013-10-24    

TI的官网上下载适合omapl138linux内核源码。

或者下载OMAP-L138 的软件开发套件 (DVSDK)

http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/dvsdk/DVSDK_4_00/latest/index_FDS.html

DVSDK提供一套预先测试的系统软件组件,这些套件包括 Linux 内核、启动加载器、中间件、设备驱动程序、DSP 软件组件、应用程序框架以及构建工具。

dvsdk有很多版本,建议使用以下版本:

DVSDK_4.03 04_03_00_06

(注)DVSDK只能安装在ubuntu10.04

在笔者电脑上使用arm-2009q1-203-arm-none-linux-gnueabi

编译器能一次性编译过,后面使用dsplinkcmem等会省事很多。

给一个介绍建立dvsdk环境的链接:

http://processors.wiki.ti.com/index.php/Building_The_OMAP-L137_SDK#CMEM

 

 

安装好DVSDK后,KernelU-boot源码放在dvsdk目录下的psp目录。

 

 

TI官网上编译配置u-boot和内核的文档

http://processors.wiki.ti.com/index.php/GSG:_Building_Software_Components_for_OMAP-L1#Rebuilding_U-Boot

 

--------------------华丽分割线---------------背景介绍完毕------------------------------------------------

 

 

 

 

参考TI的官方Demo板再根据产品需求设计出的电路板,在修改内核和u-boot的主要工作针修改其板级配置文件,如何查找相关板级目录?

 

1、查找板级相关目录

 

TI官网上配置OMAP-L138内核的命令是:

make da850_omapl138_defconfig ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

 

该命令根据arch/arm/configs目录下的da850_omapl138_defconfig文件进行配置,打开该文件

241

# CONFIG_ARCH_TCC_926 is not set

# CONFIG_ARCH_LH7A40X is not set

# CONFIG_ARCH_U300 is not set

# CONFIG_ARCH_U8500 is not set

# CONFIG_ARCH_NOMADIK is not set

CONFIG_ARCH_DAVINCI=y

在这里只有CONFIG_ARCH_DAVINCI配置为y

 

打开arch/arm目录下的Makefile文件,搜索CONFIG_ARCH_DAVINCI

134

machine-$(CONFIG_ARCH_DAVINCI)             := davinci       

=>machine-$(y):=davinci 

=>machine-davinci

即表示与板级支持相关的配置都在arch/arm/machine-davinci目录下

 

arm目录下也有一些以plat-为前缀的目录,但是查看arch/arm/Makefile

plat-$(CONFIG_ARCH_MXC)            := mxc

plat-$(CONFIG_ARCH_OMAP)  := omap

plat-$(CONFIG_ARCH_S3C64XX)     := samsung

plat-$(CONFIG_ARCH_STMP3XXX) := stmp3xxx

plat-$(CONFIG_ARCH_TCC_926)      := tcc

plat-$(CONFIG_PLAT_IOP)        := iop

plat-$(CONFIG_PLAT_NOMADIK)    := nomadik

plat-$(CONFIG_PLAT_ORION)   := orion

plat-$(CONFIG_PLAT_PXA)              := pxa

plat-$(CONFIG_PLAT_S3C24XX)      := s3c24xx samsung

plat-$(CONFIG_PLAT_S5P)        := s5p samsung

plat-$(CONFIG_PLAT_SPEAR)   := spear

plat-$(CONFIG_PLAT_VERSATILE)  := versatile

并无davinci,即davinci平台下的omapl138用不上这些目录。

 

单单mach-davinci目录就有六十多个文件和目录,除了查看Makefile,可以从该文件是否编译出.o文件判断其是否参与了配置,如aemif.caemif.o文件,说明aemif.c参与了编译。那么这个文件就相对比较重要。

 

 

2linux的启动与如何通过板级配置目录mach-davinci初始化周边电路。

1vmlinuxzImageuImage的区别:vmlinux是单纯的内核文件,elf格式。zImage是经过压缩后的vmlinux再加上一段解压启动代码得到。uImage是在zImage的基础上加上一个长度为64字节的“头”,说明这个内核版本、加载位置、生成时间、大小等信息。笔者用的是uImage

Linux具体启动流程是:

             

arch/arm/boot/compressed/head.S

解压缩  

->arch/arm/kernel/head.S

  汇编初始化部分

->init/Main.c    

C语言初始化部分     

->arch/arm/kernel/Setup.c 

 初始化及板级交互具体函数

 

 

 

2)查看板级目录machine-davinci下的makefile和编译出来的.o文件确认那些文件参与了配置,其中主要是board-da850-evm.c     da850.c     devices-da8xx.c这三个文件,阅读并了解这些文件的结构和函数调用关系。

 

 

3MACHINE_START

board-da850-evm.c文件末尾有一段宏

2161

MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138/AM18x EVM")

       .boot_params  = (DA8XX_DDR_BASE + 0x100),

       .map_io          = da850_evm_map_io,

       .init_irq   = cp_intc_init,

       .timer             = &davinci_timer,

       .init_machine  = da850_evm_init,

MACHINE_END

这里定义了linux的启动地址,IO口复用da850_evm_map_io,中断初始化函数,板级初始化函数da850_evm_init(),即内核的setup.cmain.c是通过这个宏接受了板级的配置来进行初始化的。

内核分别调用了和配置了MACHINE_START宏中的函数和参数,主要是

static void __init da850_evm_map_io(void)static __init void da850_evm_init(void)

这两个函数主要是对omapl138管脚的复用映射和对整个板级电路各个模块如uartspivpiflcd等在内核中的注册和初始化。

 

4)修改内核调试串口号

在内核启动过程中,配置和初始化串口主要有:

arch/arm/mach-davinci/include/mach/uncompress.h      该文件配置串口以输出解压缩信息

90

              DEBUG_LL_DA8XX(davinci_da850_evm, 2);

改为

              DEBUG_LL_DA8XX(davinci_da850_evm, 0);

表示debugUART2调整为UART0

编辑arch/arm/mach-davinci/board-da850-evm.c

static __init void da850_evm_init(void)函数中屏蔽掉下面的语句

__raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);

这个语句让UART0停止工作。

 

串口的注册和配置都是在static __init void da850_evm_init(void)函数中进行的。

 

5)修改内核网口号及配置网络方式

网络方式主要有两种rmiimii。这里使用的是rmii方式。

编辑arch/arm/mach-davinci/devices-da8xx.c

385

修改

struct emac_platform_data da8xx_emac_pdata = {

       .ctrl_reg_offset      = DA8XX_EMAC_CTRL_REG_OFFSET,

       .ctrl_mod_reg_offset     = DA8XX_EMAC_MOD_REG_OFFSET,

       .ctrl_ram_offset     = DA8XX_EMAC_RAM_OFFSET,

       .ctrl_ram_size        = DA8XX_EMAC_CTRL_RAM_SIZE,

       .version          = EMAC_VERSION_2,

};

struct emac_platform_data da8xx_emac_pdata = {

       .ctrl_reg_offset      = DA8XX_EMAC_CTRL_REG_OFFSET,

       .ctrl_mod_reg_offset     = DA8XX_EMAC_MOD_REG_OFFSET,

       .ctrl_ram_offset     = DA8XX_EMAC_RAM_OFFSET,

       .ctrl_ram_size        = DA8XX_EMAC_CTRL_RAM_SIZE,

       .version          = EMAC_VERSION_2,

       .rmii_en         =     1,

};

rmii_en=1表示使用rmii方式,原来的结构体并没有对rmii_en赋值,即默认使用mii方式。所以这里要修改为rmii方式。

编辑arch/arm/mach-davinci/da850.c

698

修改

       /* VPIF Capture */

       MUX_CFG(DA850, VPIF_DIN0, 15,   4,    15,   1,    false)

       MUX_CFG(DA850, VPIF_DIN1, 15,   0,    15,   1,    false)

       MUX_CFG(DA850, VPIF_DIN2, 14,   28,   15,   1,    false)

       MUX_CFG(DA850, VPIF_DIN3, 14,   24,   15,   1,    false)

       MUX_CFG(DA850, VPIF_DIN4, 14,   20,   15,   1,    false)

       MUX_CFG(DA850, VPIF_DIN5, 14,   16,   15,   1,    false)

       MUX_CFG(DA850, VPIF_DIN6, 14,   12,   15,   1,    false)

       MUX_CFG(DA850, VPIF_DIN7, 14,   8,    15,   1,    false)

       MUX_CFG(DA850,      MCBSP1_CLKS,   1,    28,   15,   2,    false)

       /* VPIF Capture */

//     MUX_CFG(DA850, VPIF_DIN0, 15,   4,    15,   1,    false)

//     MUX_CFG(DA850, VPIF_DIN1, 15,   0,    15,   1,    false)

//     MUX_CFG(DA850, VPIF_DIN2, 14,   28,   15,   1,    false)

//     MUX_CFG(DA850, VPIF_DIN3, 14,   24,   15,   1,    false)

//     MUX_CFG(DA850, VPIF_DIN4, 14,   20,   15,   1,    false)

//     MUX_CFG(DA850, VPIF_DIN5, 14,   16,   15,   1,    false)

//     MUX_CFG(DA850, VPIF_DIN6, 14,   12,   15,   1,    false)

//     MUX_CFG(DA850, VPIF_DIN7, 14,   8,    15,   1,    false)

因为VPIF管脚和rmii功能复用了,所以这里要屏蔽掉vpif的管脚配置。

 

编辑arch/arm/mach-davinci/da850.c

556

修改

       MUX_CFG(DA850, RMII_MHZ_50_CLK, 15,   0,    15,   0,    false)

       MUX_CFG(DA850, RMII_MHZ_50_CLK, 15,   0,    15,   8,    false)

这里如果RMII_MHZ_50_CLK如果配置为8时表示使用内部时钟,配置为0时表示使用外部50M时钟,笔者使用的并无外部时钟,所以直接使用内部时钟。

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    OMAPL138 ubifs文件系统移植…
    GDBSERVER 用于OMAPL138调试…
    OMAPL138的DVSDK安装与使用(…
    OMAPL138的DVSDK安装与使用(…
    OMAPL138的DVSDK安装与使用(…
    OMAP片上PRU指令集
    OMAPL138开发笔记
    OMAPL138 pinmux setting
    PRU 扩展4路串口
    OMAPL138 PRU SOFT-UART实现…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61 湘ICP备13001086号-2