u-boot-2009.08在mini2440上的移植 增加USB功能

发布者:WhisperingSong最新更新时间:2024-07-01 来源: elecfans关键字:u-boot  mini2440  移植  USB功能 手机看文章 扫描二维码
随时随地手机看文章

移植环境

1,主机环境:VMare下CentOS 5.5 ,1G内存。

2,集成开发环境:Elipse IDE

3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。

4,开发板:mini2440,2M nor flash,128M nand flash。

5,u-boot版本:u-boot-2009.08

6,参考文章:

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

友善自带的dnw下的usb下载功能真的很好用,于是也想实现此功能,现参考博文为u-boot-2009.08 添加 dnw usb下载功能,操作如下(红色字体部分为修改或添加的代码):

【1】复制usb slave驱动源代码,源码下载uboot-usb_slave.tar.bz2 下载在 http://www.linuxidc.net/thread-2238-1-1.html

下载后将源码解压到u-boot-2009.08/drivers/usb/目录下:

[root@localhost ~]# cd ./u-boot-test/u-boot-2009.08/drivers/usb
[root@localhost usb]# tar -jxf /root/100109001526.bz2
[root@localhost usb]# ls
gadget  host  musb  slave
[root@localhost usb]#

【2】用gedit打开u-boot-2009.08/Makefile,定位到243行附近,修改如下:

LIBS += drivers/usb/host/libusb_host.a
LIBS += drivers/usb/musb/libusb_musb.a
LIBS += drivers/usb/slave/libusb_slave.a
LIBS += drivers/video/libvideo.a

【3】打开/lib_arm/board.c,定位到423行附近,修改如下:

#if defined(CONFIG_MISC_INIT_R)
 /* miscellaneous platform dependent initialisations */
 misc_init_r ();
#endif
 extern void port_init(void);
 port_init();
 /* enable exceptions */
 enable_interrupts ();
 #if defined(CONFIG_USB_DEVICE)
 extern int usb_init_slave(void);
 usb_init_slave();
#endif

 /* Perform network card initialisation if necessary */
#ifdef CONFIG_DRIVER_TI_EMAC

这里要强调下hugerat 博主说得很对,usb_init() 应改为 usb_init_slave()。详情请参见mini2440 实现u-boot的usb slave下载功能。

【4】打开/include/configs/mini2440.h,定位到48行附近,注释掉下面代码:

#define USE_920T_MMU  1
//#undef CONFIG_USE_IRQ   /* we don't need IRQ/FIQ stuff */

定位到173行附近,加入如下代码:

/* valid baudrates */
#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }

#define CONFIG_SYS_CONSOLE_IS_IN_ENV //It's important to serial console !
//Define this if you want stdin, stdout &/or stderr to be set to usbtty
/*
USB device support
*/
#define CONFIG_USB_DEVICE   1

#ifdef CONFIG_USB_DEVICE
#define CONFIG_USE_IRQ    1
#endif

/*-----------------------------------------------------------------------
 * Stack sizes

注意,#define CONFIG_SYS_CONSOLE_IS_IN_ENV 配置非常重要,不配置此项,只能看到控制台信息在LCD上的显示,而在串口终端没有输出!

【5】打开/cpu/arm920t/s3c24x0/interrupts.c,定位到文件末尾处添加arch_interrupt_init函数定义:
void do_irq (struct pt_regs *pt_regs)
{
 S3C24X0_INTERRUPT * irq = S3C24X0_GetBase_INTERRUPT();
 u_int32_t intpnd = irq->INTPND;

}

int arch_interrupt_init (void)
{
    return 0;

}

【6】/cpu/arm920t/start.S,定位到625行附近,加入下面代码:

#ifdef CONFIG_USE_IRQ

 .align 5
irq:
/*
 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    sp!,     { r0-r12,lr }     @ save registers
   
    ldr    lr,    =int_return             @ set the return addr
    ldr    pc, =IRQ_Handle                @ call the isr
int_return:
    ldmia    sp!,     { r0-r12,pc }^     @ return from interrupt

 .align 5
fiq:
 get_fiq_stack
 /* someone ought to write a more effiction fiq_save_user_regs */
 irq_save_user_regs
 bl do_fiq
 irq_restore_user_regs

#else

