u-boot-2010.3 添加usb下载功能支持 ( for mini2440)
来源:互联网 发布:淘宝如何找人代付 编辑:程序博客网 时间:2024/05/21 17:47
本文主要参考http://bbs.chinaunix.net/thread-1936080-1-1.html博文修改实现
原博文是基于u-boot-2009.8而本博文是基于u-boot-2010.3实现的
平台:fedaro9
交叉编译器:arm-linux-gcc 4.4.3
uboot: u-boot-2010.3
1、复制usb slave驱动源代码
创建drivers/usb/slave 目录,复制usb slave驱动源代码到此目录,请下载我提供的链接,原博文中的不可用
http://download.csdn.net/detail/xiaoaide01/7027467
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 +
/* enable exceptions */
enable_interrupts ();
extern int usb_init_slave();
usb_init_slave();
//Apollo
4、修改平台头文件,include/configs/mini2440.h,添加红色部分
#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 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
//Apollo -,修改结束
7、修改include/asm-arm/arch-s3c24x0/s3c24x0.h,文件
//Apollo +
u8 MAXP_REG;
// u8 res10[7];
u8 res10[3];
u8 EP0_CSR_IN_CSR1_REG;
u8 res11[3];
u8 IN_CSR2_REG;
// u8 res12[3];
u8 res12[7];
u8 OUT_CSR1_REG;
// u8 res13[7];
u8 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 -
补充几个修改,在 driver/usb/slave/usbmain.c,要把include <s3c24x0.h>注释掉,否则编译报错。
在lib_arm/bootm.c中,udc_disconnect ();此句也要注释掉,否则编译报错。
编译成功,将u-boot.bin烧入mini2440的nand flash中,进行测试。
将mini2440的usb device口与pc的usb口连接
在u-boot的命令行中输入 usbslave 1 0x30008000,回车,这时,就可以在dnw中发送数据了,这里,发送uImage,发送完成后,在u-boot命令行中输入bootm 0x31000000,内核正确引导,证明移植成功。
然后
nand erase 60000 500000
nand write 0x30008000 60000 500000
setenv bootcmd nand read 0x30008000 60000 500000;\bootm 0x30008000
saveenv
此后u-boot从nand flash 自动引导内核
- u-boot-2010.3 添加usb下载功能支持 ( for mini2440)
- mini2440 u-boot实现usb slave下载功能!
- mini2440 u-boot实现usb slave下载功能!
- u-boot实现USB下载功能
- u-boot 2010.09 支持mini2440
- u-boot实现USB下载功能(2)
- U-Boot中支持USB
- u-boot-2009.08在mini2440上的移植 增加USB功能
- mini2440 -- TFTP方式下载u-boot
- U-Boot for Mini2440 工作过程
- u-boot-2010.03 for mini2440 Source release
- u-boot-2011.03在mini2440/micro2440上的移植(六)——支持yaffs下载
- u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot
- u-boot下USB键盘支持
- u-boot-2011.03在TQ2440上的移植(11)--支持USB下载
- u-boot-2009.11移植(适用于TQ2440和MINI2440)第六篇:添加Yaffs(2)镜像烧写功能
- u-boot of mini2440
- u-boot移植(Mini2440)
- android开发重要原因简介
- 本相“跑”赢传言需求信息揭露
- Java——Servlet的配置和测试
- 《实战大数据》
- 越努力,越幸运
- u-boot-2010.3 添加usb下载功能支持 ( for mini2440)
- iPhone上传全景照片到谷歌街景地图攻略
- 转log4j基本用法
- math
- 算法导论 之 B-树(B树) - 创建、插入[C语言]
- 坚持,是最强大的力量。
- 初识 Selenium (Browser Automation)
- opencv 在64位win7下链接出错:无法解析的外部符号 _cvDestroyWindow等
- LBP特征及其一些变种