从盛夏走到深秋,我们继续DAVINCI DM365-DM368的开发。说来惭愧,人家51CTO热情支持本博客,而本人却一直没有像其他博客之星一样频繁更新博客,心里确实说不过去。管理公司确实很累,有更急的客户的项目要做,我们成功先推出了DM6446-810MHz的核心板( http://www.tongyetech.com ),期间深圳安防展也接见了几个其他市的客户,然后继续我们的DM368开发。
一、DM36X的BOOT过程介绍 DM36x的BOOT过程和DM6446、DM6467完全是一样的,因为都是ARM926EJS架构,里边都有一个RBL,这RBL在芯片出厂的时候都烧写在ROM里,芯片上电复位后RBL在运行,然后读取BOOT MODE引脚的电平状态,决定是从NAND FLASH还是从 MMC/SD、UART 、USB、 SPI、 EMAC、HPI中之一的方式BOOT,具体见SPRS558A.pdf和SPRUSG5A.pdf的介绍,这两个文档对硬件工程师、软件驱动工程师来说非常重要。#
# Start Addr Size Description
# -------------------------------------------
# 0x00001000 32K ARM TCM memory
# 0x80000000 48 MB Linux
# 0x83000000 12 MB Video driver memory (Linux)
# 0x83C00000 68 MB CMEM
# 0x88000000 BOTTOM ADDRESS load () {
modprobe cmemk phys_start=0x83C00000 phys_end=0x88000000 allowOverlap=1 phys_start_1=0x00001000 phys_end_1=0x00008000 pools_1=1x28672 useHeapIfPoolUnavailable=1
modprobe irqk
modprobe edmak
modprobe dm365mmap
mknod /dev/dm365mmap c `awk "\\$2==\"dm365mmap\" {print \\$1}" /proc/devices` 0
} 有些人定义CMEM共享内存小一点的话,那么这个值可以比60M大。后面的参数就是使用静态固定IP的NFS SERVER路径,进行NFS调试; 增加 #define CONFIG_IPADDR 192.168.1.188 #define CONFIG_SERVERIP 192.168.1.252 #define CONFIG_ETHADDR 00:03:55:88:00:00 定义板子自己的IP和MAC,这个MAC在保证和其他网络设备MAC不冲突的前提下,自己调试的时候顺便分配。SERVERIP就是我们LINUX开发环境的主机IP地址,主要用做TFTP和NFS调试。 #define CONFIG_EXTRA_ENV_SETTINGS \ "eraseenv=nand erase 0x00060000 0x00020000\0" \ "eraseall=nand erase 0x00000000 0x08000000\0" \ "updateuboot=tftp 0x84000000 dm368_uboot.bin;nand erase 80000 80000;nand write 84000000 80000 80000\0" \ "updatecore=tftp 0x84000000 dm368_kernel.bin;nand erase 0x00100000 0x00480000;nand write 84000000 100000 300000\0" \ "nand_boot=nboot 0x80700000 0 0x100000;bootm\0" \ "tftp_boot=tftpboot 0x80700000 dm368_kernel.bin;bootm\0" 这个很精典,我以前在DM6446上面U-BOOT-2009.03的移植上说过,在u-boot->的提示下,使用run 命令,就可以批量自动做一些操作。CONFIG_EXTRA_ENV_SETTINGS这个在u-boot-2010.12\common\env_common.c 和u-boot-2010.12\common\env_embedded.c有使用。你尽管在这里定义就可以了。 run eraseenv表示擦除u-boot的参数; run eraseall表示擦除整片NAND; run updateuboot表示通过TFTP烧写dm368_uboot.bin到板子上; run updatecore表示烧写内核文件,300000表示内核BIN的大小,我们这里直接定死,3M的内核BIN文件长度够用了,当然,你可以根据内核大小的动态长度改变烧写方法; TFTP先下载BIN文件(uImage)到DDR 的0x84000000地址,然后烧写到自己定义的分区上,这个和内核linux-2.6.32.17的分区是一一对应的,这点很重要; "nand_boot=nboot 0x80700000 0 0x100000;bootm\0";内核放在NAND的0x100000,我们使用run nand_boot进行板级内核启动; "tftp_boot=tftpboot 0x80700000 dm368_kernel.bin;bootm\0"使用TFTP进行内核软件启动,编译调试内核; 在run eraseenv中,我们使用0x00060000作为U-BOOT参数存放的偏移地址,长度使用128K-BYTE,所以在第183行处开始: #ifdef CONFIG_NAND_DAVINCI
#define CONFIG_ENV_SIZE (128 << 10) /* 128KiB */ //128K-byte for evn
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET 0x00060000
#undef CONFIG_ENV_IS_IN_FLASH
#endif 顺便说一下,我们一般不建议在U-BOOT里边通过TFTP下载和烧写至少几十M的文件系统,我们尽量简化U-BOOT的功能,因为我们产品的重点是在LINUX内核,所有的开发、应用、升级程序都是基于LINUX内核上的,所以我们建议通过LINUX内核驱动来烧写文件系统,这是后话。 4、使能使用tab键功能 这个功能就是能在U-boot->的命令提示符下使用tab键,所以说 在davinci_dm365evm.h里一定要在“#define CONFIG_SYS_HUSH_PARSER”的上一行或下一行定义CONFIG_AUTO_COMPLETE; 在u-boot-2010.12\common\command.c里,第165行,把“#if 0”改成“#if 1”; 在u-boot-2010.12\common\env_common.c里,第247行把“#if 0”改成“#if 1”; 5、增加GPIO驱动的功能和修改一些BUG 复位外围芯片,比如采用GPIO控制网口芯片复位,在u-boot-2010.12\board\davinci\dm365evm\dm365evm.c的board_init()函数,增加GPIO的复位驱动,对一些外围的芯片复位一下; 在u-boot-2010.12\common\cmd_nvedit.c里,第227行,把“((strcmp (name, "ethaddr") == 0)”用“(0”,这样就能任意修改保存在网口MAC地址ethaddr; 6、开始编译 在u-boot-2010.12\arch\arm的config.mk里 #CROSS_COMPILE ?= arm-linux- CROSS_COMPILE = arm-none-linux-gnueabi- 我们使用Code Sourcery ARM GCC Tool Chain的Sourcery G++ Lite 2009q1-203 for ARM GNU/Linux。 注意,除了UBL在UBL的文件夹内部编译外,其他的DVSDK的文件包u-boot,linux,dm365mm,irq ,edma,ceexamples,dmai,还有psp_examples,等等,都是在dvsdk_dm368_4_02_00_06的目录下编译,具体见dvsdk_dm368_4_02_00_06的Makefile。 u-boot的编译是:make u-boot,make u-boot_clean等等; 我们也可以在这个目录下自己生产一个build_uboot.sh的命令 #build u-boot in dvsdk4_02 make u-boot chmod 777 /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img cp -f /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img /tftpboot/dm368_uboot.bin 或者再增加build_uboot_all.sh #build u-boot in dvsdk4_02 make u-boot_clean make u-boot chmod 777 /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img cp -f /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/u-boot-2010.12/u-boot.img /tftpboot/dm368_uboot.bin 使用sh文件帮你做工,要多养成这样的习惯。 基本上,你的板子网口OK的话,可以通过TFTP把UBOOT烧进去吧,通过仿真器或者其他方式烧写,我们公司一般不用仿真器烧写,直接使用uart boot的方式烧写,自己写个uart boot的东西,好好看看dvsdk_dm368_4_02_00_06\psp\flash-utils的包里的东西,这里就保留吧。 到这里,整个u-boot-2010.12移植基本完成。有不足的地方还需其他网友指正。本人维护两个主芯片平台后,变得非常忙,但本人会坚持写下去,下一篇是linux-2.6.32.17的移植,以前写过三篇有关UBOOT的文章,包括S3C2440,本人的目的让大家缩短开发这些BOOT开发的时间,因为重点的开发是在内核和基于内核的应用程序(信息产业部也大力支持开源的linux及相关技术),让大家的音视频网络产品快点出来,改善人民的生活,推进这个社会的文明,文明是靠科技来推动的,让那些丑陋的、麻木缺德的、文明倒退的野蛮行为、愚民手段、空洞扭曲、侮辱国人智商的事情尽快暴露出来,碰到棘手的问题也能暴露出来,毕竟广大人民的智慧是无穷无尽的,是完全有能力解决问题的。但前提是我们要有这样的科技学术氛围,身上没有极其沉重的衣食住行的枷锁,也没把绝大部分时间浪费在外语和XX课上(看看人家德国吧),所以我们要坚持我们的技术之路。文明是靠科技来推动的,而科技需要我们千千万万的科技人员踏踏实实去动手做事的。 昨天才调试同TVP5158 D1的采集,终于看到图像了。心里很舒畅。顺便晒晒我们这段时间做的两款核心板:DM368和DM6446-810MHz核心板。核心板以最大限度方便客户进行功能扩展、集成应用,加快产品研发和上市,降低前期产品研发的风险。我们比较倾向项目合作,开发板不是我们开发的重点。
DM368核心板
DM368核心板硬件接口描述:
■板载存储器:
- 动态存储器(SDRAM DDR2):1Gb(128M-byte)
- 非易失存储器(NAND FLASH):1Gb(128M-byte)
■板载接口:
- 1个4位Boot模式选择接口
- 16-BIT YCC数字视频输入接口
- 2路可编程输出时钟CLOCK0和CLOCK2
- 1路模拟标清视频输出接口TVOUT
- 1路模拟高清视频输出接口YPbPr
- 1路麦克风差分输入接口
- 1路音频线性输出接口
- 1路喇叭差分输出
- 3路AD采集接口
- 1个SD卡接口SD0
- 1个10/100M网络差分输入输出接口RX和TX
- 2个RS232串口(UART0,UART1)
- 1个USB 2.0接口(HOST/DEVICE/OTG)
- 1个 SPI口SPI1
- 1个标准 JTAG接口
- 1个4×4键盘接口
- 18个独立GPIO口
- 3路电源输入接口+1.8V,+3.3V,+1.2V
■单板尺寸:
46mm x 46mm x 9.5mm
其中整体高度是9.5mm
DM6446-810MHz核心板
DM6446-810MHz核心板采用的是TI TMD320DM6446BZWT8的双核芯片,ARM9的频率达到405MHz,DSP-C64+核的频率达到810MHz,DDR2-667操作频率配置为189MHz,NAND FLASH为128M-BYTE。集成10M/100M网络芯片在核心板上,方便客户设计底板,70mm*47mm,整体高度9mm,比名片更小。
桐烨科技DM6446-810MHz核心板支持硬件接口:
1、VPFE16位总线及H、V信号,完全可以接视频采集芯片和CMOS SENSOR;
2、VPBE引出RGB24的控制信号,便于接RGB24的LCD屏;
3、CVBS模拟视频输出;
4、网口信号及网口LED、LINK信号;
5、I2C接口;
6、SPI接口;
7、SD卡接口;
8、ATA硬盘接口;
9、USB2.0 HOST接口;
10、ASP音频接口;
11、3个UART接口;
12、18个独立GPIO接口及其他复用的GPIO接口;
13、JTAG仿真器接口;
14、3个PWM控制线;
15、CLK_OUT0和CLK_OUT1可编程时钟输出信号;
16、TI的H264 ENCODE LIB达到720P(1280*720)的实时;
本文出自 “集成系统-踏上文明的征程” 博客,请务必保留此出处http://zjbintsystem.blog.51cto.com/964211/713240