u-boot移植---代码修改---存储控制器

游戏进行中 游戏进行中     2022-09-04     721

关键词:

一、CPU访问芯片的条件

  

  CPU通过访问存储控制器,来读取外部设备的数据。

  CPU想访问一个芯片,需要如下条件(配置信息):

    • 地址线
    • 数据线:8位/16位/32位数据宽度
    • 时钟/频率 
    • 其他芯片相关的特性:比如SDRAM,有行地址、列地址和bank

  SDRAM的访问和表格检索的原理一样,先指定一个行(Row),再指定一个列(Columu),就可以准确找到所需要的单元格。这个单元格称为存储单元,这个表格(存储阵列)就是逻辑Bank(Logical Bank,即L-Bank),SDRAM一般含有4个L-bank。  

  

  只有配置好了存储管理器,才知道如何去访问外部的设备。

二、存储控制器访问SDRAM

  2.1 原理图

  

  CPU侧:

      

  

  

  

  

  可以看看这些引脚的功能,查看SDRAM的芯片手册。

  LADDR:地址接口

  

  LnWBE[0:3]:bank的操作方式

  

  LDATA:数据接口

  

  LnWE

  

  更多的看数据手册。

三、存储管理器的配置  

  • 位宽
  • 行列地址
  • 刷新周期

  详细寄存器可以查看DATASHEET。

四、2440启动方式

4.1 NAND FALSH启动

  

4.2 NOR FLASH

  

五、代码

   内存控制器初始化代码:

  这里我们是从nor flash启动,因此CONFIG_SYS_TEXT_BASE定义的参数为0x0。

  lowlevel_init.S (board\samsung\jz2440) 

  1 #define BWSCON    0x48000000
  2 
  3 /* BWSCON */
  4 #define DW8            (0x0)
  5 #define DW16            (0x1)
  6 #define DW32            (0x2)
  7 #define WAIT            (0x1<<2)
  8 #define UBLB            (0x1<<3)
  9 
 10 #define B1_BWSCON        (DW32)
 11 #define B2_BWSCON        (DW16)
 12 #define B3_BWSCON        (DW16 + WAIT + UBLB)
 13 #define B4_BWSCON        (DW16)
 14 #define B5_BWSCON        (DW16)
 15 #define B6_BWSCON        (DW32)
 16 #define B7_BWSCON        (DW32)
 17 
 18 /* BANK0CON */
 19 #define B0_Tacs            0x0    /*  0clk */
 20 #define B0_Tcos            0x0    /*  0clk */
 21 #define B0_Tacc            0x7    /* 14clk */
 22 #define B0_Tcoh            0x0    /*  0clk */
 23 #define B0_Tah            0x0    /*  0clk */
 24 #define B0_Tacp            0x0
 25 #define B0_PMC            0x0    /* normal */
 26 
 27 /* BANK1CON */
 28 #define B1_Tacs            0x0    /*  0clk */
 29 #define B1_Tcos            0x0    /*  0clk */
 30 #define B1_Tacc            0x7    /* 14clk */
 31 #define B1_Tcoh            0x0    /*  0clk */
 32 #define B1_Tah            0x0    /*  0clk */
 33 #define B1_Tacp            0x0
 34 #define B1_PMC            0x0
 35 
 36 #define B2_Tacs            0x0
 37 #define B2_Tcos            0x0
 38 #define B2_Tacc            0x7
 39 #define B2_Tcoh            0x0
 40 #define B2_Tah            0x0
 41 #define B2_Tacp            0x0
 42 #define B2_PMC            0x0
 43 
 44 #define B3_Tacs            0x0    /*  0clk */
 45 #define B3_Tcos            0x3    /*  4clk */
 46 #define B3_Tacc            0x7    /* 14clk */
 47 #define B3_Tcoh            0x1    /*  1clk */
 48 #define B3_Tah            0x0    /*  0clk */
 49 #define B3_Tacp            0x3     /*  6clk */
 50 #define B3_PMC            0x0    /* normal */
 51 
 52 #define B4_Tacs            0x0    /*  0clk */
 53 #define B4_Tcos            0x0    /*  0clk */
 54 #define B4_Tacc            0x7    /* 14clk */
 55 #define B4_Tcoh            0x0    /*  0clk */
 56 #define B4_Tah            0x0    /*  0clk */
 57 #define B4_Tacp            0x0
 58 #define B4_PMC            0x0    /* normal */
 59 
 60 #define B5_Tacs            0x0    /*  0clk */
 61 #define B5_Tcos            0x0    /*  0clk */
 62 #define B5_Tacc            0x7    /* 14clk */
 63 #define B5_Tcoh            0x0    /*  0clk */
 64 #define B5_Tah            0x0    /*  0clk */
 65 #define B5_Tacp            0x0
 66 #define B5_PMC            0x0    /* normal */
 67 
 68 #define B6_MT            0x3    /* SDRAM */
 69 #define B6_Trcd            0x1
 70 #define B6_SCAN            0x1    /* 9bit */
 71 
 72 #define B7_MT            0x3    /* SDRAM */
 73 #define B7_Trcd            0x1    /* 3clk */
 74 #define B7_SCAN            0x1    /* 9bit */
 75 
 76 /* REFRESH parameter */
 77 #define REFEN            0x1    /* Refresh enable */
 78 #define TREFMD            0x0    /* CBR(CAS before RAS)/Auto refresh */
 79 #define Trp            0x0    /* 2clk */
 80 #define Trc            0x3    /* 7clk */
 81 #define Tchr            0x2    /* 3clk */
 82 #define REFCNT            1113    /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
 83 /**************************************/
 84 
 85 .globl lowlevel_init
 86 lowlevel_init:
 87     /* memory control configuration */
 88     /* make r0 relative the current location so that it */
 89     /* reads SMRDATA out of FLASH rather than memory ! */
 90     /* 初始化内存 */
 91     ldr     r0, =SMRDATA            /* 将SMRDATA的首地址(第一个.long)内存单元数据放置到r0寄存器中 r0=eac */
 92     ldr    r1, =CONFIG_SYS_TEXT_BASE    /* CONFIG_SYS_TEXT_BASE=0x0(include/configs/jz2440中定义) 
 93                                        代码的基地址 */
 94     sub    r0, r0, r1                    /* r0 = r0 -r1 */
 95     ldr    r1, =BWSCON    /* Bus Width Status Controller,BWSCON=0x48000000,此文件中定义 */
 96     add     r2, r0, #13*4            /* 将SMRDATA这一块地址赋值给r2中 */
 97 0:
 98     ldr     r3, [r0], #4            /* 将r0的值代表的内存单元放入r3中,之后r0的值偏移4位 */
 99     str     r3, [r1], #4            /* 将r3的值放入r1的值代表的地址中,r1的值代表的地址偏移4位 */
