DM365 linux kernel 移植总结

内核:Linux Kernel v2.6.32-rc2-davinci1

主芯片: DM365

板子:  APPRO改版

 流水帐:

1)默认配置文件:

        arch\arm\configs\davinci_dm365_gstreamer_defconfig

#
# DaVinci Board Type
#
#CONFIG_MACH_DAVINCI_DM365_EVM is not set
CONFIG_MACH_DAVINCI_DM365_GSTREAMER=y

2)板子相关初始化:

      arch\arm\mach-davinci\board-dm365-gstreamer.c 

-->MACHINE_START(DAVINCI_DM365_EVM, "DaVinci DM365 Gstreamer")

     Makefile修改:

 +   obj-$(CONFIG_MACH_DAVINCI_DM365_GSTREAMER) += board-dm365-gstreamer.o

3)arch\arm\mach-davinci\Kconfig 添加:

config MACH_DAVINCI_DM365_GSTREAMER
 bool "TI DM365 GSTREAMER"
 default ARCH_DAVINCI_DM365
 depends on ARCH_DAVINCI_DM365
 help
   Configure this option to specify the whether the board used
   for development is a DM365 GSTREAMER 

4)include/asm-arm/mach-types.h

Machine type配置,因为Kconfig已经添加新板型号,在board-dm365-gstreamer.c 中然旧使用了DAVINCI_DM365_EVM,不做以下修改会导致:kernel启动到start_kerenl时machine 匹配失败,但在之前(head.s  head-common.S)启动能顺利。

#ifdef CONFIG_MACH_DAVINCI_DM365_GSTREAMER
# ifdef machine_arch_type
#  undef machine_arch_type
#  define machine_arch_type __machine_arch_type
# else
#  define machine_arch_type MACH_TYPE_DAVINCI_DM365_EVM
# endif
# define machine_is_davinci_dm365_evm() (machine_arch_type == MACH_TYPE_DAVINCI_DM365_EVM)
#else
# define machine_is_davinci_dm365_evm() (0)
#endif

5) arch/arm/mach-davinci/include/mach/hardware.h添加

#define davinci_readb(a) (*(volatile unsigned char  *)IO_ADDRESS(a))
#define davinci_readw(a) (*(volatile unsigned short *)IO_ADDRESS(a))
#define davinci_readl(a) (*(volatile unsigned int   *)IO_ADDRESS(a))

#define davinci_writeb(v,a) (*(volatile unsigned char  *)IO_ADDRESS(a) = (v))
#define davinci_writew(v,a) (*(volatile unsigned short *)IO_ADDRESS(a) = (v))
#define davinci_writel(v,a) (*(volatile unsigned int   *)IO_ADDRESS(a) = (v))

方便访问寄存器。

6)Uncompressing Linux............................................................ ........................... done, booting the kernel. 死在这里.

     a)添加Kernel hacking->[*]Kernel low -level debugging functions的支持。

在start_kernel()中使用printascii() 调试启动情况,当然之前阶段启动也可以用printascii()调试 bl printascii  ,汇编的时候如果需要打印不同信息最好自己在对printascii封装下。

     b)用led点灯,注意MMU打开后需要使用虚地址。以下代码最终未通过.......

  #define IO_OFFSET 0xfa000000 /* Virtual IO = 0xfbc00000 */
  #define SM_PINMUX2 0x01C40008//0xfbC40008//
   #define GIO68   0x10
   #define GIO69   0x20
   #define GPIO_BASE  0x01c67000  
   #define BANK4_BASE  GPIO_BASE + 0x60
   #define BANK4_DIR   BANK4_BASE + 0
   #define BANK4_SET   BANK4_BASE + 8
   #define BANK4_CLR   BANK4_BASE + 12

/*.global gpio69clr  */
.type __gpio69clr, %function
__gpio69clr: 
 //config
 ldr R6,=SM_PINMUX2
 ldr R7,[R6]
 bic R7,R7,#0x03
 str R7,[R6]
  //getdir
  ldr R6,=BANK4_DIR
  ldr R7,[R6]
  //setdir
  bic R7,R7,#GIO69
  str R7,[R6] /*R0 -> BANK23_DIR   */
  //getset
  ldr R6,=BANK4_SET
  ldr R7,[R6]
  //set-set
//  ldr R6,=GIO69
//  orr R7,R6  //*拉高*/
 bic R7,R7,#GIO69 /*拉低*/
  ldr R6,=BANK4_SET
  str R7,[R6] /*回写 R0*/
  /*return*/
  mov pc, lr
// ENDPROC(__gpio69clr)

/*.global gpio68set  */
.type __gpio68set, %function
__gpio68set: 
 //config
 ldr R6,=SM_PINMUX2
 ldr R7,[R6]
 bic R7,R7,#0x0C
 str R7,[R6]
  //getdir
  ldr R6,=BANK4_DIR
  ldr R7,[R6]
  //setdir
  bic R7,R7,#GIO68
  str R7,[R6] /*R0 -> BANK23_DIR   */
  //getset
  ldr R6,=BANK4_SET
  ldr R7,[R6]
  //set-set
  ldr R6,=GIO68
  orr R7,R6  //*拉高*/
  ldr R6,=BANK4_SET
  str R7,[R6] /*回写 R0*/
  /*return*/
  mov pc, lr

调试发现是start_kernel()时machine num不匹配,但第一阶段(head.s  head-common.S)能正确匹配。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值