mini2440 实现u-boot的usb slave下载功能

发布者:BlissfulHeart最新更新时间:2024-06-28 来源: elecfans关键字:mini2440  u-boot  usb  slave 手机看文章 扫描二维码
随时随地手机看文章

友善公司不知为何,一直没有发布一个好用的u-boot。之前已移植过2008.10版的u-boot,最近,又移植了2009.08的u-boot。

移植完毕后,总觉得友善自带的dnw下的usb下载功能真的很好用,于是,决定在u-boot中,也加上此功能。搜索网络后,发现,已有人,即本网的老大,在u-boot1.1.6上实现了此功能,并发布了源代码,于是,接下来的工作,就是把这些代码移植到u-boot 2009.08上来。为此,利用春节休假,仔细研究了u-boot关于USB方面的代码,原来,u-boot已实现usb host功能,而usb 下载所需的usb device功能未实现(源码中,已有部分代码,不过未完成)。对照本网的源代码,经过一番曲折,总算完成了移植。

记录一下过程。
首先,把本网原先的usb相关代码整理一下,把原先零散的代码归总到一个目录下。
然后,修改u-boot 2009.08的代码,修改如下。

//以下修改,是参考http://www.linuxidc.com/Linux/2011-05/36317.htm的,其中有些错误,做了修改。
1、复制usb slave驱动源代码
创建drivers/usb/slave 目录,复制usb slave驱动源代码到此目录(详见http://www.linuxidc.net/thread-2238-1-1.html)
 
2、修改uboot根目录下的Makefeils,添加红色部分代码
 
LIBS += drivers/usb/musb/libusb_musb.a
# Apollo +
LIBS += drivers/usb/slave/libusb_slave.a
# Apollo -
LIBS += drivers/video/libvideo.a
 

3、修改lib_arm/board.c文件,添加红色部分代码
//Apollo +
    Port_Init();
    /* enable exceptions */
    enable_interrupts ();
    usb_init(); //这里原文是错的,应为usb_init_slave();
//Apollo -
 
 
4、修改平台头文件,include/configs/utu2440.h,添加红色部分,此文件根据你自已移植的u-boot,名字可能不一样。
#define CONFIG_USB_DEVICE 1
#ifdef CONFIG_USB_DEVICE
#define CONFIG_USE_IRQ 1
#endif
//#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
 

5、修改cpu/arm920t/s3c24x0/interrupts.c 文件,添加arch_interrupt_init函数定义
    //Apollo +
    int arch_interrupt_init (void)
    {
        return 0;
    }
    //Apollo -

 

6、修改cpu/arm920t/start.S,文件
    #ifdef CONFIG_USE_IRQ
   
        .align    5
    irq:
    //Apollo +,此处开始修改
    /*
        get_irq_stack
        irq_save_user_regs
        bl    do_irq
        irq_restore_user_regs
    */

    /* use IRQ for USB and DMA */
        sub    lr, lr, #4             @ the return address
        ldr    sp, IRQ_STACK_START     @ the stack for irq
        stmdb         { r0-r12,lr }    @ save registers //这里原文错误,应为stmdb       sp!,  { r0-r12,lr }
       
        ldr    lr,    =int_return         @ set the return addr
        ldr    pc, =IRQ_Handle         @ call the isr
    int_return:
        ldmia         { r0-r12,pc }^    @ return from interrupt //这里原文错误,应为ldmia sp,{ r0-r12,pc }^
    //Apollo -,修改结束
 

 
7、修改include/s3c24x0.h,文件
 
//Apollo +
    S3C24X0_REG8    MAXP_REG;
//    S3C24X0_REG8    res10[7];
    S3C24X0_REG8    res10[3];
    S3C24X0_REG8    EP0_CSR_IN_CSR1_REG;
    S3C24X0_REG8    res11[3];
    S3C24X0_REG8    IN_CSR2_REG;
//    S3C24X0_REG8    res12[3];
    S3C24X0_REG8    res12[7];
    S3C24X0_REG8    OUT_CSR1_REG;
//    S3C24X0_REG8    res13[7];
    S3C24X0_REG8    res13[3];
//Apollo -
 
 
8、添加usbslave命令
在common目录下创建cmd_usbslave.c
 
#include
#include
#include
#ifdef CONFIG_USB_DEVICE
#ifdef CONFIG_USE_IRQ
    #define IRQ_STACK_START    (_armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4)
    #define FIQ_STACK_START    (IRQ_STACK_START - CONFIG_STACKSIZE_IRQ)
    #define FREE_RAM_END        (FIQ_STACK_START - CONFIG_STACKSIZE_FIQ - CONFIG_STACKSIZE)
    #define FREE_RAM_SIZE        (FREE_RAM_END - PHYS_SDRAM_1)
#else
    #define    FREE_RAM_END    (_armboot_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE - 4 -
CONFIG_STACKSIZE)
    #define    FREE_RAM_SIZE    (FREE_RAM_END - PHYS_SDRAM_1)
