嵌入式爱好者

查看: 7933|回复: 6

修改bootloader把FCLK降到100MHz后,H-jtag识别不了

[复制链接]
neptune3464 该用户已被删除
发表于 2013-1-4 10:49:29 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

153

主题

3910

帖子

4207

积分

AM5718通行证AM335x通行证i.MX6UL通行证i.MX RT通行证i.MX6Q通行证XX18通行证TCU通行证FCU1401通行证FCU1301通行证FCU11xx通行证

发表于 2013-1-4 11:13:38 | 显示全部楼层

H-Jtag接口板调试总结


首先必须保证的三点:

1、  必须确保nRESET复位信号的电压为高电平,如果为低电平,则整个板子不工作

2、  确保arm周边的晶体或晶振是否能够有正确的时钟输出,如果不能,则整个板子不工作

3、  确保所有的电源有没有正常工作(1.8V、3.3V、5V等)

如果这三点保证不了会出现各种各样的错误



1

现象:

h-flasher提示“Can't download driver to specified address”错误



分析:

这个错误提示的是不能将驱动下载到正确的地址,这里的合适的地址只得就是sdram,因为我们如果通过jtag端口控制flash芯片时,我们依然需要将flash的驱动通过jtag口将其下载到sdram中,这样flash才能运行。出现这个错误我目前我接触到的就两个原因:一个是sdram虚焊或者坏掉了,或者周围的电容电阻有问题,另外一个就是有其他芯片处于输入输出状态影响了总线,所以jtag的数据不能传到sdram中。



解决办法:

1、  补焊sdram以及相关电阻电容

2、  查看有没有占用总线的元件,如fpga,可以重新刷一下 fpga的程序。



2、

现象:

h-flasher提示“Flash id does not match”错误



分析:

jtag需要读取flash的相关单元读取flash id,如果flash id可以读取出来,说明片子并没有完全不工作,但是flash id 缺不匹配,说明flash有虚焊。或者就是这个片子是新出厂的,新出厂的id与原来出场的id不同。



解决办法:

1、  补焊flash

2、  打开prgram file\H-JTAG下的FDevice文件夹,修改相应FLASH_ID为H-Flasher在programming后出错显示的那个id(reset按钮左边),就可以了



3、

现象:

H-flahser提示:“Error,can’t halt target and make it enter DEBUG state,please try again with lower tck speed”



分析:

这个错误说的还是听笼统的,就是不能进入调试状态,造成这个提示的原因有很多,如flash虚焊,晶振未起振,以及复位芯片有问题,包括即使复位信号为高电平,也可以造成这个现象,如复位信号不稳定。如果不焊接flash也会提示这个问题



解决办法:

1、  补焊flash(换flash)

2、  测试晶振

3、  测试复位信号(换复位芯片或将其焊下)



4、

现象:

Uboot启动后显示nandflash存储量为0,然而我们却可以通过h-flasher往flash中写入uboot



分析:

如果能往其中写程序,说明flash是好的,可能由于复位信号不稳定造成这个原因



解决办法:

更换复位芯片



5、

现象:

Uboot不断地重启



分析:

原因有很多,有可能是由复位信号不稳定造成的



解决办法:

    更换复位芯片

     

6、

现象:

写入uboot后,串口无输出



过程:

1、首先测试了一下arm有没有给调试串口芯片发送数据,发现没有数据。

2、用主机(串口助手)给调试串口发送数据,发现有数据。(推断串口芯片应该是好的,是因为arm没有从nandflash中读出uboot,所以uboot没有启动,以至于串口没有输出)

3、用h-flasher读出flash中的数据,与写入的uboot文件进行对比,发现读出的数据与uboot.bin的数据是不一样的,然后无论擦出还是重新写flash,其读出的值都没有任何改变。(推断flash坏了,换了一片flash)

4、换好的flash使用h-flasher擦除时不能成功,之后没有多久提示“can't halt target and make it enter DEBUG state,please try again with lower tck speed”错误

5、发现有个复位芯片焊接错误,复位信号不稳定,推断这是不能对flash进行擦除或写操作的原因

6、将错的复位芯片焊掉,之后工作正常。



解决办法:

    更换复位芯片



7、

现象:

    未焊接复位芯片的S接口板重新上电后无法正常启动,如果连接jtag并且复位一下则可以启动

原因:

    虽然默认的即使不焊接复位芯片时,复位信号连接着3.3V电源,则也可以提供复位信号,然而必须考虑刚上电的瞬间,在这一瞬间如果没有经过复位而cpu与其他元件直接运行,则由于不同步则可能cpu发出错误的指令得不到执行。如果有复位芯片会等到3.3V稳定之后复位一到两个周期,然后使cpu运行,则可以正常工作。这就是为什么jtag复位后,arm可以启动



解决办法:

    焊上复位芯片
技术支持电话:0312-3119192
技术支持邮箱:Linux@forlinx.com
点评回复 支持 反对

使用道具 举报

neptune3464 该用户已被删除
 楼主| 发表于 2013-1-4 11:25:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

153

主题

3910

帖子

4207

积分