【7】打开/include/s3c24x0.h,定位到330行附近,修改如下:

 S3C24X0_REG8 MAXP_REG;
 S3C24X0_REG8    res10[3]; //S3C24X0_REG8 res10[7];
 S3C24X0_REG8 EP0_CSR_IN_CSR1_REG;
 S3C24X0_REG8 res11[3];
 S3C24X0_REG8 IN_CSR2_REG;
 S3C24X0_REG8    res12[7]; //S3C24X0_REG8 res12[3];
 S3C24X0_REG8 OUT_CSR1_REG;
 S3C24X0_REG8    res13[3]; //S3C24X0_REG8 res13[7];
 S3C24X0_REG8 OUT_CSR2_REG;
 S3C24X0_REG8 res14[3];
 S3C24X0_REG8 OUT_FIFO_CNT1_REG;
 S3C24X0_REG8 res15[3];
 S3C24X0_REG8 OUT_FIFO_CNT2_REG;
 S3C24X0_REG8 res16[3];
#endif /*  __BIG_ENDIAN */
 //S3C24X0_USB_DEV_FIFOS fifo[5];
 //S3C24X0_USB_DEV_DMAS dma[5];
 S3C24X0_REG32   res17[8];
 S3C24X0_USB_DEV_FIFOS   fifo[5];
 S3C24X0_REG32   res18[11];
 S3C24X0_USB_DEV_DMAS    ep1;
 S3C24X0_USB_DEV_DMAS    ep2;
 S3C24X0_REG8    res19[16];
 S3C24X0_USB_DEV_DMAS    ep3;
 S3C24X0_USB_DEV_DMAS    ep4;
} /*__attribute__((__packed__))*/ S3C24X0_USB_DEVICE;

【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,定位到163行,加入下面代码:
# others
COBJS-$(CONFIG_DDR_SPD) += ddr_spd.o
COBJS-$(CONFIG_HWCONFIG) += hwconfig.o
COBJS-$(CONFIG_CONSOLE_MUX) += iomux.o
COBJS-y += flash.o
COBJS-$(CONFIG_CMD_KGDB) += kgdb.o
COBJS-$(CONFIG_KALLSYMS) += kallsyms.o
COBJS-$(CONFIG_LCD) += lcd.o
COBJS-$(CONFIG_LYNXKDI) += lynxkdi.o
COBJS-$(CONFIG_MODEM_SUPPORT) += modem.o
COBJS-$(CONFIG_UPDATE_TFTP) += update.o
COBJS-$(CONFIG_USB_KEYBOARD) += usb_kbd.o
COBJS-$(CONFIG_USB_DEVICE) += cmd_usbslave.o

COBJS := $(sort $(COBJS-y))

【9】打开/include/s3c2410.h,定位到198行附近,加入下面代码:

#define BIT_TICK  (0x1<<8)
#define BIT_WDT   (0x1<<9)
#define BIT_WDT_AC97   (0x1<<9)
#define BIT_TIMER0  (0x1<<10)
#define BIT_TIMER1  (0x1<<11)

