天嵌 ARM开发社区

 找回密码
 注册
查看: 9676|回复: 20

求助 S3C2416 USB 设备端和上位机通讯 需要对开发板USB端口进行初始化的代码

[复制链接]
happyandsafe 发表于 2013-10-11 14:34:26 | 显示全部楼层 |阅读模式
如题,希望天嵌李工能给我回复下,谢谢。
亚瑟王 发表于 2013-10-14 10:17:41 | 显示全部楼层
请参考TQ2416的Linux或WinCE中的usb驱动。u-boot的usb驱动暂时未开源。
 楼主| happyandsafe 发表于 2013-10-14 10:27:43 | 显示全部楼层
亚瑟王 发表于 2013-10-14 10:17
请参考TQ2416的Linux或WinCE中的usb驱动。

在linux环境下就没有对USB Device进行初始化的代码,我需要知道的是如何初始化USB Device,就是在烧录程序的时候用到的打开USB 设备端的代码。麻烦让李工回复下,我和他电话沟通过了,您给我的回复有点笼统。
亚瑟王 发表于 2013-10-14 10:44:05 | 显示全部楼层
happyandsafe 发表于 2013-10-14 10:27
在linux环境下就没有对USB Device进行初始化的代码,我需要知道的是如何初始化USB Device,就是在烧录程序 ...

修改drivers/usb/gadget/s3c-hsudc.c文件,修改s3c_hsudc_init_phy函数,参考S3C2416的datasheet修改这个函数下的寄存器的配置,修改之后就可以使用usb device功能了。
 楼主| happyandsafe 发表于 2013-10-14 10:53:48 | 显示全部楼层
亚瑟王 发表于 2013-10-14 10:44
修改drivers/usb/gadget/s3c-hsudc.c文件,修改s3c_hsudc_init_phy函数,参考S3C2416的datasheet修改这个 ...

恩,这个我可以试试的,先谢谢黄工了,有问题再联系你。
 楼主| happyandsafe 发表于 2013-10-22 09:07:18 | 显示全部楼层
亚瑟王 发表于 2013-10-14 10:44
修改drivers/usb/gadget/s3c-hsudc.c文件,修改s3c_hsudc_init_phy函数,参考S3C2416的datasheet修改这个 ...

我配置完寄存器后,重新编译内核,将其作为模块加载到内核中,结果当板子和PC连接的时候什么反应都没有。
亚瑟王 发表于 2013-10-22 10:53:03 | 显示全部楼层
happyandsafe 发表于 2013-10-22 09:07
我配置完寄存器后,重新编译内核,将其作为模块加载到内核中,结果当板子和PC连接的时候什么反应都没有。

修改arch/arm/mach-s3c2416/mach-tq2416.c下的tq2416_hsudc_gpio_init函数,添加如下代码试试:
        s3c_gpio_cfgpin(S3C2410_GPF(2), S3C_GPIO_SFN(2));
 楼主| happyandsafe 发表于 2013-10-23 14:31:32 | 显示全部楼层
亚瑟王 发表于 2013-10-22 10:53
修改arch/arm/mach-s3c2416/mach-tq2416.c下的tq2416_hsudc_gpio_init函数,添加如下代码试试:
        s3c_gp ...

还是没有任何反应
 楼主| happyandsafe 发表于 2013-10-23 14:50:04 | 显示全部楼层
亚瑟王 发表于 2013-10-22 10:53
修改arch/arm/mach-s3c2416/mach-tq2416.c下的tq2416_hsudc_gpio_init函数,添加如下代码试试:
        s3c_gp ...

