主题 : s3c6410 uboot 初始化 OTG 的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 53880
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2011-08-18
最后登录: 2012-02-23
楼主  发表于: 2011-11-23 18:46

 s3c6410 uboot 初始化 OTG 的问题

接触嵌入式开发时间不长,现在想实现 uboot 通过 usb 从 dnw 下载image,输入 dnw后就死循环了,
想知道:
1.6410 OTG 时钟是否只需要 48MHz那个?
  时钟配置相关的寄存器 除了S3C_OTG_PHYCTRL (PHYCLK,不明白UBOOT 为什么写成 CTRL),还需要设置其他寄存器么?
2.如何才能正常呢?
3.遇到这种问题怎么去思考解决呢?

[s3c_usb_core_soft_reset:340] the value of HCLK_GATE_REG is 0xFFFFFFFF.

输出如下:
Hit any key to stop autoboot:  0  

Aim6410 # dnw c0008000

[s3c_usbctl_init:429] USB Control Init

[s3c_usb_init_phy:324] begin s3c_usb_init_phy

[s3c_usb_init_phy:331] end s3c_usb_init_phy

[s3c_usb_core_soft_reset:336] begin s3c_usb_core_soft_reset

[s3c_usb_core_soft_reset:344] the value of S3C_OTG_GRSTCTL is 0.
[s3c_usb_core_soft_reset:344] the value of S3C_OTG_GRSTCTL is 0.
...

uboot的初始化代码如下:
void s3c_usb_init_phy(void)
{
DBG_SETUP0("begin s3c_usb_init_phy\n");
writel(0x0, S3C_OTG_PHYPWR);
writel(0x00, S3C_OTG_PHYCTRL);
writel(0x1, S3C_OTG_RSTCON);
udelay(10);
writel(0x0, S3C_OTG_RSTCON);
udelay(10);
DBG_SETUP0("end s3c_usb_init_phy\n");
}

void s3c_usb_core_soft_reset(void)
{
DBG_SETUP0("begin s3c_usb_core_soft_reset\n");
u32 tmp;

writel(CORE_SOFT_RESET, S3C_OTG_GRSTCTL);

do
{
tmp = readl(S3C_OTG_GRSTCTL);
DBG_SETUP0("the value of S3C_OTG_GRSTCTL is %d.\n",tmp);
}while(!(tmp & AHB_MASTER_IDLE));

DBG_SETUP0("end s3c_usb_core_soft_reset\n");
}
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2011-11-23 22:56

 回 楼主(toysun) 的帖子


1.6410 OTG 时钟是否只需要 48MHz那个?
  时钟配置相关的寄存器 除了S3C_OTG_PHYCTRL (PHYCLK,不明白UBOOT 为什么写成 CTRL),还需要设置其他寄存器么?

对于OTG PHY来说是的。

2.如何才能正常呢?

我不确定你用的是什么开发板,mini6410上这个clock是由外部一个48MHz的晶振提供的,注意这和大部分u-boot中的源代码是相反的。因为大部分的u-boot都是根据SMDK6410写的,而在SMDK6410上,这个Clock是外部OSC提供的。如果你用的开发板也是这种情况,你需要把S3C_OTG_PHYCTRL寄存器的bit 5的xo_ext_clk_enb栏位清掉。具体做法可以参考https://gitorious.org/opencsbc/u-boot/commit/fe8721f31075f40e0b0fe505a0ae7b738e73516fhttps://gitorious.org/opencsbc/u-boot/commit/51bc4fb2d5bb23e8240465464fcfb7c5c95781d4

3.遇到这种问题怎么去思考解决呢?

首先要知道参考代码在什么参考硬件平台上验证可以工作,其次要了解你的开发板硬件设计,尤其是和SMDK6410这种参考平台的差异,可能导致参考代码在你的开发板上不工作,把问题范围逐步缩小。在这个过程中,有时候二分法会比较有效。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 53880
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2011-08-18
最后登录: 2012-02-23
2楼  发表于: 2011-11-24 09:10
谢谢版主这么晚还回复

我的板子是别人做成的产品,带原理图和COM0调试输出我就当开发板用了

看原理图上OTG使用的是外部有源晶体

PHYCTRL 我设置成0 和 0x20 都进死循环,郁闷  
级别: 新手上路
UID: 59722
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2011-11-29
最后登录: 2012-07-18
3楼  发表于: 2012-03-20 14:38
我之前遇到过这样的问题,是这样解决的,EPLL提供48MHZ的时钟,在s3c_usb_init_phy()之前set 寄存器OTHERS 的bit 16(手册上有说明),set  HCLK_GATE,开otg 电源设置寄存器PWR_CFG,其他的跟你给出的代码一样。
思考于usb
级别: 新手上路
UID: 72965
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2012-07-01
最后登录: 2012-10-03
4楼  发表于: 2012-07-01 17:48
哥们,最后问题出哪儿了?我也碰到相同的问题. 解决没有? 上面几位的方法都试了,没有用呢