【10】编译报错:undefined reference to `udc_disconnect'

打开/lib_arm/bootm.c定位到124行,udc_disconnect ();此句也要注释掉:

 /* we assume that the kernel is in place */
 printf ('nStarting kernel ...nn');

#ifdef CONFIG_USB_DEVICE
 {
  extern void udc_disconnect (void);
  //udc_disconnect ();
 }
#endif

否则编译报错。

【11】解决编译告警问题:

(1)warning: suggest parentheses around arithmetic in operand of '|'

[1] [2] [3]
关键字:u-boot  mini2440  移植  USB功能 引用地址:u-boot-2009.08在mini2440上的移植 增加USB功能

上一篇:u-boot-2009.08在mini2440上的移植 增加LCD显示功能
下一篇:u-boot-2009.08在mini2440上的移植 增加I2C EEPROM功能

推荐阅读最新更新时间:2026-03-20 01:26

u-boot-2009.08在mini2440上的移植 增加USB功能
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,参考文章: 8.1,实现u-boot的usb slave下载功能 友善自带的dnw下的usb下载功能真的很好用,于是也想实现此功能,现参考博文为u-boot-2009.08 添加 dnw usb下载功能,操作如下(红色字体部分为修改或添加的代码): 【1】复制usb
[单片机]
【嵌入式】从零开始移植U-bootmini2440(一)——U-boot编译篇
U-boot版本:2020/5/2 编译环境:Ubuntu 16.04 arm-none-eabi-gcc version 4.9.3 20150529 (prerelease) (15:4.9.3+svn231177-1) 运行环境:mini2440(s3c2440,arm920t) 代码仓库:git@github.com:JingyeLi/u-boot_2440.git commit hash:45516b370859b022b9bf2c9fb87318b1fa2d34a3 GitHub上下载最新的u-boot git@github.com:u-boot/u-boot.git 实际上最新的u-boot(好像是从2017年开
[单片机]
【嵌入式】从零开始移植U-bootmini2440(四)——C runtime配置篇
设置C运行环境及代码relocate - lib/crt0.S C-runtime startup Code for ARM U-Boot 在CPU完成最基本的初始化之后,我们总不能一直以汇编的方式写代码,此时我们就需要C运行环境。同时其他地方经常会把relocate单独拉出来讲,其实本质上来讲,也是属于创造C运行环境的一部分。 首先我们应该理解,C语言运行对于芯片来讲除了可以稳定,正确地执行指令,还需要什么样的内存环境? 众所周知,内存环境可以分成五段,其中TEXT段,data段在bin文件中,或者说就是在我们写代码的时候已经定义好,BSS段需要有系统初始化,剩下的是堆区和栈区,需要我们启动的时候划分好。 按照这个思路,
[单片机]
【嵌入式】从零开始<font color='red'>移植</font><font color='red'>U-boot</font>到<font color='red'>mini2440</font>(四)——C runtime配置篇
u-boot 移植 --->3、S5PV210启动序列
S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf,了解到S5PVS10这款芯片的复位过程启动序列。芯片在出厂时就在内部固化了一段程序internal ROM简称iROM,这段代码在芯片复位一后会自动运行,他主要负责初始化系统的时钟等具体如下: 1. Disable the Watch-Dog Timer \关闭看门狗 2. Initialize the instruction cache \关闭指定cache 3. Initialize the stack region (see “memory map” on chap 2.5) \设置不同模式的栈指针 4. Init
[单片机]
tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——NAND 启动
我们知道 s5pv210启动方式有非常多种,sd卡和nand flash 启动就是当中的两种,前面我们实现的都是基于sd卡启动,这节我们開始实现从nand flash 启动: 从 NAND 启动 u-boot,须要 BL1 初始化 NAND 控制器,然后从 NAND 拷贝 BL2 到 DDR 内存。这里的BL1 即我们移植的 u-boot-spl.bin,BL2 即我们移植的 u-boot.bin。在 u-boot.bin 中的 NAND 驱动比較大,它包括了非常多功能,而 u-boot-spl.bin 中仅仅须要从 NAND 拷贝BL2 到 DDR 即可了,因此我们能够在 u-boot-spl.bin 进行简单的 N
[单片机]
tiny210(s5pv210)<font color='red'>移植</font><font color='red'>u-boot</font>(基于 2014.4 版本号)——NAND 启动
u-boot移植到s3c2440开发板(一)--建立单板
由于没有系统的学习shell,所以Makefile大多数看不懂,一个小小的细节,把我难住了几天。现在开始分享我的操作过程 本文所有linux下的操作是root用户,如果你使用普通用户,请在命令前加上 $ sudo xxxx 所有Linux命令都是加粗,需要加入的文本是斜体 /* *  Ubuntu 16.04 *  u-boot-2016.05.tar.bz2 *  arm-linux-gcc-4.4.3.tar.gz */ 准备工作 1.下载u-boot,我是用的u-boot-2016.05.tar.bz2,可以自己去官网下载 下载地址, ftp://ftp.denx.de/pub/u-boot/ 2.下载arm-linux-g
[单片机]
<font color='red'>u-boot</font><font color='red'>移植</font>到s3c2440开发板(一)--建立单板
U-Boot移植
1. 安装韦东山的虚拟版的ubuntu 9, 里面交叉编译啥的都弄好了, 直接用, 然后把workstation共享目录打开, 指向uboot的压缩包所在目录. 2. 在虚拟机上, 打开ssh, 通过ssh, 进/mnt/hgfs/ 把uboot压缩包解压了. 3. 编辑Makefile, 在smdk2400下面增加两行, 注意要好tab键 smdk2400_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0 tx2440_config : unconfig @$(MKCONFIG) $(@:_conf
[单片机]
U-Boot移植(10)u-boot重定位后的内存分布
对于smdk2410,RAM范围从0x30000000~0x34000000. u-boot占用高端内存区。从高地址到低地址内存分配如下:  显示缓冲区 (.bss_end~34000000) u-boot(bss,data,text) (33f00000~.bss_end) heap(for malloc) gd(global data) bd(board data) stack .... nor flash (0~2M) 参考:http://deshunfan.blog.163.com/blog/static/342441012
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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