程序更改的地方为:
drivers/usb/gadget/s3c-hsudc.c更改为:
static void s3c_hsudc_init_phy(void)
{
#if 1
        u32 cfg;
        printk("Tony Usb Device init OK!\n");

        cfg = readl(S3C2416_PWRCFG) | S3C2416_PWRCFG_USBPHY;
        writel(cfg, S3C2416_PWRCFG);

        cfg = readl(S3C2416_URSTCON);
        cfg |= (S3C2416_URSTCON_FUNCRST | S3C2416_URSTCON_PHYRST);
        writel(cfg, S3C2416_URSTCON);
        mdelay(1);

        cfg = readl(S3C2416_URSTCON);
        cfg &= ~(S3C2416_URSTCON_FUNCRST | S3C2416_URSTCON_PHYRST);
        writel(cfg, S3C2416_URSTCON);

        cfg = readl(S3C2416_PHYCTRL);
        cfg &= ~(S3C2416_PHYCTRL_CLKSEL | S3C2416_PHYCTRL_DSPORT);
        cfg |= (S3C2416_PHYCTRL_EXTCLK | S3C2416_PHYCTRL_PLLSEL);
        writel(cfg, S3C2416_PHYCTRL);

        cfg = readl(S3C2416_PHYPWR);
        cfg &= ~(S3C2416_PHYPWR_FSUSPEND | S3C2416_PHYPWR_PLL_PWRDN |
                S3C2416_PHYPWR_XO_ON | S3C2416_PHYPWR_PLL_REFCLK |
                S3C2416_PHYPWR_ANALOG_PD);
        cfg |= S3C2416_PHYPWR_COMMON_ON;
        writel(cfg, S3C2416_PHYPWR);

        cfg = readl(S3C2416_UCLKCON);
        cfg |= (S3C2416_UCLKCON_DETECT_VBUS | S3C2416_UCLKCON_FUNC_CLKEN);
        writel(cfg, S3C2416_UCLKCON);
#endif
#if 0
        u32 cfg;

        cfg = readl(S3C2443_PWRCFG) | S3C2443_PWRCFG_USBPHY;
        writel(cfg, S3C2443_PWRCFG);

        cfg = readl(S3C2443_URSTCON);
        cfg |= (S3C2443_URSTCON_FUNCRST | S3C2443_URSTCON_PHYRST);
        writel(cfg, S3C2443_URSTCON);
        mdelay(1);

        cfg = readl(S3C2443_URSTCON);
        cfg &= ~(S3C2443_URSTCON_FUNCRST | S3C2443_URSTCON_PHYRST);
        writel(cfg, S3C2443_URSTCON);

        cfg = readl(S3C2443_PHYCTRL);
        cfg &= ~(S3C2443_PHYCTRL_CLKSEL | S3C2443_PHYCTRL_DSPORT);
        cfg |= (S3C2443_PHYCTRL_EXTCLK | S3C2443_PHYCTRL_PLLSEL);
        writel(cfg, S3C2443_PHYCTRL);

        cfg = readl(S3C2443_PHYPWR);
        cfg &= ~(S3C2443_PHYPWR_FSUSPEND | S3C2443_PHYPWR_PLL_PWRDN |
                S3C2443_PHYPWR_XO_ON | S3C2443_PHYPWR_PLL_REFCLK |
                S3C2443_PHYPWR_ANALOG_PD);
        cfg |= S3C2443_PHYPWR_COMMON_ON;
        writel(cfg, S3C2443_PHYPWR);

        cfg = readl(S3C2443_UCLKCON);
        cfg |= (S3C2443_UCLKCON_DETECT_VBUS | S3C2443_UCLKCON_FUNC_CLKEN |
                S3C2443_UCLKCON_TCLKEN);
        writel(cfg, S3C2443_UCLKCON);
#endif
}


arch/arm/mach-s3c2416/mach-tq2416.c 更改为:
void tq2416_hsudc_gpio_init(void)
{
        s3c_gpio_setpull(S3C2410_GPH(14), S3C_GPIO_PULL_UP);
        s3c_gpio_setpull(S3C2410_GPF(2), S3C_GPIO_PULL_NONE);
        s3c_gpio_cfgpin(S3C2410_GPH(14), S3C_GPIO_SFN(1));
        s3c_gpio_cfgpin(S3C2410_GPF(2), S3C_GPIO_SFN(2));
        s3c2410_modify_misccr(S3C2416_MISCCR_SEL_SUSPND, 0);
}

内核里面我是否需要重新配置,或者说使用默认的配置即可?望回复。
亚瑟王 发表于 2013-10-23 15:18:51 | 显示全部楼层
happyandsafe 发表于 2013-10-23 14:31
还是没有任何反应

用我们的TQ2416开发板测试的?还是用自己做的板子测试的?
 楼主| happyandsafe 发表于 2013-10-23 15:22:19 | 显示全部楼层
亚瑟王 发表于 2013-10-23 15:18
用我们的TQ2416开发板测试的?还是用自己做的板子测试的?

用你们的板子,COREA测试的
亚瑟王 发表于 2013-10-23 16:25:31 | 显示全部楼层
happyandsafe 发表于 2013-10-23 15:22
用你们的板子,COREA测试的

在确认一下你设置的那些寄存器吧。
亚瑟王 发表于 2013-10-23 16:25:43 | 显示全部楼层
happyandsafe 发表于 2013-10-23 15:22
用你们的板子,COREA测试的

在检查一下你设置的那些寄存器吧。
 楼主| happyandsafe 发表于 2013-10-23 16:29:43 | 显示全部楼层
亚瑟王 发表于 2013-10-23 16:25
在检查一下你设置的那些寄存器吧。

内核配置需要更新吗?用你们默认的就可以吗?
亚瑟王 发表于 2013-10-23 16:37:49 | 显示全部楼层
happyandsafe 发表于 2013-10-23 16:29
内核配置需要更新吗?用你们默认的就可以吗?

需要的,这个可以参考TQ2440的Linux移植教程中的U盘章节。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-26 08:44 , Processed in 1.046868 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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