ARM Cortex-A8/A9开发板 | ARM11开发板ARM11开发套件 | ARM9开发板ARM9开发套件 | 飞思卡尔I.MX28I.MX6开发板 |
tiny210/mini210开发板 | mini6410开发板/套餐 | Tiny6410开发板无线套件 | mini2440开发板/套餐 | micro2440开发板带核心板 | 友善开发板配件 模块 | QQ2440 V3 SBC-2410X |
FL2440 OK2440-IV V4 | OK2440-III OK2440V3 | TE2440-II TE2440V2 | OK6410 S3C6410 ARM11 | FL6410/OK6410B ARM11 | TE6410 S3C6410 ARM11 | TE-9263 AT91SAM9263 | 开发板配件 模块和其他 |
Xilinx开发板/fpga开发套件 | altera开发板/fpga开发套件 | 基于FMC FPGA/DSP子卡 |
BeagleBoard原厂开发板 | PandaBoard原厂开发板 |
TI DM3730 DevKit8500D | TI系列 omap3530开发板 | ATMEL系列 开发板 | Samsung系列 开发板 | 开发板配件-仿真器 模块 | NXP LPC3250 mini3250 |
Tiny210 三星S5PV210 | Mini210/Mini210s开发板 | Tiny4412开发板Cortex-A9 | Tiny6410开发板 ARM11 | mini2440开发板 ARM9 | micro2440开发板 ARM9 | mini6410开发板 ARM11 | 友善ARM开发板配件 模块 |
keil ARM仿真器/开发工具 | STM32开发板 Cortex-M3 | NXP LPC开发板Cortex-M3 | ATMEL系列 ARM开发板 | Luminary EKK8962开发板 | Freescale i.MX31开发板 | 三星s3c2440 s3c6410开发板 |
FL2440 OK2440-IV V4 | OK6410 S3C6410 ARM11 | FL6410/OK6410B ARM11 | OK210/-A Cortex-A8 | TE2440-II TE2440V2 | TE6410 S3C6410 ARM11 | TE-9263 AT91SAM9263 | ARM开发板配件 模块等 |
Real6410开发板/套餐 | Real210开发板/Real2410 | WIFI GPS GPRS模块摄像头 |
Xilinx开发板/开发套件KIT | Altera开发板/开发套件KIT | 配套模块 |
NXP LPC开发板 ARM7 | Cortex-M3 STM32开发板 | 最小系统模块类(初学者勿选) | 开发工具 仿真器 调试器 | TFT液晶屏LCD 液晶模块 |
DM642开发板/DM642实验箱 | DM6446开发板/DSP实验箱 | DSP仿真器 液晶屏 摄像头等 |
DM3730/AM3715/AM3359 | OMAP3530AM1808AM3517 | 飞思卡尔Cortex-A9开发板 | ATMEL系列ARM开发板 | NXP LPC3250 LPC1788 | Samsung系列ARM开发板 | STM32系列F207/F407 | ARM开发板配件-仿真器 模块 |
Realv210 S5PV210开发板 | Real6410开发板 ARM11 | WIFI GPS GPRS模块摄像头 |
NXP LPC开发板 ARM7 | Cortex-M3 STM32开发板 | ARM小系统模块(初学勿选) | 开发工具 ARM仿真器 调试器 | TFT液晶屏LCD 液晶模块 |
keil ARM仿真器/开发工具 | STM32开发板 Cortex-M3 | NXP LPC开发板Cortex-M3 | ATMEL系列 ARM开发板 | Luminary EKK8962开发板 | Freescale i.MX31开发板 | 三星s3c2440 s3c6410开发板 |
Exynos4412开发板A9四核 | UT-S5PV210 S5PC100 | UT-S3C6410开发板 ARM11 | idea 6410开发板 ARM11 | UT-S3C2450开发板 ARM9 | UT-S3C2416开发板 ARM9 | UT-S3C6410核心板 工控 |
Xilinx开发板 FPGA开发套件 | altera开发板 FPGA开发套件 | FMC模块 配件 下载线 |
DM642开发板/DM642实验箱 | DM6446开发板/DSP实验箱 | DSP仿真器 液晶屏 摄像头等 |
s3c2410 ARM9 FS2410 | s3c2440开发板 ARM9 | s3c44B0开发板 ARM7 | s3c6410 2450 2443/13 | PXA270 PXA320 PXA255 | Atmel 9200 9261 9G20 | Philips NXP开发板YL-LPC | FS-EP9315开发板ARM9 | LCD液晶屏TFT真彩/触摸屏 | ARM仿真器/仿真调试工具 | ARM开发板配套ARM核心板 |
三星s3c2410 s3c44B0 | 三星s3c6410 s3c2443 | Intel PXA270 PXA320 | UP-CUP OMAP5910平台 | FPGA Xilinx altera平台 | 配件-仿真器 模块 液晶屏LCD | 龙芯开发板UP-DRAGON-I | 物联网教学科研设备 | EDA/FPGA/SOPC教学科研 |
utu2440-F-V4.5 含核心板 | utu2440-S-V4.1 单板结构 | YC2440-F-V5.1开发板 豪华型 | YC-ePC-A系列人机界面 | Mars-EDA套件CPLD FPGA | 触摸屏LCD 摄像头 WI-FI模块 |
ARM开发板/开发平台 | FPGA开发板/开发平台 | 编程器/烧写器下载器烧录 | ZLG 仿真器ARM FPGA DSP | ZLG周立功逻辑分析仪 |
DSP初学者开发套件(DSK) | DSP仿真器/仿真系统 | DSP开发板/DSP试验箱 | DaVinci系列多媒体平台 | Xilinx FPGA大学计划产品 | SEED教学实验系统 | FPGA/DSP FPGA开发板 | TI原厂开发板套件/CCS软件 |
ARM开发板 | XSCALE开发板 | ARM仿真器 | SOPC开发板 | DSP开发板 | 达芬奇系列DSP开发平台 | DSP仿真器 | DSP实验箱 | DSP专业研究平台 | ARM实验箱系列 |
广嵌实验室项目产品 | GEC2440/GEC6410开发板 |
泰克Tektronix示波器 | 普源RIGOL示波器 | USB虚拟示波器 |
UT-S5PC100 UT-S5PV210 | UT-S3C6410开发板 ARM11 | idea 6410开发板 ARM11 | UT-S3C2450开发板 ARM9 | UT-S3C2416开发板 ARM9 | UT-S3C6410核心板 工控 | 开发板模块wifi gps等 |
EMA OMAP3530开发板 | EMA OMAP 3530核心板 |
三星s3c2410 s3c44B0 | 三星s3c6410 s3c2443 | Intel PXA270 PXA320 | UP-CUP OMAP5910平台 | FPGA Xilinx Altera平台 | 配件-仿真器 模块 液晶屏LCD | 龙芯系列 UP-DRAGON-I |
utu2440-F-V4.5 含核心板 | utu2440-S-V4.1 单板结构 | YC2440-F-V5.1开发板 豪华型 | 触摸屏LCD 摄像头 WI-FI模块 | Mars-EDA套件CPLD FPGA | ePC系列工控一体机ARM9 A8 |
ARM开发板/开发平台 | FPGA开发板/开发平台 | 编程器/烧写器下载器烧录 | ZLG 仿真器ARM FPGA DSP | ZLG周立功逻辑分析仪 |
DSP初学者开发套件(DSK) | DSP仿真器 | DSP开发板 | DSP实验箱 | Xilinx FPGA大学计划产品 |
ARM开发板 | XSCALE开发板 | ARM仿真器 | SOPC开发板 | DSP开发板 | 达芬奇系列DSP开发平台 | DSP仿真器 | DSP实验箱 | DSP专业研究平台 | ARM实验箱系列 |
ARM开发板S3C6410等 | Cortex-A8/ARM11仿真器 | ADSP Blackfin开发板 | FPGA Spartan-3E开发板 |
GEC2410开发套件ARM9 | GEC2440开发套件ARM9 |
泰克 示波器 |
以前我移植的u-boot在启动的时候只支持128MB内存,因为最开始友善出的MINI6410只有128MB的DDR内存。但是后面他们升级为256MB的DDR了,我的U-boot一直没有修改,一直在凑合着用。最近几天,由于项目需要,看了一下DDR(1/2/3)的接口和相关的时序,就想到也让U-boot支持一下256MB的DDR,所有就稍微看了看S3C6410的DRAM控制器,调整了两个寄存器就实现了对256MB的支持。
首先你必须了解一下DDR SDRAM的原理和外部接口,这些在网上有几篇比较经典的文章这里推荐一下:
内存的原理和时序(SDRAM、DDR、DDR-Ⅱ、Rambus DRAM)
----------------------------------------------------------------------------------
2、MINI6410的内存硬件结构与寻址关系
在看过上面的文档之后,相信应该对DDR内存有了一个比较完整的认识和理解,下面我们就来讲讲在MINI6410上的内存硬件结构:
对于MINI6410的设计,用了两块引脚兼容的DDR内存芯片来实现128MB内存和256MB内存可共用一个PCB。
128MB内存使用的是两片K4X51163PG(32Mx16bit),形成一个32M×32bit(128MB)的内存。
256MB内存使用的是两片K4X1G163PE(64Mx16bit),形成一个64M×32bit(256MB)的内存。
而这两款芯片在引脚上的差别就是K4X51163PG的F7是NC脚,而K4X1G163PE的F7脚是A13。
这个F7引脚在128MB内存版本的MINI6410中这个引脚是不连接的,而256MB版本中是通过一个0欧电阻和S3C6410的Xm1ADDR13相连的。
看了这两个内存芯片和S3C6410(DRAM控制器)的数据手册的朋友一定知道,这种连接形成一个这样的寻址关系:
128MB内存版本:Xm1ADDR[15:14](bank):Xm1ADDR[12:0](行地址):Xm1ADDR[9:0](列地址) 。一共25根地址线刚好可寻址32M空间
256MB内存版本:Xm1ADDR[15:14](bank):Xm1ADDR[13:0](行地址):Xm1ADDR[9:0](列地址) 。一共26根地址线刚好可寻址64M空间
而这两种连接和芯片配置也要通过修改S3C6410的DRAM控制器的两个寄存器的参数来匹配。
----------------------------------------------------------------------------------
3、U-boot中内存自适应代码应处的位置
做好了以上的两个知识准备后,我们看看在u-boot中应该在什么位置来识别和自适应不同的内存大小。
首先我们在识别了内存大小之后可能需要重新配置S3C6410的内存控制器。这么一来,这些代码不能在DDR中运行。因为一旦重新配置内存控制器,必然导致内存暂时无法使用,如果代码在DDR中CPU可能无法得到下一步的代码。所以这些代码要放在u-boot实现自拷贝到内存之前的地方,其实最好的地方就是在u-boot的SPL部分中初始化内存控制器的代码段中。
这些代码就在:arch/arm/cpu/arm1176/s3c64xx/cpu_init.S
这个文件是汇编代码,其中的函数mem_ctrl_asm_init是通过start.S中的“bl lowlevel_init”------>/board/samsung/mini6410/lowlevel_init.S中的lowlevel_init ”bl mem_ctrl_asm_init”调用的。mem_ctrl_asm_init函数中的代码对S3C6410的DRAM控制器进行了初始化,并对外部的DDR内存也进行了初始化,所以内存的识别和自适应代码应该放在这些初始化之后。先识别内存的大小,如果内存大小和原先DRAM控制器的配置不相符,就修改DRAM控制器的配置。
----------------------------------------------------------------------------------
4、内存大小的识别
针对MINI6410的情况,我们只需要识别内存是128MB还是256MB。由于这两种内存大小关系到DRAM控制器的两个寄存器的参数,所有我们必须先假设我们的内存大小,再通过读写的方式来证明,如果证明我们的假设是错误的,再修改寄存器的参数。
我移植的U-boot代码中首先假设内存是256MB,并先配置DRAM控制器为256MB内存的参数。如果这时连接的是128MB内存,那么就会有这样一个有趣的现象:
由于Xm1ADDR[13]没有连接,所以DDR内存的第一个8M×32bit(32MB)和第二个8M×32bit(32MB)是镜像关系,第三个8M×32bit(32MB)和第四个8M×32bit(32MB)是镜像关系,以此类推。一共有四个这样的镜像关系,共256MB。如果连接的就是256MB的内存就不会有这样的现象。所以,只要我们证明了这种现象存在,就证明了我们其实连接的是128MB内存,然后重新配置DRAM控制器为128MB内存的参数就大功告成了。
所以我移植的U-boot代码中首先写一个32bit的测试数据到第一个8M×32bit(32MB)的某个位置(比如0x0地址),然后就去第二个8M×32bit(32MB)相应偏移位置读取,如果数据一致就可以证明镜像关系。但是还不保险,如果就是这么巧(在连接256MB的内存的情况下)第二个8M×32bit(32MB)相应位置本身就是这个数据怎么办?不要紧,我们再去第二个8M×32bit(32MB)同一位置写入另一个测试数据,然后去第一个8M×32bit(32MB)的那个位置(也就是一开始的那个写入位置)读取数据,如果数据一致就完全可以证明镜像关系。通过这样的两次测试,看看是否要重新配置DRAM控制器参数。
但是我们不能假设内存是128MB,并先配置DRAM控制器为128MB内存的参数。如果连接的是256MB的内存,没有任何特殊的现象可以测试到。通过上面的寻址关系,如果连接的是256MB的内存,只是第二、四、六、八(假设Xm1ADDR[13]一直是0)个8M×32bit(32MB)是没法访问的(可以说是内存空洞),这个无法通过读写证明。(通过寻址关系推断,未通过实验证明)
----------------------------------------------------------------------------------
5、关于内存控制器的重配置
如果上面的步骤中测试出了镜像的存在,我们必须重新配置两个寄存器的值,但是如何重新配置,这个三星的数据手册是没有讲的,我通过测试发现可以通过以下的步骤重新配置DRAM控制器:
1、将DRAM控制器设为暂停(Paused)状态;
2、检测P1MEMSTAT,直到确认了暂停(Paused)状态;
3、将DRAM控制器设为配置(Config)状态;
4、检测P1MEMSTAT,直到确认了配置(Config)状态;
5、修改需要重新配置的寄存器
6、将DRAM控制器设为启动(Go)状态;
7、检测P1MEMSTAT,直到确认了就绪(Ready)状态;
----------------------------------------------------------------------------------
所有的原理就总结到这里,具体的源码可以到这里下载、分析。
如果您认为我的方法不好,可以在评论中批评、指出。
如果有朋友有更好的办法来解决MINI6410内存的识别问题,也欢迎在评论中共享出来。
以下介绍的是u-boot-2010.09 针对友善之臂MINI6410移植的最基础版本,只包含了就基本的系统引导,NAND读写,DM9000网卡等等。但是这个足够开发的方便使用。今后会陆续添加原先我为mini2440添加的所有功能。
但是此次移植并非我的功劳,首先基本的移植是由Alex Ling <kasimling at gmail.com>完成的,你可以在这里看到他提交的补丁,但是编译后无法使用,可能是因为host系统不同,对脚本的解析不同,使得spl部分的生成出现问题,只需修改一下nand_spl目录下目标板目录的中config.mk中的
PAD_TO := $(shell expr $$[$(TEXT_BASE) + 4096])
即可。
DM9000的驱动没有太大的问题(修改了一点可能出现问题的地方,感谢肖工指教),但是原本的u-boot并没有调整所有SROM控制器的配置(其中包括连接DM9000所使用的bank1的总线),我使用了友善带的u-boot的参数配置了一下就好了。
一:http://www.icdev.com.cn/batch.viewlink.php?itemid=1694
ftp://ftp.denx.de/pub/u-boot/
去这2个网站随便下载都可以下载得到最新或者你想要的u-boot。现在我将下载u-boot-2010-09,这个也就是最新的版本啦。
下载后把它解压,然后得到u-boot-2010-09的文件夹,然后进去,并且做下面几件事情:
1:进入arch这个文件夹,把出arm外的前部文件夹删掉
2:进入board这个文件夹,把除samsung外前部文件夹删掉
3:进入include/configs,把除smdk6400.h外的所有文件删除。
4: 把顶层目录下有一个叫onenand_ipl的文件夹删除掉,因为没有用到。
5:进入nand_spl/board,把除samsung外全部文件删除掉。
6:再进入arch/arm/cpu文件夹,把除arm1176外其他文件夹删除掉。
7:再进入arch/arm/include/asm文件夹,把除arch-s3c64xx文件外带arch-XX的文件夹删除
8:再进入board/samsung文价夹下,把除smdk6400外其他文价夹删除掉。
至此已经把没用到或者不想见到它的文件夹跟文件删除掉了。爽吧。
二:
1:在顶层的目录下找到Makefile文件,并且打开,因为vi或者vim没用习惯而是改用gedit。
lwf@lwf-desktop:/home/u-boot-2010.12$ sudo gedit Makefile
在这个Makefile你会找到:
#########################################################################
## ARM1176 Systems
#########################################################################
smdk6400_noUSB_config \
smdk6400_config : unconfig
@mkdir -p $(obj)include $(obj)board/samsung/smdk6400
@mkdir -p $(obj)nand_spl/board/samsung/smdk6400
@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
@if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then \
echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
else \
echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
fi
@$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
然后我们可以这样为了适用我们的板子的仿照一下上面的写法于是就有这样:
#########################################################################
## ARM1176 Systems
#########################################################################
smdk6400_noUSB_config \
smdk6400_config : unconfig
@mkdir -p $(obj)include $(obj)board/samsung/smdk6400
@mkdir -p $(obj)nand_spl/board/samsung/smdk6400
@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
@if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then \
echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
else \
echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
fi
@$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
mini6410_noUSB_config \
mini6410_config : unconfig
@mkdir -p $(obj)include $(obj)board/samsung/mini6410
@mkdir -p $(obj)nand_spl/board/samsung/mini6410
@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
@if [ -z "$(findstring mini6410_noUSB_config,$@)" ]; then \
echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/mini6410/config.tmp;\
else \
echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/mini6410/config.tmp;\
fi
@$(MKCONFIG) mini6410 arm arm1176 mini6410 samsung s3c64xx
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
上面红色部分则为添加的代码。
四:修改
arch\arm\cpu\arm1176\s3c64xx\cpu_init.S后面添加外设存储的操作
bne check_dmc1_ready
nop
#if defined(CONFIG_MINI6410)
#define SROM_BC1_REG_Tacs (0x0) // 0clk address set-up
#define SROM_BC1_REG_Tcos (0x4) // 4clk chip selection set-up
#define SROM_BC1_REG_Tacc (0xE) // 14clk access cycle
#define SROM_BC1_REG_Tcoh (0x1) // 1clk chip selection hold
#define SROM_BC1_REG_Tah (0x4) // 4clk address holding time
#define SROM_BC1_REG_Tacp (0x6) // 6clk page mode access cycle
#define SROM_BC1_REG_PMC (0x0) // normal(1data)page mode configuration
#define SROM_BW_REG_DATA ((1<<7) | (1<<6) | (1<<4))
#define SROM_BW_REG_BC1 (0xf << 4)
#define SROM_BC1_REG_DATA ((SROM_BC1_REG_Tacs << 28) | (SROM_BC1_REG_Tcos << 24) | \
(SROM_BC1_REG_Tacc << 16) | (SROM_BC1_REG_Tcoh << 12) | \
(SROM_BC1_REG_Tah << 8) | (SROM_BC1_REG_Tacp << 4) | \
(SROM_BC1_REG_PMC))
ldr r0, =ELFIN_SROM_BASE
ldr r1, [r0, #SROM_BW_REG_DATA]
mov r2, #(~SROM_BW_REG_BC1)
and r1, r1, r2
mov r2, #SROM_BW_REG_DATA
orr r1, r1, r2
str r1, [r0, #INDEX_SROM_BW_REG]
ldr r1, =SROM_BC1_REG_DATA
str r1, [r0, #INDEX_SROM_BC1_REG]
#endif
mov pc, lr
五:arch\arm\cpu\arm1176\s3c64xx\Makefile
修改:
include $(TOPDIR)/config.mk
LIB = $(obj)lib$(SOC).a
SOBJS = reset.o
COBJS-$(CONFIG_S3C6400) += cpu_init.o speed.o
COBJS-$(CONFIG_S3C6410) += cpu_init.o speed.o
COBJS-y += timer.o
六:arch\arm\include\asm\arch-s3c64xx\s3c64x0.h
#ifndef __S3C64XX_H__
#define __S3C64XX_H__
#if defined(CONFIG_SYNC_MODE) && (defined(CONFIG_S3C6400) || defined(CONFIG_S3C6410))
#error CONFIG_SYNC_MODE unavailable on S3C6400, please, fix your configuration!
#endif
#include <asm/types.h>
七:arch\arm\include\asm\arch-s3c64xx\s3c6400.h
define ELFIN_SROM_BASE 0x70000000
#define SROM_BW_REG __REG(ELFIN_SROM_BASE + 0x0)
#define SROM_BC0_REG __REG(ELFIN_SROM_BASE + 0x4)
#define SROM_BC1_REG __REG(ELFIN_SROM_BASE + 0x8)
#define SROM_BC2_REG __REG(ELFIN_SROM_BASE + 0xC)
#define SROM_BC3_REG __REG(ELFIN_SROM_BASE + 0x10)
#define SROM_BC4_REG __REG(ELFIN_SROM_BASE + 0x14)
#define SROM_BC5_REG __REG(ELFIN_SROM_BASE + 0x18)
#define INDEX_SROM_BW_REG 0x0
#define INDEX_SROM_BC0_REG 0x4
#define INDEX_SROM_BC1_REG 0x8
#define INDEX_SROM_BC2_REG 0xC
#define INDEX_SROM_BC3_REG 0x10
#define INDEX_SROM_BC4_REG 0x14
#define INDEX_SROM_BC5_REG 0x18
八:在board\samsung建立Mini6410的文件夹,并且把smdk6400文件里面的所有文件复制过去
board\samsung\mini6410\lowlevel_init.S
_TEXT_BASE:
.word TEXT_BASE
.globl lowlevel_init
lowlevel_init:
mov r12, lr
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x55540000
str r1, [r0, #GPNCON_OFFSET]
ldr r1, =0x55555555
str r1, [r0, #GPNPUD_OFFSET]
ldr r1, =0xf000
str r1, [r0, #GPNDAT_OFFSET]
把这个上面的LED屏蔽掉
在这个添加
wakeup_reset:
ldr r0, =(ELFIN_CLOCK_POWER_BASE + WAKEUP_STAT_OFFSET)
ldr r1, [r0]
str r1, [r0]
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x3000
str r1, [r0, #GPNDAT_OFFSET]
把上面这个红色的屏蔽掉
#if !defined(CONFIG_S3C6400) && !defined(CONFIG_S3C6410)
ldr r1, [r0, #OTHERS_OFFSET]
bic r1, r1, #0xC0
orr r1, r1, #0x40
str r1, [r0, #OTHERS_OFFSET]
添加多一个标志定义!defined(CONFIG_S3C6410)
同样下面的也是添加
if defined(CONFIG_SYNC_MODE)
ldr r1, [r0, #OTHERS_OFFSET]
orr r1, r1, #0x20
str r1, [r0, #OTHERS_OFFSET]
#elif !defined(CONFIG_S3C6400) && !defined(CONFIG_S3C6410)
ldr r1, [r0, #OTHERS_OFFSET]
bic r1, r1, #0x20
str r1, [r0, #OTHERS_OFFSET]
#endif
mov pc, lr
board\samsung\mini6410\Makefile中
include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).a
COBJS-y := mini6410.o
SOBJS := lowlevel_init.o
board\samsung\mini6410\mini6410.c中把
头文件#include <netdev.h>屏蔽掉
并且屏蔽掉:
#define CS8900_Tacs 0x0
#define CS8900_Tcos 0x4
#define CS8900_Tacc 0xE
#define CS8900_Tcoh 0x1
#define CS8900_Tah 0x4
#define CS8900_Tacp 0x6
#define CS8900_PMC 0x0
static void cs8900_pre_init(void)
{
SROM_BW_REG &= ~(0xf << 4);
SROM_BW_REG |= (1 << 7) | (1 << 6) | (1 << 4);
SROM_BC1_REG = ((CS8900_Tacs << 28) + (CS8900_Tcos << 24) +
(CS8900_Tacc << 16) + (CS8900_Tcoh << 12) +
(CS8900_Tah << 8) + (CS8900_Tacp << 4) + CS8900_PMC);
}
cs8900_pre_init();
SROM_BW_REG |= 4 | 8 | 1;
int checkboard(void)
{
printf("Board: SMDK6400\n");
return 0;
}
把SMDK6400改成MINI6410
下面红色标记的也是要改成virt_to_phy_mini6410
#ifdef CONFIG_ENABLE_MMU
ulong virt_to_phy_smdk6400(ulong addr)
{
if ((0xc0000000 <= addr) && (addr < 0xc8000000))
return addr - 0xc0000000 + 0x50000000;
else
printf("do not support this address : lx\n", addr);
return addr;
}
#endif
屏蔽下面这段:
ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t *info)
{
if (banknum == 0) {
info->portwidth = FLASH_CFI_16BIT;
info->chipwidth = FLASH_CFI_BY16;
info->interface = FLASH_CFI_X16;
return 1;
} else
return 0;
}
把下面这个
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
return rc;
}
#endif
改成:
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bi)
{
int rc = 0;
#if defined(CONFIG_DRIVER_DM9000)
rc = dm9000_initialize(bi);
#endif
return rc;
}
#endif
九:drivers\net\dm9000x.c
DM9000_ior(DM9000_MRCMDX);
rxbyte = DM9000_inb(DM9000_DATA) & 0x03;
//MR. xiao
#if 1
u8 temp;
temp=DM9000_ior(DM9000_MRRH);
temp=DM9000_ior(DM9000_MRRL);
#endif
//MR. xiao
增加红色的部分
十:drivers\usb\host\ohci-hcd.c 添加下面红色的部分
#if defined(CONFIG_ARM920T) || \
defined(CONFIG_S3C24X0) || \
defined(CONFIG_S3C6400) || \
defined(CONFIG_S3C6410) || \
defined(CONFIG_440EP) || \
defined(CONFIG_PCI_OHCI) || \
defined(CONFIG_MPC5200) || \
defined(CONFIG_SYS_OHCI_USE_NPS)
# define OHCI_USE_NPS
#endif
十一:include\configs\mini6410.h
这个mini6410.h,自己建设一个,内容复制copy的就可以了。
然后打开mini6410.h修改如下:
//#define CONFIG_S3C6400 1
#define CONFIG_S3C6410 1
#define CONFIG_S3C64XX 1
#define CONFIG_MINI6410 1
*
* Architecture magic and machine type
*/
#define MACH_TYPE 2520
这个机械ID 我不知道为什么要改成2520 错了 内核是驱动不了的。
把CS89的网卡干掉 换成这样:
#define CONFIG_NET_MULTI 1
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_NO_SROM 1
#define CONFIG_DM9000_USE_16BIT 1
#define CONFIG_DM9000_BASE 0x18000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
#define CONFIG_ETHADDR 08:08:10:12:10:27
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.253
#define CONFIG_SERVERIP 192.168.1.159
#define CONFIG_GATEWAYIP 192.168.1.1
添加下面的宏(红色部分)
#define CONFIG_CMD_PING
#define CONFIG_CMD_ELF
#define CONFIG_CMD_FAT
#define CONFIG_CMD_EXT2
#undef CONFIG_CMD_IMLS
#define CONFIG_BOOTDELAY 3
#define CONFIG_SYS_LONGHELP
#define CONFIG_SYS_PROMPT "MINI6410 # "
改成你自己喜欢的提示字符 这里是"MINI6410 # "
**********************************
Support Clock Settings
**********************************
Setting SYNC ASYNC
----------------------------------
667_133_66 X O
533_133_66 O O
400_133_66 X O
400_100_50 O O
**********************************/
#define CONFIG_CLK_667_133_66
提高主频
把下面的全部删除掉
把#define CONFIG_SYS_FLASH_CFI 1
换成#define CONFIG_SYS_NO_FLASH
*-----------------------------------------------------------------------
* FLASH and environment organization
*/
#define CONFIG_SYS_MAX_FLASH_BANKS 1
#define CONFIG_SYS_MAX_FLASH_SECT 40
#define CONFIG_AMD_LV800
#define CONFIG_SYS_FLASH_CFI 1
#define CONFIG_FLASH_CFI_DRIVER 1
#define CONFIG_SYS_FLASH_CFI_WIDTH FLASH_CFI_16BIT
#define CONFIG_FLASH_CFI_LEGACY
#define CONFIG_SYS_FLASH_LEGACY_512Kx16
#define CONFIG_SYS_FLASH_ERASE_TOUT (5 * CONFIG_SYS_HZ)
#define CONFIG_SYS_FLASH_WRITE_TOUT (5 * CONFIG_SYS_HZ)
#define CONFIG_IDENT_STRING " for SMDK6400" 改成
#define CONFIG_IDENT_STRING " for MINI6410"
十二:include\common.h
添加如下:
#ifdef CONFIG_4xx
ulong get_OPB_freq (void);
ulong get_PCI_freq (void);
#endif
#if defined(CONFIG_S3C24X0) || \
defined(CONFIG_LH7A40X) || \
defined(CONFIG_S3C6400) || \
defined(CONFIG_S3C6410) || \
defined(CONFIG_EP93XX)
ulong get_FCLK (void);
ulong get_HCLK (void);
ulong get_PCLK (void);
ulong get_UCLK (void);
#endif
十三:顶层的MAKEALL
#########################################################################
## ARM11 Systems
#########################################################################
LIST_ARM11=" \
cp1136 \
omap2420h4 \
apollon \
imx31_litekit \
imx31_phycore \
imx31_phycore_eet \
mx31ads \
mx31pdk \
mx31pdk_nand \
qong \
smdk6400 \
tnetv107x_evm \
mini6410 \
"
十四:顶层的MAINTAINERS
Alex Züpke <azu@sysgo.de>
lart SA1100
dnp1110 SA1110
Alex Ling <kasimling at gmail.com>
MINI6410 ARM1176JZF-S (S3C6410)
十五:
nand_spl\board\samsung\mini6410\config.mk
修改为:
# FriendlyARM MINI6410 development board, based on
# Samsung S3C64xx Reference Platform (smdk6400) board
# TEXT_BASE for SPL:
#
# On S3C64xx platforms the SPL is located in SRAM at 0.
#
# TEXT_BASE = 0
include $(TOPDIR)/board/$(BOARDDIR)/config.mk
# PAD_TO used to generate a 4kByte binary needed for the combined image
# -> PAD_TO = TEXT_BASE + 4096
PAD_TO := $(shell expr $(TEXT_BASE) + 4096)
ifeq ($(debug),1)
PLATFORM_CPPFLAGS += -DDEBUG
endif
在nand_spl\board\samsung\mini6410这个mini6410是仿照里面的SMDK6400做的内容一样复制然后如下面的修改就可以
nand_spl\board\samsung\mini6410\Makefile中:
# from board directory
$(obj)lowlevel_init.S:
@rm -f $@
@ln -s $(TOPDIR)/board/samsung/smdk6400/lowlevel_init.S $@
改为:
# from board directory
$(obj)lowlevel_init.S:
@rm -f $@
@ln -s $(TOPDIR)/board/samsung/mini6410/lowlevel_init.S $@
博航网 www.broadon.net 版权所有
京ICP备10051899号-2 京公网安备110108006479号