内核: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)能正确匹配。