100     cmp     r2, r0                    /* 比较r2 和 r0 ,若不相等则执行下一句*/
101     bne     0b                        /* 向后跳转到标签0处*/
102 
103     /* everything is fine now */
104     mov    pc, lr                        /* 返回 */
105 
106     .ltorg
107 /* the literal pools origin */
108 
109 /* 
110  * 初始化存储控制器,经过此初始化之后,内存才可以使用
111  */
112  /* 地址为 0x00000eb0 */
113 SMRDATA:
114         .long 0x22011110     //BWSCON
115         .long 0x00000700     //BANKCON0
116         .long 0x00000700     //BANKCON1
117         .long 0x00000700     //BANKCON2
118         .long 0x00000700     //BANKCON3  
119         .long 0x00000740     //BANKCON4
120         .long 0x00000700     //BANKCON5
121         .long 0x00018005     //BANKCON6
122         .long 0x00018005     //BANKCON7
123         .long 0x008C04F4     //REFRESH
124         .long 0x000000B1     //BANKSIZE
125         .long 0x00000030     //MRSRB6
126         .long 0x00000030     //MRSRB7

 

u-boot移植---修改前工作:代码流程分析3---代码重定位

...链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds):     查看详情

u-boot移植---修改前工作:代码流程分析2

一、vectors.S1.1代码地址  vectors.S(archarmlib) 1.2流程跳转      跳转符号B为start.S中的reset执行代码,暂且先不看,先看看vector.S中的执行。1.3代码分析  ldr{条件}目的寄存器<存储器地址>1_start:23#ifdefCONFIG_SYS_DV_NOR_B... 查看详情

u-boot移植---代码修改---时钟修改sdram

...现在就需要做的是代码的修改,配置成适合目标板使用的u-boot。一、时钟修改  在代码流程分析中,我们知道,系统的启动是:设置CPU为管理员模式关闭看门狗屏蔽中断设置启动参数:时钟 FCLK:HCLK:PCLK=1:2:4   FCLK... 查看详情

u-boot移植---修改前工作:代码流程分析1

一、代码执行总体流程图1.1代码路径 U-boot.lds(archarmcpu) vectors.S(archarmlib) start.S(archarmcpuarm920t) lowlevel_init.S(boardsamsungjz2440) crt0.S(archarmlib)relocate.S(archarmlib) 查看详情

u-boot移植---代码修改---支持norflash

一、问题定位    开发板重启后打印了2个提醒和一个错误,caches的提醒先不看,看看flash和nand下面的提醒,badCRC,Usingdefaultenviroment,我们可以定位Usingdefaultenviroment定位到代码位置,如下:    Env_common.c(common)   ... 查看详情

u-boot移植---代码修改---nand

