当前位置: 首页 >> 程序设计 >> S3C2410软件调试总结和启动代码分析
 

S3C2410软件调试总结和启动代码分析

作者:      来源:zz     发表时间:2007-02-01     浏览次数:      字号:    

IO初始化
   将IO口配置为对应的功能选项,同时一般会点亮相应的LED灯。
  
中断初始化
   2410的内存空间没有remap的机制,应该中断入口时钟位于零地址。因此中断服务机制可以描述如下:
    首先,不管使用那种启动方式,必须确保一下代码段位于内存的0x0地址:
     b ResetHandler  
     b HandlerUndef ;handler for Undefined mode
     b HandlerSWI ;handler for SWI interrupt
     b HandlerPabort ;handler for PAbort
     b HandlerDabort ;handler for DAbort
     b .   ;reserved
     b HandlerIRQ ;handler for IRQ interrupt
     b HandlerFIQ ;handler for FIQ interrupt
    除ResetHandler外,其余各项都是由如下的宏定义的一段代码:
       HandlerFIQ   HANDLER  HandleFIQ
     MACRO
     $HandlerLabel  HANDLER  $HandleLabel
     $HandlerLabel
      sub sp,sp,#4            ;decrement sp(to store jump address)
      stmfd sp!,{r0}        ;PUSH the work register to stack
      ldr     r0,=$HandleLabel  ;load the address of HandleXXX to r0
      ldr     r0,[r0]            ;load the contents
      str     r0,[sp,#4]     ;store the contents(ISR) of HandleXXX to stack
      ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
        MEND
      这段代码的含义是通过堆栈将中断向量表中的内容赋给PC指针(如HandleFIQ是存放着FIQ服务程序入口地址的地址),自然程序就跳到相应的入口地址。
   可见,中断向量表存放的是各个中断服务程序的入口地址,它是用来被加载的,而并不是可执行代码。为了统一,所有示例程序都将中断向量表放在0x33ffff00开始的地址,并根据入口地址依次排列。
   需要注意的是如果各种模式的服务程序用C语言定义,那么类型必须用__irq定义,以保证能够正确返回。
  
初始化串口
     串口统一选用UART0,模式采用115200、1bit STOP、No Parity。
  
最后跳转到我们自己的应用程序!

附:我得程序所使用的地址空间结构以及MMU中C、B的设置:

      Blank Area: RW_FAULT   0x5b000000 ~ 0xffffffff
      
      Sram & SFR: NCNB           0x40000000 ~ 0x4affffff
      
      Blank Area: RW_FAULT    0x34000000 ~ 0x3fffffff

      Int_Vec, Stack, MTT: CNB  0x33f00000 ~ 0x33ffffff
      
      SDRAM Download: NCNB   0x31000000 ~ 0x33efffff
      
      SDRAM Exec RW: CB         0x30800000 ~ 0x30ffffff
      
      SDRAM Exec R CNB        0x30000000 ~ 0x307fffff
      
      Bank5, FPGA: NCNB          0x28000000 ~ 0x2fffffff
      
      Bank4, FPGA: NCNB            0x20000000 ~ 0x27ffffff
      
      Bank3, Bottom NIC: NCNB   0x18000000 ~ 0x1fffffff
      
      Bank2, Bottom Flash: CNB  0x10000000 ~ 0x17ffffff
      
      Bank1, Bottom Sram: CNB   0x08000000  ~ 0x0fffffff
      
      Bank0, Flash or Sram: CNB  0x00000000 ~ 0x07ffffff

Nor Flash Bootloader
  
这是我着手写的第一个程序,我的想*是让这个程序同时支持通过串口对Nand 和 Nor FLASH的烧写,如果不进行任何烧写,那么就跳到Nor Flash的第二个section启动应用程序,这样一来,即使脱离JTGA,我也可以使用串口进行盲调。

由于有现成的初始化文件和flash烧写的示例程序,开发起来还比较快。当然也遇到了一些问题,一开始连flash的device ID都读不出来,后来发现我指针没有定义成volatile类型,flash的操作时序被编译器优化了;再者,在对Nor Flash进行操作时,bank0在MMU中的类型一定要设为NCNB,这样比较保险。

遇到最大的问题就是下面的了,一开始我用jtag把程序下载到0x30000000的地方运行,对Nor Flash的烧写完全正常,但是当把程序下载到Nor Flash中启动运行后,再对Nor Flash的section 2进行烧写时,就出现了问题。所幸没多久我就意识到了问题,将程序放在Nor Flash中运行,同时有对同一片flash进行操作,那么操作时序势必会被CPU的指令读取时序所破坏,因此程序必须搬运到SDRAM中运行。

但是启动地址有必须是零地址,所以我采用了前文提到的scatter文件的方*,将非必要的代码全部搬到sdram中运行,scf文件格式就是前文中的那个。当然采用了__main的入口,调用了ADS的链接库,让它帮忙建立程序的运行环境。

至此,Nor Flash Bootloader可以顺畅无忧的实现其功能了。

Nand Flash Bootloader
  
因为Nor flash bootloader已经实现了对Nand Flash的烧写,因此在Nand Flash Bootloader中实现flash烧写并不是我的目的,况且,S3C2410运行在NAND BOOT模式下的时候,4K的SRAM位于0地址,上电时刻Nand Flash中block 0的前8个page的数据自动加载到SRAM后开始运行,Nor flash这个时候是不可见的。 因此,我做Nand Flash Bootloader的目的简单而又直接,就是把block1开始的若干个block数据加载到sdram首地址,然后PC跳到那里运行应用程序就可以 了。比方说我把编译好的ucos-ii代码放在block1,那么ucos-ii就可以跑起来了。

因此制作Nand Flash一个最重要的问题就是真个程序必须小于4K。应用程序应该是一个完整的应用代码,只是在编译时RO的起始地址应该定位成0x30000000, 如果直接用JTAG将其下载到对应地址,程序照样能够跑起来(当然零地址要有中断向量入口程序)。这里我偷懒了一下,将应用程序的中断向量表地址和 Nand Flash Bootloader设得完全相同,那样应用程序就可以借用bootloader的中断跳转程序以实现中断的正确跳转,当然应用程序也有自己相应的跳转代 码,但是这段代码位于SDRAM起始地址,是不会被执行的;至于堆栈,应用程序在自己得初始化代码中可以重新设置堆栈。

在Nand Flash的硬件方面,我开发板使用的是K9F5608(32M),相对于K9S208(64M),后者的地址需要写四次才能全部送出,而前者只要三次就 够了,2410的引脚中专门有nCON控制地址送出的次数。因此当硬件在这两者之间变化时,既要注意外部电路图的接*,又要注意软件代码的正确性。

RTL8019调试心得

一开始接触8019真的是让我头晕,首先我没有一点网络基础,另外,8019的datasheet称不上最烂也算是极品了。当初作PCB的时候选用8019主要是因为价格便宜以及lbbbb做过,能够提供源代码&技术支持。最后能搞定,我觉得还是很有成就感的。

8109AS的运行模式包括跳线模式、非跳线模式和PnP模式,PnP模式是在电脑上使用的即插即用模式,因此这里我们可以不予考虑。8109AS 的IO寄存器符合NE2000标准,分为4个page,其中page3是8109AS自己定义的寄存器。所谓跳线模式,是指8019AS I/O寄存器page3中的大部分配置寄存器(CONFIGn)的值是在上电复位时刻确定的,来源是在RESET上升沿时捕捉到的一些外部引脚的电平值。 在非跳线模式下,这些寄存器值的配置由外部EEPROM 93C46完成。配置寄存器在运行过程中大部分值时不能改变的。

目前驱动程序目前只实现了最基本的收发功能。片内16K的SRAM划分如下:40~46:发送缓冲区1;46~4c:发送缓冲区2;4c~80:接收缓冲区。

另外我在调试中发现片内的SRAM是不可按地址读的,虽然我在原理图上也象CS8900A那样连了mem_wr&mem_rd,但是似乎不能访问,希望哪位高人能够给我一个明确的回答。

起初作硬件了时候我加了93C46,想使用非跳线模式,JP脚就悬空在那里。后来93C46买不到,就一直空着,虽然8019的初始化没有出问题,但是对这种不洋不土的模式,我还是心有余悸,因此将JP脚接到了5V电源,板上唯一的飞线就是这么来礟OSThttp://bbs.edw.com.cn/S**ePost.asp?A   现在还有一个郁闷的问题就是linux 2.4.18是不支持8019的。天下的2410开发板都采用8900a也就是这个道理。所以,我还要完成驱动!!!

S3c2410 DMA介绍
  
之所以要介绍DMA,因为它对性能太重要了!只有活用了DMA,CPU的性能才能上去!S3c2410有四个DMA,每个DMA支持工作方式基本相同,但支持的source Dest可能略有不同,具体见Datasheet。

这里具体DMA CONTROL寄存器(DCON)的配置说明,进而引出DMA的各种工作方式。

Atomic transfer:指的是DMA的单次原子操作,它可以是Unit模式(传输1个data size),也可以是burst模式(传输4个data size),具体对应DCON[28]。

Data Size:指的是单次原子操作的数据位宽,8、16、32,具体对应DCON[21:20]。

Request Source:DMA请求的来源有两种,软件&硬件模块,由DCON[23]控制;当为前者时,由软件对DMASKTRIG寄存器的位0置位触发一次 DMA 操作。当为后者时,具体来源由DCON[26:24]控制,不同硬件模块的某时间触发一次DMA操作,具体要见不同的硬件模块。
  
DMA service mode:DMA的工作模式有两种,单一服务模式&整体服务模式。前一模式下,一次DMA请求完成一项原子操作,并且transfer count的值减1。后一模式下,一次DMA请求完成一批原子操作,直到transfer count等于0表示完成一次整体服务。具体对应DCON[27]。

RELOAD:在reload模式下,当transfer count的值变为零时,将自动加src、dst、TC的值加载到CURR_DST、CURR_SRC、CURR_TC,并开始一次新的DMA传输。该模 式一般和整体服务模式一起使用,也就是说当一次整体服务开始后,src、dst、TC的值都已经被加载,因此可以更改为下一次

   服务的地址,2410说明文档中建议加入以下语句来判断当前的服务开始,src、dst、TC的值可以被更改了:while((rDSTATn & 0xfffff) == 0) ;

Req&Ack:DMA请求和应答的协议有两种,Demard mode 和 Handshake mode。两者对Request和Ack的时序定义有所不同:在Demard模式下,如果

   DMA完成一次请求如果Request仍然有效,那么DMA就认为这是下一次DMA请求;在Handshake模式下,DMA完成一次请求后等待Request信号无效,然后把ACK也置无效,再等待下一次Request。这个设计外部DMA请求时可能要用到。

传输总长度:DMA一次整体服务传输的总长度为:
    Data Size × Atomic transfer size × TC(字节)。

后记 & 特别感谢
  
第一次写这么洋洋洒洒的文章,想必垃圾成分一定很高,不过能有那么一点点有用的东西,我也就很高兴了。毕竟自己这么一路走过来,真的是满有感触的。

在此,特别要感谢版上twentyone朋友对我的大力帮助,在高人的指点下,我长进不小,另外我用的他开发的JTAG代理软件XJTAG,个人觉得性能相当不错,各位在用简易JTAG口的,强烈推荐大家尝试:http://www.twentyone.blogchina.com/

走到这一步,我只能说精彩的生活刚刚开始,接下来我会在linux和FPGA上作一些文章,这两方面的工作我都刚刚开始,远不够深入啊!非常乐意和大家一起探讨、学习、交流,让我们一起进步!

[1] [2]

编辑 webmaster

 
 
 
评论更多>>
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •