阅读:1244回复:9
年关了救救小弟
年关了救救小弟
做不出来不让回家过年啊!!!! 小弟在用CS5954AM做U盘开发固件时遇到些问题 下面是CYPRESS的一段固件源码: .xlist include nandflsh.inc .list cDevSel equ 0xe0 ;********************************************************************** ; Software Init: Default Setting to Rec command From Host ; Using Scan for Enhancement code ;********************************************************************** dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw 0xc006 ;mov [0xc006],0 setup processor at 48MHz #ifdef USE_12 dw 0x40 ;setup for 12MHz oscillator #else dw 0 ;setup for 48MHz oscillator #endif dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw 0xc03a #ifdef USE_SLOW ;;make SRAM 8-bit or 16-bit dw 0x00b ;ext=16-bit,0-wait|rom=16,bit-0wait|ram=8-bit,3-wait #else dw 0x009 ;ext=16-bit,0-wait|rom=16,bit-0wait|ram=8-bit,1-wait #endif dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw (83*2) dw std_class dw 0xc3b6 ;enhancement signature dw 6 ;length of stuff db 0 ;COPY opcode dw (91*2) ;string descriptor loc;; dw conf_desc dw string_desc dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw (USB_DELTA_CONFIG_INT*2) ;; dw New_Delta dw 0xc3b6 ;enhancement signature dw ((IRAM0_E-IRAM0_S)+2) ;length of IRAM0 db 0 ;memory copy dw IRAM0 ;??IRAM0,IRAM_S reloc IRAM0 IRAM0_S: 这是固件开头的一段,0Xc3b6是中断67的信号标记而0XE0是源地址(起始位置)我的问题在这儿 dw 0xc3b6 ;enhancement signature dw ((IRAM0_E-IRAM0_S)+2) ;length of IRAM0 db 0 ;memory copy dw IRAM0 ;??IRAM0,IRAM_S reloc IRAM0 按照头文件的描述如下 ;************************************************************************** ; Unused RAM space for SL11R chip Rev 1.2 & CS5954AM ; IRAM0: 0x01e-0x07e 0x60 free MEM: interrupt vector 15 to int 63 ; IRAM1: 0x0c2-0x0fe 0x38 free MEM: interrupt vector 97 to int 127 ; IRAM2: 0x2f2-0x33e 0x4C free MEM: RAM variables ; Remove UART: ; IRAMU: 0x22a-0x268 0x3E free, must disable UART_INT and UART_IDLE task ;************************************************************************** 这个IRAM0是个什么东东我看不明白,我猜是一个USB通道但是有问题它的地址空间0x01e-0x07e为什么不在0XE0后面 如果是中断向量组空间从中断15到63又大有问题,CS5954AM中断分类如下: 硬中断 InterruptNumber VectorAddress InterruptType Note 0 0x0000 Timer0 1 1 0x0002 Timer1 2 2 0x0004 GP IRQ0 2 3 0x0006 GP IRQ1 2 4 0x0008 UART Tx 1 5 0x000A UART Rx 1 6 0x000C Fast DMA Done 2 7 0x000E USB Reset 8 0x0010 USB SOF 3 9 0x0012 USB Endpoint0 1 No Error 10 0x0014 USB Endpoint0 Error 1 11 0x0016 USB Endpoint1 No Error 12 0x0018 USB Endpoint1 Error 13 0x001A USB Endpoint2 No Error 14 0x001C USB Endpoint2 Error 15 0x001E USB Endpoint3 No Error 16 0x0020 USB Endpoint3 Error 17 0x0022 Mailbox TX Empty (16-Bit Mode Only) 2 18 0x0024 Mailbox RX Full (16-Bit Mode Only) 2 19-63 0x0026- 0x003E Reserved 2 请诸位大哥帮小弟看一下看一下这个IRAM0,IRAM1这几个东东是干吗的,小弟在编固件编不出来就过不了年了谢了! |
|
沙发#
发布于:2004-01-06 09:32
顶
|
|
板凳#
发布于:2004-01-07 18:22
那位好心帮我看看吧
|
|
地板#
发布于:2004-01-08 10:52
help!
|
|
地下室#
发布于:2004-01-08 13:09
Iram0,Iram1是为了存取数据的,
|
|
5楼#
发布于:2004-01-08 16:56
实在不行发邮件给cy的surrport人员,
具体内容到www.cypress.com的看 你会在一到两个工作日得到回复的 或者到下面create a case,效果同前 http://www.cypress.com/support/knowledge_base.cfm |
|
6楼#
发布于:2004-01-10 21:49
不太象啊
好象是开PI出来内存空间但是与下面的源程序不附 |
|
7楼#
发布于:2004-01-10 21:59
谢谢了
|
|
8楼#
发布于:2004-01-12 21:36
我把程序贴的完整一些大家看一下
.xlist include nandflsh.inc .list cDevSel equ 0xe0 ;********************************************************************** ; Software Init: Default Setting to Rec command From Host ; Using Scan for Enhancement code ;********************************************************************** dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw 0xc006 ;mov [0xc006],0 setup processor at 48MHz #ifdef USE_12 dw 0x40 ;setup for 12MHz oscillator #else dw 0 ;setup for 48MHz oscillator #endif dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw 0xc03a #ifdef USE_SLOW ;;make SRAM 8-bit or 16-bit dw 0x00b ;ext=16-bit,0-wait|rom=16,bit-0wait|ram=8-bit,3-wait #else dw 0x009 ;ext=16-bit,0-wait|rom=16,bit-0wait|ram=8-bit,1-wait #endif dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw (83*2) ;;中断83,USB标准类(USB1.1 9章,USB框架结构) dw std_class dw 0xc3b6 ;enhancement signature dw 6 ;length of stuff db 0 ;COPY opcode dw (91*2) ;string descriptor loc;;指针指向配置描述符 dw conf_desc dw string_desc dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw (USB_DELTA_CONFIG_INT*2) ;;中断95;配置改变时收到通知。 dw New_Delta dw 0xc3b6 ;enhancement signature dw ((IRAM0_E-IRAM0_S)+2) ;length of IRAM0 db 0 ;memory copy dw IRAM0 ;??IRAM0,IRAM_S reloc IRAM0 IRAM0_S: ;********************************************************************** ; Arm Setup for Endpoint1/Endpoint ;********************************************************************** ArmSetup: mov [r10],64 ArmSetup0: mov [pkg_cnt],(cMAXSIZE/128) ;;pkg_cnt初值定为0,CMAXSIZE/128=8 CMAXSIZE在NANDFLSH.INC中定义为1024. int ARM_INT ;;在NANDFLSH.INC中定义为 3 .GP IRQ1 (初始化GPIO端点 )?? ret ;********************************************************************** ; Initialize and arm endpoint 1 to send USB Status packets ;********************************************************************** _InitEP1: mov [USB_EP1_ADDR],SCMD ;setup to send command mov [USB_EP1_CNT],0xd ;Command Block size ;;oxd=13 ArmEP1: mov [LastAddr1],[USB_EP1_ADDR] ;LastAddr1=LastAddr1 mov [LastCnt1],[USB_EP1_CNT] ;LastCnt1=0X286 mov [USB_EP1_CNTRL],cDMA1ENA ;; cDMA1ENA(EP_DIR_IN|EP_ENB|EP_ARM) ;Bulk host read ret ;********************************************************************** ; Require r9=pointer to 32-bit length ;********************************************************************** dUpdate64: mov r0,cBUFFSIZE ;input expected len, return r0=remainder ;cBUFFSIZE=64 SETUP包是64位的 mov r9,_xLenLSB ;;_xLenLSB equ (nBuff+2) ; dw 0;;0X25e dChkSize: sub [r9++],r0 ;sub low word subb [r9],0 ;dec the high word rnc ;;?? xor [r9],[r9] ;MSB = 0 subi r9,2 add r0,[r9] ;return r0 = remainder xor [r9],[r9] ;LSB = 0 ret ;********************************************************************** ; UpdateBuff: Updates dual USB buffer (512 bytes * 2) and wraps if at end ;********************************************************************** UpdateBuff: mov r10,nBuff ;Update USB Buffer DATA ptr ;nBuff=0X25C mov r7,[r10] ;return current ptr in r8 add [r10],r0 ;next block, r0=512 ChkWrap: cmp [r10],(DATA0+cMAXSIZE) rl mov [r10],DATA0 ;check buffer wrap arround ret pkg_cnt: dw 0 page_cnt: dw 0 IRAM0_E: err<z (IRAM0Size-(IRAM0_E-IRAM0_S)) ; check if go over limited range dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw USB_RESET_VEC ;; USB复位 dw USB_reset dw 0xc3b6 ;enhancement signature dw ((IRAM1_E-IRAM1_S)+2) ;length of stuff db 0 ;memory copy dw IRAM1 reloc IRAM1 IRAM1_S: std_class: mov [(90*2)],dev_desc ; new device descriptor;;1, 中断90指针指向设备描述符,一般作为建立和修改设备描述符的开头。 #ifdef DEVELOPMENT ;;充许多路并联 cmp [sse1],0x30 ; check sse1 for \'0\' (0x30) jne @f mov r0,[USB_ADDR_REG] ; load the word with USB address;1, 取得设备地址 and r0,0x7 ; pull off the USB address add [sse1],r0 ; digit is ASCII \'0\'- add r0 @@: #endif jmpl USB_Stand ;;equ 0xf332 ;********************************************************************** ; new_71: Replace ISR for interrupt 71 ;********************************************************************** new_71: addi r15,2 ;adjust the stack int 70 ;;70中断。空中断模拟多路线程 int 71 ;incase(打包) main execute return ;;71中断把任务提交前台。 IRAM1_E: err<z (IRAM1Size-(IRAM1_E-IRAM1_S)) ; check if go over limited range dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw USB_EP1_VEC ;mov [USB_EP1_VEC],endp_1_int ;;中断11,ENDPOINT 无错 dw endp_1_int dw 0xc3b6 ;enhancement signature dw ((IRAM2_E-IRAM2_S)+2) ;length of stuff db 0 ;memory copy dw IRAM2 reloc IRAM2 IRAM2_S: _gIdeState: dw 0 ;********************************************************************** ; RegSetup: Sets up registers to default states ;********************************************************************** RegSetup: mov rCNTRL,gHighOut ;; gHighOut 在NANDFLSH.INC 中定义为 0xc02;; rCNTRL define r12 mov rCMD,_gCmd ; Read/Write Command;; _gCMD=0X25a, rCMD define r13 mov rSTATE,_gIdeState ; Setup register 12;; _gIdeState=0, rSTATE define r14 ret ;********************************************************************** ; Endpoint 1 ISR: Send Command Status/Data to host ; use registers: r14-r12, r10, r7: should not use in other subroutines ; Host Read from Peripheral ;********************************************************************** endp_1_int: push [flags] int SAVE_REGS ;save all registers to stack test [_gIdeState],eSndData ;send data jz SetDefault ;no set Default Buffer ep1_data: mov r10,USB_EP1_ADDR ep_common: call dUpdate64 ;xLen -= 64 and r0,r0 jnz @f mov [_gIdeState],eSndStatus ;;如果打好包,开始保存所有寄存器存器 jmp exit_isr @@: mov [r10+2],r0 ;update xfer length on USB_EPx_CNT call ChkWrap ;check buffer wrap arround dec [pkg_cnt] ;kick off Read/Write in the MainTask jz exit_isr int ARM_INT exit_isr: int REST_REGS ;restore all registers pop_exit: pop [flags] sti ret IRAM2_E: err<z (IRAM2Size-(IRAM2_E-IRAM2_S)) ; check if go over limited range dw 0xc3b6 ;enhancement signature dw 4 ;length of stuff db 0 ;COPY opcode dw USB_EP2_VEC ;mov [USB_EP2_VEC],endp_2_int dw endp_2_int dw 0xc3b6 ;enhancement signature dw ((IRAM3_E-IRAM3_S)+2) ;length of IRAM3 db 0 ;memory copy dw IRAM3 reloc IRAM3 IRAM3_S: |
|
9楼#
发布于:2004-01-12 21:47
大侠们看一下
这里有一点矛盾 按照汇编程序 IRAM0_S:是标号应指向下面的代码, ArmSetup: mov [r10],64 ArmSetup0: mov [pkg_cnt],(cMAXSIZE/128) IRAM0_E: 指向 err<z (IRAM0Size-(IRAM0_E-IRAM0_S)) ; check if go over limited range 并在这一行检测长度 问题在于在。INC文件中 IRAM0: 0x01e-0x07e 0x60 free MEM: interrupt vector 15 to int 63 IRAM0 equ 0x1e ; unused memory IRAM0Size equ (0x80-IRAM0) 这个0X1E正好是中断15的地址而这个地址是BIOS分给硬件中断的不可变的。 我有些搞不清楚这个IRAM0,1,2,3,还有一个U是做什么的 大家HELP一下 |
|