#endif
 
int g_bUSBWait = 1;
u32 g_dwDownloadLen = 0;
extern int download_run;
extern volatile unsigned int dwUSBBufBase;
extern volatile unsigned int dwUSBBufSize;
extern __u32 usb_receive(char *buf, size_t len, unsigned int wait);
int do_usbslave (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    int i;
    size_t len = ~0UL;
    char buf[32];
    /* download_run为1时表示将文件保存在USB Host发送工具dnw指定的位置
     * download_run为0时表示将文件保存在参数argv[2]指定的位置
     * 要下载程序到内存,然后直接运行时,要设置download_run=1,这也是这个参数名字的来由
     */
    download_run = 1;
    switch (argc) {
        case 1:
        {
            break;
        }
        case 2:
        {
            g_bUSBWait = (int)simple_strtoul(argv[1], NULL, 16);
            break;
        }
        case 3:
        {
            g_bUSBWait = (int)simple_strtoul(argv[1], NULL, 16);
            load_addr = simple_strtoul(argv[2], NULL, 16);
            download_run = 0;
            break;
        }
       
        default:
        {
            printf ('Usage:n%sn', cmdtp->usage);
            return 1;
        }
    }
    dwUSBBufBase = load_addr;
    dwUSBBufSize = (FREE_RAM_SIZE&(~(0x80000-1)));
    if (g_bUSBWait)
        len = FREE_RAM_SIZE;
    g_dwDownloadLen = usb_receive(dwUSBBufBase, len, g_bUSBWait);
    sprintf(buf, '%X', g_dwDownloadLen);
    setenv('filesize', buf);
   
    return 0;
}
U_BOOT_CMD(
    usbslave,    3,    0,    do_usbslave,
    'usbslave - get file from host(PC)n',
    '[wait] [loadAddress]n'
    ''wait' is 0 or 1, 0 means for return immediately, not waits for the finish of transferringn'
);
#endif
 
 
修改common/Makefile
COBJS-$(CONFIG_USB_KEYBOARD) += usb_kbd.o
# Apollo +
COBJS-$(CONFIG_USB_DEVICE) += cmd_usbslave.o
# Apollo -
补充几个修改,在原文中的usbmain.c,要把include 注释掉,否则编译报错。
在lib_arm/bootm.c中,udc_disconnect ();此句也要注释掉,否则编译报错。在本网的uboot中,此句也是注释掉的,估计原文
作者漏写了。
 
编译成功,将u-boot.bin烧入mini2440的nand flash中,进行测试。
将mini2440的usb device口与pc的usb口连接
 
在u-boot的命令行中输入 usbslave 1 0x31000000,回车,这时,就可以在dnw中发送数据了,这里,发送uImage,发送完成后,在u-boot命令行中输入bootm 0x31000000,内核正确引导,证明移植成功。

另,本网的u-boot仿照友善的mini vivi作了一个菜单命令选择,我没有加入。如有需要,可以参照本网的代码加入。这个比较
容易,不多说了。


关键字:mini2440  u-boot  usb  slave 引用地址:mini2440 实现u-boot的usb slave下载功能

上一篇:mini2440上移植sqlite3.7.6.2
下一篇:mini2440 移植Linux2.6.30.10 及yaffs2文件系统

推荐阅读最新更新时间:2026-03-14 22:47

