找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3382|回复: 1
打印 上一主题 下一主题
收起左侧

ARM mini2440裸奔 跑LCD手写代码

[复制链接]
跳转到指定楼层
楼主
ID:112317 发表于 2016-4-7 01:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ARM裸奔跑代码,LCD 实现手写功能,(mini2440)裸奔又进了一步,更一步熟悉ARM体系结构
全部代码下载: TOUCH----shouxie.rar (165.7 KB, 下载次数: 14)

部分源码预览:
  1. ;=========================================
  2. ; NAME: 2440INIT.S
  3. ; DESC: C start up codes
  4. ;       Configure memory, ISR ,stacks
  5. ;        Initialize C-variables
  6. ; HISTORY:
  7. ; 2002.02.25:kwtark: ver 0.0
  8. ; 2002.03.20:purnnamu: Add some functions for testing STOP,Sleep mode
  9. ; 2003.03.14:DonGo: Modified for 2440.
  10. ;=========================================

  11.         GET option.inc
  12.         GET memcfg.inc
  13.         GET 2440addr.inc

  14. BIT_SELFREFRESH EQU        (1<<22)

  15. ;Pre-defined constants
  16. USERMODE    EQU         0x10
  17. FIQMODE     EQU         0x11
  18. IRQMODE     EQU         0x12
  19. SVCMODE     EQU         0x13
  20. ABORTMODE   EQU         0x17
  21. UNDEFMODE   EQU         0x1b
  22. MODEMASK    EQU         0x1f
  23. NOINT       EQU         0xc0

  24. ;The location of stacks
  25. UserStack        EQU        (_STACK_BASEADDRESS-0x3800)        ;0x33ff4800 ~
  26. SVCStack        EQU        (_STACK_BASEADDRESS-0x2800)        ;0x33ff5800 ~
  27. UndefStack        EQU        (_STACK_BASEADDRESS-0x2400)        ;0x33ff5c00 ~
  28. AbortStack        EQU        (_STACK_BASEADDRESS-0x2000)        ;0x33ff6000 ~
  29. IRQStack        EQU        (_STACK_BASEADDRESS-0x1000)        ;0x33ff7000 ~
  30. FIQStack        EQU        (_STACK_BASEADDRESS-0x0)        ;0x33ff8000 ~

  31. ;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
  32.         GBLL    THUMBCODE
  33.         [ {CONFIG} = 16
  34. THUMBCODE SETL  {TRUE}
  35.             CODE32
  36.                 |
  37. THUMBCODE SETL  {FALSE}
  38.     ]

  39.                 MACRO
  40.         MOV_PC_LR
  41.                 [ THUMBCODE
  42.             bx lr
  43.                 |
  44.             mov        pc,lr
  45.                 ]
  46.         MEND

  47.                 MACRO
  48.         MOVEQ_PC_LR
  49.                 [ THUMBCODE
  50.         bxeq lr
  51.                 |
  52.             moveq pc,lr
  53.                 ]
  54.         MEND

  55.                 MACRO
  56. $HandlerLabel HANDLER $HandleLabel

  57. $HandlerLabel
  58.         sub        sp,sp,#4        ;decrement sp(to store jump address)
  59.         stmfd        sp!,{r0}        ;PUSH the work register to stack(lr does not push because it return to original address)
  60.         ldr     r0,=$HandleLabel;load the address of HandleXXX to r0
  61.         ldr     r0,[r0]         ;load the contents(service routine start address) of HandleXXX
  62.         str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
  63.         ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
  64.         MEND

  65.         IMPORT  |Image$RO$Base|        ; Base of ROM code
  66.         IMPORT  |Image$RO$Limit|  ; End of ROM code (=start of ROM data)
  67.         IMPORT  |Image$RW$Base|   ; Base of RAM to initialise
  68.         IMPORT  |Image$ZI$Base|   ; Base and limit of area
  69.         IMPORT  |Image$ZI$Limit|  ; to zero initialise

  70.         IMPORT        MMU_SetAsyncBusMode
  71.         IMPORT        MMU_SetFastBusMode        ;

  72.         IMPORT  Main    ; The main entry of mon program

  73.         AREA    Init,CODE,READONLY

  74.         ENTRY
  75.        
  76.         EXPORT        __ENTRY
  77. __ENTRY
  78. ResetEntry
  79.         ;1)The code, which converts to Big-endian, should be in little endian code.
  80.         ;2)The following little endian code will be compiled in Big-Endian mode.
  81.         ;  The code byte order should be changed as the memory bus width.
  82.         ;3)The pseudo instruction,DCD can not be used here because the linker generates error.
  83.         ASSERT        :DEF:ENDIAN_CHANGE
  84.         [ ENDIAN_CHANGE
  85.             ASSERT  :DEF:ENTRY_BUS_WIDTH
  86.             [ ENTRY_BUS_WIDTH=32
  87.                 b        ChangeBigEndian            ;DCD 0xea000007
  88.             ]

  89.             [ ENTRY_BUS_WIDTH=16
  90.                 andeq        r14,r7,r0,lsl #20   ;DCD 0x0007ea00
  91.             ]

  92.             [ ENTRY_BUS_WIDTH=8
  93.                 streq        r0,[r0,-r10,ror #1] ;DCD 0x070000ea
  94.             ]
  95.         |
  96.             b        ResetHandler
  97.     ]
  98.         b        HandlerUndef        ;handler for Undefined mode
  99.         b        HandlerSWI        ;handler for SWI interrupt
  100.         b        HandlerPabort        ;handler for PAbort
  101.         b        HandlerDabort        ;handler for DAbort
  102.         b        .                ;reserved
  103.         b        HandlerIRQ        ;handler for IRQ interrupt
  104.         b        HandlerFIQ        ;handler for FIQ interrupt

  105. ;@0x20
  106.         b        EnterPWDN        ; Must be @0x20.
  107. ChangeBigEndian
  108. ;@0x24
  109.         [ ENTRY_BUS_WIDTH=32
  110.             DCD        0xee110f10        ;0xee110f10 => mrc p15,0,r0,c1,c0,0
  111.             DCD        0xe3800080        ;0xe3800080 => orr r0,r0,#0x80;  //Big-endian
  112.             DCD        0xee010f10        ;0xee010f10 => mcr p15,0,r0,c1,c0,0
  113.         ]
  114.         [ ENTRY_BUS_WIDTH=16
  115.             DCD 0x0f10ee11
  116.             DCD 0x0080e380
  117.             DCD 0x0f10ee01
  118.         ]
  119.         [ ENTRY_BUS_WIDTH=8
  120.             DCD 0x100f11ee
  121.             DCD 0x800080e3
  122.             DCD 0x100f01ee
  123.     ]
  124.         DCD 0xffffffff  ;swinv 0xffffff is similar with NOP and run well in both endian mode.
  125.         DCD 0xffffffff
  126.         DCD 0xffffffff
  127.         DCD 0xffffffff
  128.         DCD 0xffffffff
  129.         b ResetHandler
  130.        
  131. HandlerFIQ      HANDLER HandleFIQ
  132. HandlerIRQ      HANDLER HandleIRQ
  133. HandlerUndef    HANDLER HandleUndef
  134. HandlerSWI      HANDLER HandleSWI
  135. HandlerDabort   HANDLER HandleDabort
  136. HandlerPabort   HANDLER HandlePabort

  137. IsrIRQ
  138.         sub        sp,sp,#4       ;reserved for PC
  139.         stmfd        sp!,{r8-r9}

  140.         ldr        r9,=INTOFFSET
  141.         ldr        r9,[r9]
  142.         ldr        r8,=HandleEINT0
  143.         add        r8,r8,r9,lsl #2
  144.         ldr        r8,[r8]
  145.         str        r8,[sp,#8]
  146.         ldmfd        sp!,{r8-r9,pc}


  147.         LTORG

  148. ;=======
  149. ; ENTRY
  150. ;=======
  151. ResetHandler
  152.         ldr        r0,=WTCON       ;watch dog disable
  153.         ldr        r1,=0x0
  154.         str        r1,[r0]

  155.         ldr        r0,=INTMSK
  156.         ldr        r1,=0xffffffff  ;all interrupt disable
  157.         str        r1,[r0]

  158.         ldr        r0,=INTSUBMSK
  159.         ldr        r1,=0x7fff                ;all sub interrupt disable
  160.         str        r1,[r0]

  161.         [ {TRUE}
  162.         ;rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);
  163.         ; Led_Display
  164.         ldr        r0,=GPBCON
  165.         ldr        r1,=0x00555555
  166.         str        r1,[r0]
  167.         ldr        r0,=GPBDAT
  168.         ldr        r1,=0x07fe
  169.         str        r1,[r0]
  170.         ]

  171.         ;To reduce PLL lock time, adjust the LOCKTIME register.
  172.         ldr        r0,=LOCKTIME
  173.         ldr        r1,=0xffffff
  174.         str        r1,[r0]

  175.     [ PLL_ON_START
  176.         ; Added for confirm clock divide. for 2440.
  177.         ; Setting value Fclk:Hclk:Pclk
  178.         ldr        r0,=CLKDIVN
  179.         ldr        r1,=CLKDIV_VAL                ; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6.
  180.         str        r1,[r0]
  181. ;        MMU_SetAsyncBusMode and MMU_SetFastBusMode over 4K, so do not call here
  182. ;        call it after copy
  183. ;        [ CLKDIV_VAL>1                 ; means Fclk:Hclk is not 1:1.
  184. ;        bl MMU_SetAsyncBusMode
  185. ;        |
  186. ;        bl MMU_SetFastBusMode        ; default value.
  187. ;        ]
  188.         ;program has not been copied, so use these directly
  189.         [ CLKDIV_VAL>1                 ; means Fclk:Hclk is not 1:1.
  190.         mrc p15,0,r0,c1,c0,0
  191.         orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA
  192.         mcr p15,0,r0,c1,c0,0
  193.         |
  194.         mrc p15,0,r0,c1,c0,0
  195.         bic r0,r0,#0xc0000000;R1_iA:OR:R1_nF
  196.         mcr p15,0,r0,c1,c0,0
  197.         ]
  198.        
  199.         ;Configure UPLL
  200.         ldr        r0,=UPLLCON
  201.         ldr        r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)  
  202.         str        r1,[r0]
  203.         nop        ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.
  204.         nop
  205.         nop
  206.         nop
  207.         nop
  208.         nop
  209.         nop
  210.         ;Configure MPLL
  211.         ldr        r0,=MPLLCON
  212.         ldr        r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=16.9344MHz
  213.         str        r1,[r0]
  214.     ]

  215.         ;Check if the boot is caused by the wake-up from SLEEP mode.
  216.         ldr        r1,=GSTATUS2
  217.         ldr        r0,[r1]
  218.         tst        r0,#0x2
  219.         ;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.
  220.         bne        WAKEUP_SLEEP

  221.         EXPORT StartPointAfterSleepWakeUp
  222. StartPointAfterSleepWakeUp

  223.         ;Set memory control registers
  224.         ;ldr        r0,=SMRDATA
  225.         adrl        r0, SMRDATA        ;be careful!
  226.         ldr        r1,=BWSCON        ;BWSCON Address
  227.         add        r2, r0, #52        ;End address of SMRDATA

  228. 0
  229.         ldr        r3, [r0], #4
  230.         str        r3, [r1], #4
  231.         cmp        r2, r0
  232.         bne        %B0

  233. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  234. ;;;;;;;;;;;;;       When EINT0 is pressed,  Clear SDRAM
  235. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  236. ; check if EIN0 button is pressed

  237.        ldr        r0,=GPFCON
  238.         ldr        r1,=0x0
  239.         str        r1,[r0]
  240.         ldr        r0,=GPFUP
  241.         ldr        r1,=0xff
  242.         str        r1,[r0]

  243.         ldr        r1,=GPFDAT
  244.         ldr        r0,[r1]
  245.        bic        r0,r0,#(0x1e<<1)  ; bit clear
  246.         tst        r0,#0x1
  247.         bne %F1
  248.        
  249.        

  250. ; Clear SDRAM Start
  251.   
  252.         ldr        r0,=GPFCON
  253.         ldr        r1,=0x55aa
  254.         str        r1,[r0]
  255. ;        ldr        r0,=GPFUP
  256. ;        ldr        r1,=0xff
  257. ;        str        r1,[r0]
  258.         ldr        r0,=GPFDAT
  259.         ldr        r1,=0x0
  260.         str        r1,[r0]        ;LED=****

  261.         mov r1,#0
  262.         mov r2,#0
  263.         mov r3,#0
  264.         mov r4,#0
  265.         mov r5,#0
  266.         mov r6,#0
  267.         mov r7,#0
  268.         mov r8,#0
  269.        
  270.         ldr        r9,=0x4000000   ;64MB
  271.         ldr        r0,=0x30000000
  272. 0       
  273.         stmia        r0!,{r1-r8}
  274.         subs        r9,r9,#32
  275.         bne        %B0

  276. ;Clear SDRAM End

  277. 1

  278.                 ;Initialize stacks
  279.         bl        InitStacks

  280. ;===========================================================
  281.        
  282.         ldr        r0, =BWSCON
  283.         ldr        r0, [r0]
  284.         ands        r0, r0, #6                ;OM[1:0] != 0, NOR FLash boot
  285.         bne        copy_proc_beg                ;do not read nand flash
  286.         adr        r0, ResetEntry                ;OM[1:0] == 0, NAND FLash boot
  287.         cmp        r0, #0                                ;if use Multi-ice,
  288.         bne        copy_proc_beg                ;do not read nand flash for boot
  289.         ;nop
  290. ;===========================================================
  291. nand_boot_beg
  292.         mov        r5, #NFCONF
  293.         ;set timing value
  294.         ldr        r0,        =(7<<12)|(7<<8)|(7<<4)
  295.         str        r0,        [r5]
  296.         ;enable control
  297.         ldr        r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)
  298.         str        r0, [r5, #4]
  299.        
  300.         bl        ReadNandID
  301.         mov        r6, #0
  302.         ldr        r0, =0xec73
  303.         cmp        r5,        r0
  304.         beq        %F1
  305.         ldr        r0, =0xec75
  306.         cmp        r5, r0
  307.         beq        %F1
  308.         mov        r6, #1
  309. 1       
  310.         bl        ReadNandStatus
  311.        
  312.         mov        r8, #0
  313.         ldr        r9, =ResetEntry
  314. 2       
  315.         ands        r0, r8, #0x1f
  316.         bne                %F3
  317.         mov                r0, r8
  318.         bl                CheckBadBlk
  319.         cmp                r0, #0
  320.         addne        r8, r8, #32
  321.         bne                %F4
  322. 3       
  323.         mov        r0, r8
  324.         mov        r1, r9
  325.         bl        ReadNandPage
  326.         add        r9, r9, #512
  327.         add        r8, r8, #1
  328. 4       
  329.         cmp        r8, #5120
  330.         bcc        %B2
  331.        
  332.         mov        r5, #NFCONF                        ;DsNandFlash
  333.         ldr        r0, [r5, #4]
  334.         bic r0, r0, #1
  335.         str        r0, [r5, #4]
  336.         ldr        pc, =copy_proc_beg
  337. ;===========================================================
  338. copy_proc_beg
  339.         adr        r0, ResetEntry
  340.         ldr        r2, BaseOfROM
  341.         cmp        r0, r2
  342.         ldreq        r0, TopOfROM
  343.         beq        InitRam       
  344.         ldr r3, TopOfROM
  345. 0       
  346.         ldmia        r0!, {r4-r7}
  347.         stmia        r2!, {r4-r7}
  348.         cmp        r2, r3
  349.         bcc        %B0
  350.        
  351.         sub        r2, r2, r3
  352.         sub        r0, r0, r2                               
  353.                
  354. InitRam       
  355.         ldr        r2, BaseOfBSS
  356.         ldr        r3, BaseOfZero       
  357. 0
  358.         cmp        r2, r3
  359.         ldrcc        r1, [r0], #4
  360.         strcc        r1, [r2], #4
  361.         bcc        %B0       

  362.         mov        r0,        #0
  363.         ldr        r3,        EndOfBSS
  364. 1       
  365.         cmp        r2,        r3
  366.         strcc        r0, [r2], #4
  367.         bcc        %B1
  368.        
  369.         ldr        pc, =%F2                ;goto compiler address
  370. 2
  371.        
  372. ;        [ CLKDIV_VAL>1                 ; means Fclk:Hclk is not 1:1.
  373. ;        bl        MMU_SetAsyncBusMode
  374. ;        |
  375. ;        bl MMU_SetFastBusMode        ; default value.
  376. ;        ]
  377.        
  378.         ;bl        Led_Test

  379. ;===========================================================
  380.           ; Setup IRQ handler
  381.         ldr        r0,=HandleIRQ       ;This routine is needed
  382.         ldr        r1,=IsrIRQ          ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c
  383.         str        r1,[r0]

  384. ;        ;Copy and paste RW data/zero initialized data
  385. ;        ldr        r0, =|Image$RO$Limit| ; Get pointer to ROM data
  386. ;        ldr        r1, =|Image$RW$Base|  ; and RAM copy
  387. ;        ldr        r3, =|Image$ZI$Base|
  388. ;
  389. ;        ;Zero init base => top of initialised data
  390. ;        cmp        r0, r1      ; Check that they are different
  391. ;        beq        %F2
  392. ;1
  393. ;        cmp        r1, r3      ; Copy init data
  394. ;        ldrcc        r2, [r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4
  395. ;        strcc        r2, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4
  396. ;        bcc        %B1
  397. ;2
  398. ;        ldr        r1, =|Image$ZI$Limit| ; Top of zero init segment
  399. ;        mov        r2, #0
  400. ;3
  401. ;        cmp        r3, r1      ; Zero init
  402. ;        strcc        r2, [r3], #4
  403. ;        bcc        %B3


  404.     [ :LNOT:THUMBCODE
  405.                 bl        Main        ;Do not use main() because ......
  406.                 ;ldr        pc, =Main        ;
  407.                 b        .
  408.     ]

  409.     [ THUMBCODE         ;for start-up code for Thumb mode
  410.                 orr        lr,pc,#1
  411.                 bx        lr
  412.                 CODE16
  413.                 bl        Main        ;Do not use main() because ......
  414.                 b        .
  415.                 CODE32
  416.     ]


  417. ;function initializing stacks
  418. InitStacks
  419.         ;Do not use DRAM,such as stmfd,ldmfd......
  420.         ;SVCstack is initialized before
  421.         ;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
  422.         mrs        r0,cpsr
  423.         bic        r0,r0,#MODEMASK
  424.         orr        r1,r0,#UNDEFMODE|NOINT
  425.         msr        cpsr_cxsf,r1                ;UndefMode
  426.         ldr        sp,=UndefStack                ; UndefStack=0x33FF_5C00

  427.         orr        r1,r0,#ABORTMODE|NOINT
  428.         msr        cpsr_cxsf,r1                ;AbortMode
  429.         ldr        sp,=AbortStack                ; AbortStack=0x33FF_6000

  430.         orr        r1,r0,#IRQMODE|NOINT
  431.         msr        cpsr_cxsf,r1                ;IRQMode
  432.         ldr        sp,=IRQStack                ; IRQStack=0x33FF_7000

  433.         orr        r1,r0,#FIQMODE|NOINT
  434.         msr        cpsr_cxsf,r1                ;FIQMode
  435.         ldr        sp,=FIQStack                ; FIQStack=0x33FF_8000

  436.         bic        r0,r0,#MODEMASK|NOINT
  437.         orr        r1,r0,#SVCMODE
  438.         msr        cpsr_cxsf,r1                ;SVCMode
  439.         ldr        sp,=SVCStack                ; SVCStack=0x33FF_5800

  440.         ;USER mode has not be initialized.

  441.         mov        pc,lr
  442.         ;The LR register will not be valid if the current mode is not SVC mode.
  443.        
  444. ;===========================================================
  445. ReadNandID
  446.         mov      r7,#NFCONF
  447.         ldr      r0,[r7,#4]                ;NFChipEn();
  448.         bic      r0,r0,#2
  449.         str      r0,[r7,#4]
  450.         mov      r0,#0x90                ;WrNFCmd(RdIDCMD);
  451.         strb     r0,[r7,#8]
  452.         mov      r4,#0                        ;WrNFAddr(0);
  453.         strb     r4,[r7,#0xc]
  454. 1                                                        ;while(NFIsBusy());
  455.         ldr      r0,[r7,#0x20]
  456.         tst      r0,#1
  457.         beq      %B1
  458.         ldrb     r0,[r7,#0x10]        ;id  = RdNFDat()<<8;
  459.         mov      r0,r0,lsl #8
  460.         ldrb     r1,[r7,#0x10]        ;id |= RdNFDat();
  461.         orr      r5,r1,r0
  462.         ldr      r0,[r7,#4]                ;NFChipDs();
  463.         orr      r0,r0,#2
  464.         str      r0,[r7,#4]
  465.         mov                 pc,lr       
  466.        
  467. ReadNandStatus
  468.         mov                 r7,#NFCONF
  469.         ldr      r0,[r7,#4]                ;NFChipEn();
  470.         bic      r0,r0,#2
  471.         str      r0,[r7,#4]
  472.         mov      r0,#0x70                ;WrNFCmd(QUERYCMD);
  473.         strb     r0,[r7,#8]       
  474.         ldrb     r1,[r7,#0x10]        ;r1 = RdNFDat();
  475.         ldr      r0,[r7,#4]                ;NFChipDs();
  476.         orr      r0,r0,#2
  477.         str      r0,[r7,#4]
  478.         mov                 pc,lr

  479. WaitNandBusy
  480.         mov      r0,#0x70                ;WrNFCmd(QUERYCMD);
  481.         mov      r1,#NFCONF
  482.         strb     r0,[r1,#8]
  483. 1                                                        ;while(!(RdNFDat()&0x40));       
  484.         ldrb     r0,[r1,#0x10]
  485.         tst      r0,#0x40
  486.         beq                 %B1
  487.         mov      r0,#0                        ;WrNFCmd(READCMD0);
  488.         strb     r0,[r1,#8]
  489.         mov      pc,lr

  490. CheckBadBlk
  491.         mov                r7, lr
  492.         mov                r5, #NFCONF
  493.        
  494.         bic      r0,r0,#0x1f        ;addr &= ~0x1f;
  495.         ldr      r1,[r5,#4]                ;NFChipEn()
  496.         bic      r1,r1,#2
  497.         str      r1,[r5,#4]

  498.         mov      r1,#0x50                ;WrNFCmd(READCMD2)
  499.         strb     r1,[r5,#8]
  500.         mov      r1, #5;6                ;6->5
  501.         strb     r1,[r5,#0xc]        ;WrNFAddr(5);(6) 6->5
  502.         strb     r0,[r5,#0xc]        ;WrNFAddr(addr)
  503.         mov      r1,r0,lsr #8        ;WrNFAddr(addr>>8)
  504.         strb     r1,[r5,#0xc]
  505.         cmp      r6,#0                        ;if(NandAddr)               
  506.         movne    r0,r0,lsr #16        ;WrNFAddr(addr>>16)
  507.         strneb   r0,[r5,#0xc]
  508.        
  509. ;        bl                WaitNandBusy        ;WaitNFBusy()
  510.         ;do not use WaitNandBusy, after WaitNandBusy will read part A!
  511.         mov        r0, #100
  512. 1
  513.         subs        r0, r0, #1
  514.         bne        %B1
  515. 2
  516.         ldr        r0, [r5, #0x20]
  517.         tst        r0, #1
  518.         beq        %B2       

  519.         ldrb        r0, [r5,#0x10]        ;RdNFDat()
  520.         sub                r0, r0, #0xff
  521.        
  522.         mov      r1,#0                        ;WrNFCmd(READCMD0)
  523.         strb     r1,[r5,#8]
  524.        
  525.         ldr      r1,[r5,#4]                ;NFChipDs()
  526.         orr      r1,r1,#2
  527.         str      r1,[r5,#4]
  528.        
  529.         mov                pc, r7
  530.        
  531. ReadNandPage
  532.         mov                 r7,lr
  533.         mov      r4,r1
  534.         mov      r5,#NFCONF

  535.         ldr      r1,[r5,#4]                ;NFChipEn()
  536.         bic      r1,r1,#2
  537.         str      r1,[r5,#4]       

  538.         mov      r1,#0                        ;WrNFCmd(READCMD0)
  539.         strb     r1,[r5,#8]       
  540.         strb     r1,[r5,#0xc]        ;WrNFAddr(0)
  541.         strb     r0,[r5,#0xc]        ;WrNFAddr(addr)
  542.         mov      r1,r0,lsr #8        ;WrNFAddr(addr>>8)
  543.         strb     r1,[r5,#0xc]       
  544.         cmp      r6,#0                        ;if(NandAddr)               
  545.         movne    r0,r0,lsr #16        ;WrNFAddr(addr>>16)
  546.         strneb   r0,[r5,#0xc]
  547.        
  548.         ldr      r0,[r5,#4]                ;InitEcc()
  549.         orr      r0,r0,#0x10
  550.         str      r0,[r5,#4]
  551.        
  552.         bl       WaitNandBusy        ;WaitNFBusy()
  553.        
  554.         mov      r0,#0                        ;for(i=0; i<512; i++)
  555. 1
  556.         ldrb     r1,[r5,#0x10]        ;buf[i] = RdNFDat()
  557.         strb     r1,[r4,r0]
  558.         add      r0,r0,#1
  559.         bic      r0,r0,#0x10000
  560.         cmp      r0,#0x200
  561.         bcc      %B1
  562.        
  563.         ldr      r0,[r5,#4]                ;NFChipDs()
  564.         orr      r0,r0,#2
  565.         str      r0,[r5,#4]
  566.                
  567.         mov                 pc,r7


  568. ;===========================================================

  569.         LTORG

  570. ;GCS0->SST39VF1601
  571. ;GCS1->16c550
  572. ;GCS2->IDE
  573. ;GCS3->CS8900
  574. ;GCS4->DM9000
  575. ;GCS5->CF Card
  576. ;GCS6->SDRAM
  577. ;GCS7->unused

  578. SMRDATA DATA
  579. ; Memory configuration should be optimized for best performance
  580. ; The following parameter is not optimized.
  581. ; Memory access cycle parameter strategy
  582. ; 1) The memory settings is  safe parameters even at HCLK=75Mhz.
  583. ; 2) SDRAM refresh period is for HCLK<=75Mhz.

  584.         DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
  585.         DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0
  586.         DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1
  587.         DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2
  588.         DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3
  589.         DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4
  590.         DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5
  591.         DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6
  592.         DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7
  593.         DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+(Tchr<<16)+REFCNT)

  594.         DCD 0x32            ;SCLK power saving mode, BANKSIZE 128M/128M

  595.         DCD 0x30            ;MRSR6 CL=3clk
  596.         DCD 0x30            ;MRSR7 CL=3clk
  597.        
  598. BaseOfROM        DCD        |Image$RO$Base|
  599. TopOfROM        DCD        |Image$RO$Limit|
  600. BaseOfBSS        DCD        |Image$RW$Base|
  601. BaseOfZero        DCD        |Image$ZI$Base|
  602. EndOfBSS        DCD        |Image$ZI$Limit|

  603.         ALIGN
  604.        
  605. ;Function for entering power down mode
  606. ; 1. SDRAM should be in self-refresh mode.
  607. ; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.
  608. ; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.
  609. ; 4. The I-cache may have to be turned on.
  610. ; 5. The location of the following code may have not to be changed.

  611. ;void EnterPWDN(int CLKCON);
  612. EnterPWDN
  613.         mov r2,r0                ;r2=rCLKCON
  614.         tst r0,#0x8                ;SLEEP mode?
  615.         bne ENTER_SLEEP

  616. ENTER_STOP
  617.         ldr r0,=REFRESH
  618.         ldr r3,[r0]                ;r3=rREFRESH
  619.         mov r1, r3
  620.         orr r1, r1, #BIT_SELFREFRESH
  621.         str r1, [r0]                ;Enable SDRAM self-refresh

  622.         mov r1,#16                        ;wait until self-refresh is issued. may not be needed.
  623. 0        subs r1,r1,#1
  624.         bne %B0

  625.         ldr r0,=CLKCON                ;enter STOP mode.
  626.         str r2,[r0]

  627.         mov r1,#32
  628. 0        subs r1,r1,#1        ;1) wait until the STOP mode is in effect.
  629.         bne %B0                ;2) Or wait here until the CPU&Peripherals will be turned-off
  630.                         ;   Entering SLEEP mode, only the reset by wake-up is available.

  631.         ldr r0,=REFRESH ;exit from SDRAM self refresh mode.
  632.         str r3,[r0]

  633.         MOV_PC_LR

  634. ENTER_SLEEP
  635.         ;NOTE.
  636.         ;1) rGSTATUS3 should have the return address after wake-up from SLEEP mode.

  637.         ldr r0,=REFRESH
  638.         ldr r1,[r0]                ;r1=rREFRESH
  639.         orr r1, r1, #BIT_SELFREFRESH
  640.         str r1, [r0]                ;Enable SDRAM self-refresh

  641.         mov r1,#16                        ;Wait until self-refresh is issued,which may not be needed.
  642. 0        subs r1,r1,#1
  643.         bne %B0

  644.         ldr        r1,=MISCCR
  645.         ldr        r0,[r1]
  646.         orr        r0,r0,#(7<<17)  ;Set SCLK0=0, SCLK1=0, SCKE=0.
  647.         str        r0,[r1]

  648.         ldr r0,=CLKCON                ; Enter sleep mode
  649.         str r2,[r0]

  650.         b .                        ;CPU will die here.


  651. WAKEUP_SLEEP
  652.         ;Release SCLKn after wake-up from the SLEEP mode.
  653.         ldr        r1,=MISCCR
  654.         ldr        r0,[r1]
  655.         bic        r0,r0,#(7<<17)  ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:0->=SCKE.
  656.         str        r0,[r1]

  657.         ;Set memory control registers
  658.         ldr        r0,=SMRDATA        ;be careful!
  659.         ldr        r1,=BWSCON        ;BWSCON Address
  660.         add        r2, r0, #52        ;End address of SMRDATA
  661. 0
  662.         ldr        r3, [r0], #4
  663.         str        r3, [r1], #4
  664.         cmp        r2, r0
  665.         bne        %B0

  666.         mov r1,#256
  667. 0        subs r1,r1,#1        ;1) wait until the SelfRefresh is released.
  668.         bne %B0

  669.         ldr r1,=GSTATUS3         ;GSTATUS3 has the start address just after SLEEP wake-up
  670.         ldr r0,[r1]

  671.         mov pc,r0
  672.        
  673. ;=====================================================================
  674. ; Clock division test
  675. ; Assemble code, because VSYNC time is very short
  676. ;=====================================================================
  677.         EXPORT CLKDIV124
  678.         EXPORT CLKDIV144
  679.        
  680. CLKDIV124
  681.        
  682.         ldr     r0, = CLKDIVN
  683.         ldr     r1, = 0x3                ; 0x3 = 1:2:4
  684.         str     r1, [r0]
  685. ;        wait until clock is stable
  686.         nop
  687.         nop
  688.         nop
  689.         nop
  690.         nop

  691.         ldr     r0, = REFRESH
  692.         ldr     r1, [r0]
  693.         bic                r1, r1, #0xff
  694.         bic                r1, r1, #(0x7<<8)
  695.         orr                r1, r1, #0x470        ; REFCNT135
  696.         str     r1, [r0]
  697.         nop
  698.         nop
  699.         nop
  700.         nop
  701.         nop
  702.         mov     pc, lr

  703. CLKDIV144
  704.         ldr     r0, = CLKDIVN
  705.         ldr     r1, = 0x4                ; 0x4 = 1:4:4
  706.         str     r1, [r0]
  707. ;        wait until clock is stable
  708.         nop
  709.         nop
  710.         nop
  711.         nop
  712.         nop

  713.         ldr     r0, = REFRESH
  714.         ldr     r1, [r0]
  715.         bic                r1, r1, #0xff
  716.         bic                r1, r1, #(0x7<<8)
  717.         orr                r1, r1, #0x630        ; REFCNT675 - 1520
  718.         str     r1, [r0]
  719.         nop
  720.         nop
  721.         nop
  722.         nop
  723.         nop
  724.         mov     pc, lr


  725.         ALIGN

  726.         AREA RamData, DATA, READWRITE

  727.         ^   _ISR_STARTADDRESS                ; _ISR_STARTADDRESS=0x33FF_FF00
  728. HandleReset         #   4
  729. HandleUndef         #   4
  730. HandleSWI                #   4
  731. HandlePabort    #   4
  732. HandleDabort    #   4
  733. HandleReserved  #   4
  734. HandleIRQ                #   4
  735. HandleFIQ                #   4

  736. ;Do not use the label 'IntVectorTable',
  737. ;The value of IntVectorTable is different with the address you think it may be.
  738. ;IntVectorTable
  739. ;@0x33FF_FF20
  740. HandleEINT0                #   4
  741. HandleEINT1                #   4
  742. HandleEINT2                #   4
  743. HandleEINT3                #   4
  744. HandleEINT4_7        #   4
  745. HandleEINT8_23        #   4
  746. HandleCAM                #   4                ; Added for 2440.
  747. HandleBATFLT        #   4
  748. HandleTICK                #   4
  749. HandleWDT                #   4
  750. HandleTIMER0         #   4
  751. HandleTIMER1         #   4
  752. HandleTIMER2         #   4
  753. HandleTIMER3         #   4
  754. HandleTIMER4         #   4
  755. HandleUART2          #   4
  756. ;@0x33FF_FF60
  757. HandleLCD                 #   4
  758. HandleDMA0                #   4
  759. HandleDMA1                #   4
  760. HandleDMA2                #   4
  761. HandleDMA3                #   4
  762. HandleMMC                #   4
  763. HandleSPI0                #   4
  764. HandleUART1                #   4
  765. HandleNFCON                #   4                ; Added for 2440.
  766. HandleUSBD                #   4
  767. HandleUSBH                #   4
  768. HandleIIC                #   4
  769. HandleUART0         #   4
  770. HandleSPI1                 #   4
  771. HandleRTC                 #   4
  772. HandleADC                 #   4
  773. ;@0x33FF_FFA0
  774.         END
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:116389 发表于 2016-6-1 13:50 | 只看该作者
支持楼主,抢沙发,楼主棒棒哒
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表