U-boot学习笔记(三)

为U-boot增加USB下载功能

因为自己的硬件平台没有网卡,所以一直USB Slave,使其可以使用DNW通过USB下载数据。参考http://blog.chinaunix.net/space.php?uid=8087110&do=blog&id=1989046

1、复制usb slave驱动源代码
创建drivers/usb/slave 目录,复制usb slave驱动源代码到此目录(详见附件)
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
         sb         { r0-r12,lr }     @ save registers //这里原文错误,应为sb       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 <common.h>
#include <command.h>
#include <asm/byteorder.h>
#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%s\n", 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 transferring\n"
);
#endif

修改common/Makefile 
COBJS-$(CONFIG_USB_KEYBOARD) += usb_kbd.o 
# Apollo + 
COBJS-$(CONFIG_USB_DEVICE) += cmd_usbslave.o 
# Apollo -


上面的移植在u-boot2009.08上进行,自己动手编译不成功。在百问网下载了u-boot1.1.6使用3.3.2的交叉编译环境编译成功。于是就使用1.1.6针对自己的硬件平台就行修改。

烧写u-boot1.1.6编译生成的uboot.bin执行后串口显示乱码.阅读代码发现是晶振问题.修改成12M后显示正常

修改100ask24xo.h中的 #define CONFIG_SYS_CLK_FREQ 12000000

进入uboot命令行后测试usb功能.发现DNW显示USB未连接。根据硬件电路.GPG9需要设置成OUT 设置下UPLL编译下载后USB能连接正常。

rUPLLCON = 0x38<<12 | 2<<4 | 2; //UCLK=48Mhz 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值