AM5718通行证AM335x通行证i.MX6UL通行证i.MX RT通行证i.MX6Q通行证XX18通行证TCU通行证FCU1401通行证FCU1301通行证FCU11xx通行证

发表于 2013-1-7 10:05:23 | 显示全部楼层
一、对clock的基本认识
1 s3c2410的clock & power management模块包含三个部分:clock control、usb control、power control。现在的关注点是clock control。
    2、s3c2410有两个pll(phase locked loop,锁相环,在高频中学过,可以实现倍频,s3c2410的高频就是由此电路产生的)。其中一个是MPLL,M即为main,用来产生三种时钟信号:Fclk(给CPU核供给时钟信号,我们所说的s3c2410的cpu主频为200MHz,就是指的这个时钟信号,相应的,1/Fclk即为cpu时钟周期)、Hclk(为AHB bus peripherals供给时钟信号,AHB为advanced high-performance bus)、Pclk(为APB bus peripherals供给时钟信号,APB为advanced peripherals bus)。 在这里,需要了解一下AMBA system architecture了。这个可以到官方网站 www.arm.com 下载相关资料。简单的说,AMBA是一种协议,这种协议已经称为片上组织通信的事实上的标准(the de facto standard for on-chip fabric communication)。下面给出英文描述:
    The AMBA protocol is an open standard, on-chip bus specification that details a stategy for the interconnection and management of functional blocks that makes up a system-on-chip(SoC).It facilitates "right-first-time" development of embedded processors with one or more CPU/signal processors and multiple peripherals. The AMBA protocol enhances a resuable design methodology by defining a common backbone for SoC modules.
    需要知道的是,AMBA总线是ARM提出的一种解决方案,它并非唯一的规范,但是因为ARM的广泛使用,AMBA总线也就成为了事实上的规范了。现在AMBA总线最新为AMBA 3 specification版本,包括AMBA 3 AXI Inte**ce、AMBA 3 AHB Inte**ce、AMBA 3 APB Inte**ce、AMBA 3 ATB Inte**ce。而s3c2410还只能支持AMBA 2 specification,这个版本包含AMBA 2 AHB Inte**ce、AMBA 2 APB Inte**ce。也就是在s3c2410的框图中看到的两种总线接口。需要注意的是,这两种总线所连的外设是有区别的。AHB总线连接高速外设,低速外设则通过APB总线互连。显然,对不同总线上的外设,应该使用不同的时钟信号,AHB总线对应Hclk,APB总线对应Pclk。那么事先就应该弄清楚,每条总线对应的外设有那些,这样在设置好时钟信号后,对应外设的初始化的值就要依此而确定了。
    AHB bus上的外设有LCD controller(CONT代表controller,控制器)、USB Host CONT、ExtMaster、Nand CONT和nand flash boot loader、bus CONT、interrupt CONT、power management、memory CONT(sram/nor/sdram等)。
    APB bus上的外设有UART、USB device、SDI/MMC、Watch Dog Timer、bus CONT、spi、iic、iis、gpio、rtc、adc、timer/pwm。
    3、主时钟源来自外部晶振或者外部时钟。复位后,MPLL虽然默认启动,但是如果不向MPLLCON中写入value,那么外部晶振直接作为系统时钟。 EDUKIT-III的外部晶振有两个,一是用于系统时钟,为12MHz;一个用于RTC,为32.768KHz。以前实验没有向MPLLCON写入数值,所以系统时钟都是12MHz。从这里也可以发现一个问题,如果外部晶振开始没有焊上,那么系统是无法正常启动的。因为按照上述规则,复位后还没有写入 MPLLCON,这时又没有可以使用的时钟源,所以不会启动。也就是硬件完成后,这个12MHz的晶振是一定要焊上的,才能进行后续的硬件测试工作。
二、clock设置的步骤
    首先应该读懂下一段:

Power- On Reset  ( XTIpll)
Figure 7- 4 shows the clock  behavior during the power- on reset sequence.  The crystal oscillator begins oscillation within several milliseconds.  When nRESET is released after the stabilization of OSC ( XTIpll)  clock ,  the PLL starts to operate according to thedefault  PLL configuration.  However,  PLL is commonly known to be unstable after power- on reset ,  so Fin is fed directly to FCLK instead of the Mpll ( PLL output)  before the software newly configures the PLLCON.  Even if  the user does not  want to change the default  value of PLLCON register  after reset ,  the user shouldwrite  the same value into PLLCON register  by software.