U-Boot 2010.09 支持mini2440
手头上只有mini2440的板子,移植也是针对它,感觉老了点,^.^!,本来uboot的版本想选定最新的,如2011.03等,但是uboot从2010年12月份的版本起,前面的初始化代码结构改动比较多,而且存在很多bug,尤其是开始搬运代码处的bug(没搬运代码就改变了全局变量,对norflash这是不可以的),开始琢磨着改,但是越到后来越发现,改就改回了旧式的结构,索性还不如用旧式结构的版本,因此移植的版本选定了旧式结构的最后一个版本2010.09。 移植期间参考了Tekkaman Ninja 关于03版本的部分源代码,在此对其表示感谢! U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2
[单片机]
mini2440 u-boot linux 内核启动,移植较新(Linux3.19)内核至mini2440开发板(一)
s3c24xx-nand s3c2440-nand: Tacls=1, 9ns Twrph0=3 29ns, Twrph1=2 19ns s3c24xx-nand s3c2440-nand: NAND soft ECC nand: device found, Manufacturer ID: 0xec, Chip ID: 0xda nand: Samsung NAND 256MiB 3,3V 8-bit nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64 Creating 5 MTD partitions on nand : 0x000000
[单片机]
mini2440 u-boot linux 内核启动,u-boot.2012.10——mini2440(二、启动流程分析)
参考资料:https://blog.csdn.net/suiyuan19840208/article/details/7239949 https://blog.csdn.net/pugu12/article/details/47011159 http://tscsh.blog.163.com/blog/static/200320103201312645149965/ https://blog.csdn.net/winheroii58/article/details/6803327 1、第一阶段功能 * 硬件设备初始化 * 加载u-boot第二段代码到RAM空间 * 设置好栈 * 跳转到第二段代码入口 2、第二段代码的功能 * 初始
[单片机]
<font color='red'>mini2440</font> <font color='red'>u-boot</font> linux 内核启动,u-boot.2012.10——<font color='red'>mini2440</font>(二、启动流程分析)
玩转mini2440开发板之【编译u-boot提示没有规则可以创建“XX.o”需要的目标】
今天继续玩一玩mini2440开发板的u-boot的编译和下载。 首先,交代一下背景,我下载的是tekkamanninja大神于2010.03移植过来的mini2440定制版的u-boot(可以直接去https://github.com/tekkamanninja/u-boot-tekkamanninja/tree/v2010.03_mini2440_tekkamanninja下载,也可以用git clone命令从https://github.com/tekkamanninja/u-boot-tekkamanninja.git处获取)。当然,具体的详细步骤,也可直接参考我另一篇博客的记录:玩转mini2440开发板之【tek
[单片机]
友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(一)
从本文开始,将记录博主在进行u-boot 1.1.6移植过程中遇到的问题。本文将涉及两个问题: 1. u-boot中添加开发板 2. u-boot第一阶段启动代码 1. u-boot中添加开发板 1.1. Makefile更改 1.1.1. 增加反汇编文件输出 Makefile文件中239行,源文件为: ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) 更改为: ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(obj)u-boot.dis $
[单片机]
嵌入式系统中USB控制的Host/Slave模式的应用
   引言     目前,USB 设备产品的应用非常广泛,但市场上能够提供Host/Slave两种模式的USB控制芯片并不多,本系统采用CYPRESS公司的SL811HST芯片作为USB接口的控制芯片,实现Host/Slave两种工作模式。     系统介绍     本系统是以三星公司的S3C44B0X为嵌入式处理器,mClinux为操作系统的专用PDA,通过无线方式实现与上位机的通信,同时也可通过USB接口直接控制USB打印机输出。其中USB控制芯片采用CYPRESS公司的SL811HST芯片,它有两种工作模式Host/Slave。模式的改变是由该芯片M/S脚的电平值决定,其值可以通过软件设置来改变。当置M/S脚
[嵌入式]
STC15W4K48S4的直接USB-ISP功能!51单片机最方便的下载
正在检测目标单片机 ... 单片机型号: STC15W4K48S4 固件版本号: 7.3.1T 当前芯片的硬件选项为: . 下次冷启动后系统时钟源为内部IRC振荡器 . 内部振荡器的频率未调节 . 掉电唤醒定时器的频率: 37.133KHz . P3.2和P3.3与下次下载无关 . 上电复位时增加额外的复位延时 . 复位引脚用作普通I/O口 . 检测到低压时复位 . 低压检测门槛电压 : 2.63 V . 低压时不能进行EEPROM操作 . CPU-Core最高工作电压 : 2.78 V . 上电复位时,硬件不启动内部看门狗 . 上电自动启动内部看门狗时的预分频数为 : 256 . 空闲状态时看门狗定
[单片机]
STC15W4K48S4的直接<font color='red'>USB</font>-ISP<font color='red'>功能</font>!51单片机最方便的<font color='red'>下载</font>
linux-2.6.32在mini2440开发板上移植-配置USB外设
编者:因为LINUX内核对S3C2440的Host驱动的已经支持,而且支持的外设相当的丰富,所以这一部分只是进行配置就可以使用。因为配置的东西较多,没有给出详细的截图,看手册上介绍的就很明白。需要手册的请留下邮箱索取。 1 配置和测试USB 键盘、扫描器和鼠标 在内核源代码目录的终端输入:make menuconfig,依次选择如下子菜单项: Device Drivers --- HID Devices --- 按空格键选中“USB Human Interface Device (full HID) support”,这样就配置好了USB键盘和鼠标项。 提示:这里的配置选项对应的内核源代码目录是:linux-
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved