历史上的今天
今天是:2025年04月15日(星期二)
2018年04月15日 | TQ2440移植u-boot-2010.06-rc1---6usb下载
2018-04-15 来源:eefocus
以前做过usb下载的东东,现在把它搞到u-boot-2010.06-rc1上去.
网上有usb下载的代码,可以在这儿下载:
http://blogimg.chinaunix.net/blog/upfile2/100109001526.bz2
一. 先编译过再说
1.下载后,解压到u-boot-2010.06-rc1/drivers/usb/slave目录
并在顶层Makefile中添加: LIBS += drivers/usb/slave/libusb_slave.a
2. 将driver/usb/slave/目录下所有C文件所个替换
a.
#if defined(CONFIG_S3C2400)
#include
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#include
#endif
#include
替换为
#include
b. 删除driver/usb/slave/interrupt.c
c. 修改driver/usb/slave/Makefile中的 COBJS, 去掉interrupt.o
3.u-boot-2010.06-rc1中结构体都是小写,跟下载的代码中结构体名字是大写的,需要将大写的名字改成小写的,这样才可以编译过去.
a. 将usbin.c中
L21
/*
extern S3C24X0_USB_DEVICE * usbdevregs;
extern S3C24X0_DMAS * dmaregs;
*/
extern struct s3c24x0_usb_device * usbdevregs;
extern struct s3c24x0_dmas * dmaregs;
L32 解决: warning: suggest parentheses around arithmetic in operand of |
#define SET_EP1_IN_PKT_READY() usbdevregs->EP0_CSR_IN_CSR1_REG= ( (in_csr1 &(~ EPI_WR_BITS)) \
| EPI_IN_PKT_READY )
#define SET_EP1_SEND_STALL() usbdevregs->EP0_CSR_IN_CSR1_REG= ( (in_csr1 & (~EPI_WR_BITS))\
| EPI_SEND_STALL) )
#define CLR_EP1_SENT_STALL() usbdevregs->EP0_CSR_IN_CSR1_REG= ( (in_csr1 & (~EPI_WR_BITS))\
&(~EPI_SENT_STALL) )
#define FLUSH_EP1_FIFO() usbdevregs->EP0_CSR_IN_CSR1_REG= ( (in_csr1 & (~EPI_WR_BITS))\
|(EPI_FIFO_FLUSH) )
b. 将usblib.c中
L23
/*
extern S3C24X0_INTERRUPT * intregs;
extern S3C24X0_USB_DEVICE * usbdevregs;
extern S3C24X0_DMAS * dmaregs;
*/
extern struct s3c24x0_interrupt * intregs;
extern struct s3c24x0_usb_device *usbdevregs;
extern struct s3c24x0_dmas * dmaregs;
c. usbinit.c 中
L22
/*
extern S3C24X0_INTERRUPT * intregs;
S3C24X0_USB_DEVICE * usbdevregs;
S3C24X0_DMAS * dmaregs;
S3C24X0_CLOCK_POWER * clk_powerregs;
S3C24X0_GPIO * gpioregs;
*/
extern struct s3c24x0_interrupt * intregs;
struct s3c24x0_usb_device * usbdevregs;
struct s3c24x0_dmas * dmaregs;
struct s3c24x0_clock_power * clk_powerregs;
struct s3c24x0_gpio * gpioregs;
L122:
//gpioregs = S3C24X0_GetBase_GPIO();
gpioregs = s3c24x0_get_base_gpio();
L222
/*
clk_powerregs = S3C24X0_GetBase_CLOCK_POWER();
usbdevregs = S3C24X0_GetBase_USB_DEVICE();
dmaregs = S3C24X0_GetBase_DMAS();
*/
clk_powerregs = s3c24x0_get_base_clock_power();
usbdevregs = s3c24x0_get_base_usb_device();
dmaregs = s3c24x0_get_base_dmas();
L297
//S3C24X0_INTERRUPT * intregs;
struct s3c24x0_interrupt * intregs;
//intregs = S3C24X0_GetBase_INTERRUPT();
intregs = s3c24x0_get_base_interrupt();
d. usbmain.c 中
L20
/*
extern S3C24X0_USB_DEVICE * usbdevregs;
extern S3C24X0_DMAS * dmaregs;
*/
extern struct s3c24x0_usb_device * usbdevregs;
extern struct s3c24x0_dmas * dmaregs;
L444 解决: warning: suggest parentheses around arithmetic in operand of |
444 gpioregs->MISCCR = (gpioregs->MISCCR&~(7<<4)) | (clock_sel<<4);
445 gpioregs->GPHCON = (gpioregs->GPHCON&~(3<<18)) | (2<<18);
e. usbout.c中
L28
/*
extern S3C24X0_INTERRUPT * intregs;
extern S3C24X0_USB_DEVICE * usbdevregs;
extern S3C24X0_DMAS * dmaregs;
*/
extern struct s3c24x0_interrupt * intregs;
extern struct s3c24x0_usb_device * usbdevregs;
extern struct s3c24x0_dmas * dmaregs;
L188
//ClearPending_my(BIT_DMA2);
ClearPending(BIT_DMA2);
f. usbsetup.c中
L19
/*
extern S3C24X0_INTERRUPT * intregs;
extern S3C24X0_USB_DEVICE * usbdevregs;
extern S3C24X0_DMAS * dmaregs;
*/
extern struct s3c24x0_interrupt * intregs;
extern struct s3c24x0_usb_device * usbdevregs;
extern struct s3c24x0_dmas * dmaregs;
L46 解决: warning: suggest parentheses around arithmetic in operand of |
#define CLR_EP0_OUT_PKT_RDY() usbdevregs->EP0_CSR_IN_CSR1_REG=( (ep0_csr & (~EP0_WR_BITS))| \
EP0_SERVICED_OUT_PKT_RDY )
#define CLR_EP0_OUTPKTRDY_DATAEND() usbdevregs->EP0_CSR_IN_CSR1_REG=( (ep0_csr & (~EP0_WR_BITS) )| \
(EP0_SERVICED_OUT_PKT_RDY|EP0_DATA_END) )
#define SET_EP0_IN_PKT_RDY() usbdevregs->EP0_CSR_IN_CSR1_REG=( (ep0_csr & (~EP0_WR_BITS) ) | \
(EP0_IN_PKT_READY) )
#define SET_EP0_INPKTRDY_DATAEND() usbdevregs->EP0_CSR_IN_CSR1_REG=( (ep0_csr & (~EP0_WR_BITS))| \
(EP0_IN_PKT_READY|EP0_DATA_END) )
#define CLR_EP0_SETUP_END() usbdevregs->EP0_CSR_IN_CSR1_REG=( (ep0_csr & (~EP0_WR_BITS)) | \
(EP0_SERVICED_SETUP_END) )
#define CLR_EP0_SENT_STALL() usbdevregs->EP0_CSR_IN_CSR1_REG=( (ep0_csr & (~EP0_WR_BITS) )& \
(~EP0_SENT_STALL) )
#define FLUSH_EP0_FIFO() {while(usbdevregs->OUT_FIFO_CNT1_REG)usbdevregs->fifo[0].EP_FIFO_REG;}
4.arch/arm/include/asm/arch/s3c24x0.h中
a. 添加两个宏定义
#define BIT_DMA2 (0x1<<19)
#define BIT_USBD (0x1<<25)
b. 修改s3c24x0_usb_device结构体
//u8 res10[7]
u8 res10[3];
//u8 res12[3]
u8 res12[7];
//u8 res13[7]
u8 res13[3];
/*
struct s3c24x0_usb_dev_fifos fifo[5];
struct s3c24x0_usb_dev_dmas dma[5];
*/
u32 res17[8];
struct s3c24x0_usb_dev_fifos fifo[5];
u32 res18[11];
struct s3c24x0_usb_dev_dmas ep1;
struct s3c24x0_usb_dev_dmas ep2;
u8 res19[16];
struct s3c24x0_usb_dev_dmas ep3;
struct s3c24x0_usb_dev_dmas ep4;
c. 修改 struct s3c24x0_gpio
L481 添加:
/* s3c2440 */
u32 res9[4];
u32 GPJCON;
u32 GPJDAT;
u32 GPJUP;
5. usbmain.c中void IsrUsbd(void)调用了ClearPending,其实现如下:
arch/arm/cpu/arm920t/interrupt.c
//添加 ClearPending的实现:
void ClearPending(int bit)
{
intregs->SRCPND = bit;
intregs->INTPND = bit;
}
并修改driver/usb/slave/usbmain.c
//ClearPending_my(BIT_USBD);
ClearPending(BIT_USBD);
6. usbmain.c的usb_init_slave(void)调用了Isr_Init(),其实现如下
arch/arm/cpu/arm920t/interrupt.c中添加
#include
struct s3c24x0_interrupt * intregs;
void (*isr_handle_array[50])(void);
extern void IsrUsbd(void);
extern void IsrDma2(void);
void Dummy_isr(void)
{
printf("Dummy_isr error, interrupt number: %d, INTMSK = 0x%x\n", intregs->INTOFFSET, intregs->INTMSK);
while(1);
}
//初始化irq的中断向量表
void Isr_Init(void)
{
int i = 0;
intregs = s3c24x0_get_base_interrupt();
for (i = 0; i < sizeof(isr_handle_array) / sizeof(isr_handle_array[0]); i++ )
{
isr_handle_array[i] = Dummy_isr;
}
intregs->INTMOD=0x0; // All=IRQ mode
intregs->INTMSK=BIT_ALLMSK; // All interrupt is masked.
#ifdef CONFIG_USB_DEVICE
isr_handle_array[ISR_USBD_OFT] = IsrUsbd;
isr_handle_array[ISR_DMA2_OFT] = IsrDma2;
ClearPending(BIT_DMA2);
ClearPending(BIT_USBD);
#endif
}
b. 同时在 arch/arm/include/asm/arch/s3c24x0.h中添加
#define ISR_DMA2_OFT 19
#define ISR_USBD_OFT 25
c. 并在 include/configs/smdk2410.h 中添加
#define CONFIG_USB_DEVICE 1
d. arch/arm/lib/bootm.c中,注掉udc_disconnect,否则编译不过
#ifdef CONFIG_USB_DEVICE
{
extern void udc_disconnect (void);
//udc_disconnect ();
}
#endif
7. 开启中断
start_armboot --> 调用enable_interrupts ();
在include/configs/smdk2410.h 中添加
//#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
#define CONFIG_USE_IRQ 1
这会导致arch/arm/cpu/arm920t/s3c24x0/interrupt.c 因为缺少readl而出错
同时报错说没有arch_interrupt_init的定义
在arch/arm/cpu/arm920t/s3c24x0/interrupt.c 中添加
#include
int arch_interrupt_init(void)
{
return (0);
}
8.还要在arch/arm/lib/board.c中添加
/* enable exceptions */
enable_interrupts ();
//调用usb 初始化函数
usb_init_slave();
10. 还编译不过,需要在arch/arm/cpu/arm920t/interrupt.c中添加
static int intCount;
void Timer_InitEx(void)
{
intCount=0;
intregs->SUBSRCPND = (1<<13);
ClearPending(BIT_WDT_AC97/*BIT_WDT*/);
intregs->INTMSK&=~(BIT_WDT_AC97 /*BIT_WDT*/);
intregs->INTSUBMSK &= ~(1<<13);
}
void Timer_StartEx(void)
{
//S3C24X0_WATCHDOG * const wdtregs = S3C24X0_GetBase_WATCHDOG();
struct s3c24x0_watchdog * const wdtregs = s3c24x0_get_base_watchdog();
wdtregs->WTCON=((get_PCLK()/1000000-1)<<8)|(0<<3)|(1<<2); // 16us
wdtregs->WTDAT=0xffff;
wdtregs->WTCNT=0xffff;
// 1/16/(65+1),interrupt enable,reset disable,watchdog enable
wdtregs->WTCON=((get_PCLK()/1000000-1)<<8)|(0<<3)|(1<<2)|(0<<0)|(1<<5);
}
unsigned int Timer_StopEx(void)
{
int count;
//S3C24X0_WATCHDOG * const wdtregs = S3C24X0_GetBase_WATCHDOG();
struct s3c24x0_watchdog * const wdtregs = s3c24x0_get_base_watchdog();
wdtregs->WTCON=((get_PCLK()/1000000-1)<<8);
intregs->INTMSK|=BIT_WDT_AC97; //BIT_WDT;
intregs->INTSUBMSK |= (1<<13);
count=(0xffff-wdtregs->WTCNT)+(intCount*0xffff);
return ((unsigned int)count*16/1000000);
}
11. 加入usbslave命令
Common/Makefile中
COBJS-$(CONFIG_USB_DEVICE) += usb_storage.o
common/cmd_usbslave.c
cmd_usbslave.c.txt (改名为: cmd_usbslave.c, 放在common/目录下)
12 打通中断的路
arch/arm/cpu/arm920t/start.S L399
irq:
/*
get_irq_stack
irq_save_user_regs
bl do_irq
irq_restore_user_regs
*/
sub lr, lr, #4 @ the return address
/*@在完成保存堆栈的操作后,跳到中断处理函数IRQ_Handle中*/
ldr sp, IRQ_STACK_START @ the stack for irq
stmdb { r0-r12,lr } @ save registers
ldr lr, =int_return @ set the return addr
ldr pc, =IRQ_Handle @ call the isr
int_return:
ldmia { r0-r12,pc }^ @ return from interrupt
arch/arm/cpu/arm920t/interrupt.c //irq的中断服务程序
void IRQ_Handle()
{
unsigned long oft = intregs->INTOFFSET;
//S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
struct s3c24x0_gpio *const gpio = s3c24x0_get_base_gpio();
//清中断
if( oft == 4 ) gpio->EINTPEND = 1<<7; //EINT4-7合用IRQ4,注意EINTPEND[3:0]保留未用,向这些位写入1可能导致未知结果
intregs->SRCPND = 1<
intregs->INTPND = intregs->INTPND;
/* run the isr */
isr_handle_array[oft]();
}
在Isr_init()中
isr_handle_array[ISR_USBD_OFT] = IsrUsbd;
isr_handle_array[ISR_DMA2_OFT] = IsrDma2;
所以当有usb中断时,就会调用IsrUsbd()函数.
13. 最关键的一步, 打开irq中断,重启复位时默认进入0xD3模式,并不开启irq中断,
在start_armboot中完成Port_init之后就要打开irq中断.
/* enable IRQ interrupts */
void enable_interrupts (void)
{
unsigned long temp;
__asm__ __volatile__("mrs %0, cpsr\n"
"bic %0, %0, #0x80\n"
"msr cpsr_c, %0"
: "=r" (temp)
:
: "memory");
}
当调用enable_interrupts函数之后,irq中断这条路就己经通了,当有usb中断发生时就会进入自己写的usb中断服务程序.
二.调试
2.1 当编译好之后,下载到板子上运行,usb设备枚举正常,但在下载时出现问题
SMDK2410 # usbslave 1 0x30000000
USB host is connected. Waiting a download.
Now, Downloading [ADDRESS:30000000h,TOTAL:1942578]
RECEIVED FILE SIZE: 65536Dummy_isr error, interrupt number: 9, INTMSK = 0xfff7fdff
2.2 加入watchdog和timer中断
int g_TimerIntHappen;
static int intCount;
void IsrTimer4(void)
{
ClearPending(BIT_TIMER4);
*(volatile int *)&g_TimerIntHappen = 1;
}
void Dummy_isr(void)
{
printf("Dummy_isr error, interrupt number: %d, INTMSK = 0x%x\n", intregs->INTOFFSET, intregs->INTMSK);
while(1);
}
void Isr_Init(void) //加入中断处理函数
{
isr_handle_array[ISR_TIMER4_OFT] = IsrTimer4;
isr_handle_array[ISR_WDT_OFT] = IsrWatchdog;
}
史海拾趣
|
关于中国风能-风力发电行业前景的探讨 最近看了一篇关于风能风力发电的报告目录(中国风能-风力发电行业综合市场研究报告),里边对风力发电只有一个介绍; 报告的链接是:http://www.boomingfield.com/Html/yjxxny/2008-12/12/102720491.html 不知 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 北京时间4月14日上午消息,据台湾媒体报道,消息称苹果已经订购了400万部新版iPhone,部分将面向中国市场,交货时间为本季度结束前。 根据零组件厂得到的消息,苹果已经于本周正式宣布新版iPh ...… 查看全部问答> |
|
“工程师是科学家;工程师是艺术家;工程师也是思想家。”一位伟大的工程师曾经提出过这样的一段感言。不错,工程师是利用自然科学来创造工程的人。工程既是物质的也是思想上的。许多不朽的工程,伟大的发明以及出神入化的技术方案,许多人往往只看 ...… 查看全部问答> |
|
本来刚涉入驱动开发的行列不久,最近测试了一下DDK中的bulkusb编译生成的驱动,应用程序也是用DDK例子bulkusb中的exe,但是发现一些问题,希望各位高手能出手相助: (1)驱动装上去之后显示不出绿色图标。 这个图标的出现和什么有关 ...… 查看全部问答> |
|
format ' x' invalid or incompatible with argument(protel99导出问题) Protel99中在schematic 画好以后想导到PCB里去,一点就出来 format \' x\' invalid or incompatible with argument 这个提示,看网上有出现这问题,但一直不成功啊 哪位能详细讲讲 谢谢了… 查看全部问答> |
|
uCOS-III version: V3.03.00。uCOS-III for VC使用Microsoft Visual C++ 6.0编译,创建工程时选择Win32控制台应用程序,添加相关文件到工程后,点击Project——>Settings——>C/C++选项,Category选择Preprocessor,Additional include directories ...… 查看全部问答> |
|
DSP软件工程师 年薪16-19W 岗位职责: 1、负责McWiLL宽带无线接入系统物理层算法的验证及实现,包括基站和终端; 2、负责SCDMA基站和终端产品物理层软件的开发及维护。 任职要求: 1、本科及以上学历,电子、通信等相关专业; 2、 ...… 查看全部问答> |