The PLL restarts the lockup sequence toward the new  frequency only after the software configures the PLL with a new  frequency.  FCLK can be configured as PLL output ( Mpll)  immediately after locktime .
    这个主要是基于PLL的特点。简单的描述就是,上电复位后,几个ms后晶振起振。当OSC时钟信号稳定之后,nRESET电平拉高(这是硬件自动检测过程)。这个时候,PLL开始按照默认的PLL配置开始工作,但是特殊性就在于PLL在上电复位后开始是不稳定的,所以s3c2410设计为把Fin在上电复位后直接作为Fclk,这是MPLL是不起作用的。如果要想是MPLL起作用,那么方法就是写入MPLLCON寄存器值,然后等待LOCKTIME时间后,新的Fclk开始工作。下面把这些步骤分来来描述,软件步骤部分结合程序进行。
    1、上电几个ms后,晶振输出稳定。Fclk=晶振频率。nRESET恢复高电平后,cpu开始执行指令,这完全是硬件动作,不需要软件设置。
    2、第一步软件工作: 设置P M S divider control,也就是设置MPLLCON寄存器。
    关于PMS,可以看Figure 7-2.寄存器MPLLCON的设置呢,其实有一定的规则,并非你想要的每个Fclk频率都可以得到。官方推荐了一个表PLL VALUE SELECTION TABLE,要按照这个进行。否则的话,就需要自己按照公式推算,但是mizi公司并不保证你的设置是合适的。所以,如果想要工作在200MHz,还是按照vivi的推荐值即可。

@ step1:  set P M S divider control
        mov  r1,  #CLK_CTL_BASE
         ldr r2,  = vMPLLCON_200
        str  r2,  [ r1,  #oMPLLCON]
    其中,MDIV=0x5c,PDIV=0x04,SDIV=0x00.公式Mpll(Fclk)=(m×Fin)/(p×(2^s))【m=MDIV+8, p=PDIV+2,s=SDIV】
    3、第二步软件工作: 设置CLKDIVN。
    这一步是设置分频系数,即Fclk为cpu主频,Hclk由Fclk分频得到,Pclk由Hclk分频得到。假设Hclk是Fclk的二分频,Pclk是 Hclk的二分频,那么分频系数比就是Fclk:Hclk:Pclk=1:2:4.那么Hclk为100MHz,总线时钟周期为10ns。Pclk为 50MHz。

@ step2:  change clock divider
        mov  r1,  #CLK_CTL_BASE
        mov  r2,  #vCLKDIVN
        str  r2,  [ r1,  #oCLKDIVN]
    4、第三步软件工作: CLKDIVN的补充设置
  

If  HDIVN =  1,  the CPU bus mode has to be changed from the fast bus mode to the asynchronous bus mode using  following instructions.
MMU_SetAsyncBusMode
        mrc p15, 0, r0, c1, c0, 0
        orr r0, r0, # R1_nF: OR : R1_iA
        mcr p15, 0, r0, c1, c0, 0
If  HDIVN= 1 and  the CPU bus mode is the fast bus mode,  the CPU will operate by the HCLK.  This  feature can be used to change the CPU frequency as a half without affecting the HCLK and  PCLK.
    看了上段话,只需要翻译出来就可以了。

@ FCLK: HCLK= 1: 2
. macro  MMU_SetAsyncBusMode
         mrc p15,  0,  r0,  c1,  c0,  0
         orr r0,  r0,  #( R1_iA |  R1_nF)
         mcr p15,  0,  r0,  c1,  c0,  0
. endm
         @ step3:  set asynchronous bus mode
         MMU_SetAsyncBusMode
    5、第四步软件工作:等待locktime时间,让新的Fclk生效

@ step4:  stay locktime
        mov  r1,  #CLK_CTL_BASE
         ldr r2,  = vLOCKTIME
        str  r2,  [ r1,  #oLOCKTIME]
    6、对外设的影响
    在这个实验中,主要是有两个需要改变,一个外设是UART,一个外设是SDRAM。
    (1)UART,它是接在APB总线上,所以对应的时钟信号为Pclk,现在为50MHz。如果想要设置波特率为115200bps,那么根据公式 UBRDIV0=(int)(PCLK/(bps*16))-1计算,应该为26。如果放到程序中,那么应该注意形式。具体如下:

UBRDIV0 =  ( ( int ) ( PCLK/ 16. / UART_BAUD_RATE)  - 1) ;
    (2)SDRAM,主要的影响因素为刷新频率。前面在SDRAM中没有具体分析,现在可以详细说明。使用了两片HY57V561620CT-H,查看手册其刷新频率为8192 refresh cycles/64ms,所以刷新周期64ms/8192=7.8125us。看寄存器REFRESH的各个位的设置情况:
    ·REFEN[23]:开启自动模式,设为1
    ·TREFMD[22]:设为Auto refresh模式,设为0
    ·Trp[21:20]:看看RAS precharge Time,查看SDRAM手册,发现-H系列此参数至少为20ns,现在Hclk对应的时钟周期为10ns,所以至少应该为2个clock。可以设为00
    ·Tsrc: Semi Row Cycle Time,也就是RAS Cycle Time,至少65ms,所以至少得6.5clock,按照可选值,应该设置为11
    ·Refresh[10:0]:
    公式refresh period = (2^11 - refresh_count +1)/Hclk,由此推导出refresh_count=2^11+1-refresh period*Hclk。带入数值,计算得出1268=0x04f4,这个数值要用四舍五入,减少误差。
    ·其余的保留值,均设置为0
    由此得出该寄存器的值应该为0x008c04f4。


技术支持电话:0312-3119192
技术支持邮箱:Linux@forlinx.com
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2025-4-20 23:37

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表