一、NAND原理    NAND无地址空间,地址和数据的发送都依赖于LDATA[0:7]这一串数据总线。     不看随机页编程,看到从高位到低位的页,总共分为64个页面,每个页的组成是2K+64 个byte,一个块的大小是(128K+4K)b... 查看详情

u-boot移植(十三)---代码修改---裁剪及环境变量一

一、内核裁剪  内核的裁剪首先就是修改我们的配置文件,即include/configs/jz2440.h文件,里面定义的很多宏,我们也许用不上的就要去掉。1/*2*(C)Copyright20023*SysgoReal-TimeSolutions,GmbH<www.elinos.com>4*MariusGroeger<[email protected]>... 查看详情

u-boot移植---代码修改---支持dm9000网卡

一、准备工作1.1原理图    CONFIG_DM9000_BASE  片选信号是接在nGCS4引脚,若要确定网卡的基地址,则要根据片选信号的接口去确定。  在三星2440的DATASHEET中memorycontrol这一章的Figure5-1.S3C2440AMemoryMapafterReset已经说明了片选4的... 查看详情

u-boot移植(十三)---代码修改---支持文件系统及补丁制作

一、烧写文件系统1.1jffs2烧写  1.下载文件系统:tftp30000000fs_mini_mdev.jffs2    2.擦除文件的块:nanderase.partrootfs    3.烧入文件系统:nandwrite.jffs2300000000x00260000 5b89a8    4.设置启动参数:setbootargsconsole=ttySAC0root=/d... 查看详情

移植最新u-boot之裁剪和修改默认参数

...ceinsight工程、编译、烧写、如果无运行分析原因  tarxjfu-boot-2012.04.01.tar.bz2  cdu-boot-2012.04.01  makesmdk2410_config  make2.分析u-boot:通过链接命令分析组成文件、阅读代码分析启动过程  a.初始化硬件:关看门狗、设置时钟、... 查看详情

tiny210(s5pv210)移植u-boot(基于2014.4版本号)——移植u-boot.bin(打印串口控制台)

...信息打印。在上节。我们看到调用relocate_code重定位。在u-boot的帮助文档doc/README.arm-relocation中对重定位有说明。u-boot为了生成位置无关码,在链接时指定了-pie选项,这个选项在u-boot-2014.04/arch/arm/config.mk中指定: 查看详情

u-boot-2014.10移植设置时钟/sdram(代码片段)

时钟修改vimarch/arm/cpu/arm920t/start.S#ifdefined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)ldrr1,=0x3ffldrr0,=INTSUBMSKstrr1,[r0]/*FCLK:HCLK:PCLK=1:2:4*//*defaultFCLKis120MHz!*/ldrr0,=CLKDIVNmovr1,#5strr1, 查看详情

linux系统移植:u-boot常用指令(上)(代码片段)

文章目录Linux系统移植:U-Boot常用指令(上)一、U-Boot命令行二、U-Boot常用命令(上)2.1help帮助命令2.2信息查询命令2.3环境变量修改命令2.4内存操作命令2.5网络操作命令Linux系统移植:U-Boot常用指令(... 查看详情

六,移植uboot-设置默认环境变量,完善u-boot(代码片段)

文档时间:2018-08-14交叉编译器:arm-linux-gcc-4.3.2Ubuntu版本:16.04uboot版本:2013.10 1,修改uboot默认环境变量前面章节得到的uboot串口打印信息如下:可以看出,读出的是坏的CRC,使用默认的环境变量,搜索"usingdefaultenvironment",... 查看详情

u-boot-1.1.6移植

...smdk2410.h直接复制为my2440.h)②修改两个Makefile   u-boot-1.1.6/Makefile  在 smd 查看详情

u-boot-2014.10移植(代码片段)

1/***************************************************23*u-boot版本:u-boot-2014.1045*gcc版本:/home/flinn/tools/4.4.3/bin/arm-none-linux-gnueabi-67*89*服务器:ubuntu14.051011*1213*编译命令:makesmdk2440_config;make1 查看详情

linux系统移植:u-boot工程创建(代码片段)

文章目录Linux系统移植:U-Boot工程创建一、U-Boot文件目录二、U-Boot目录解析2.1arch文件夹2.2board文件夹2.3config文件夹2.4.u-boot.xxx_cmd文件2.5顶层Makefile文件2.6u-boot.xxx文件2.7.config文件2.8README文件三、U-Boot过程创建3.1打开工程文件夹3... 查看详情

linux系统移植:正点原子u-boot移植(代码片段)

文章目录Linux系统移植:正点原子U-Boot移植一、What‘sU-Boot?1.1U-Boot简介1.2U-Boot选择二、正点原子U-Boot编译2.1编译环境2.2编译脚本三、U-Boot烧写与启动Linux系统移植:正点原子U-Boot移植一、What‘sU-Boot?1.1U-Boot简介Linux系统启... 查看详情