Advertisement
xerpi

fill from linux

Oct 17th, 2015
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 4.28 KB | None | 0 0
  1. #include "linux_config.h"
  2.  
  3. .arm
  4. .align 4
  5. .code 32
  6. .text
  7.  
  8. @ LCD Frambuffers stuff (Physical Addresses)
  9. #define LCD_FB_PDC0           (0x10400400)
  10. #define LCD_FB_PDC1           (0x10400500)
  11. #define LCD_FB_A_ADDR_OFFSET  (0x68)
  12. #define LCD_FB_B_ADDR_OFFSET  (0x94)
  13. #define FB_TOP_SIZE           (400*240*3)
  14. #define FB_BOT_SIZE           (320*240*3)
  15. #define FB_TOP_LEFT1          (VRAM_BASE)
  16. #define FB_TOP_LEFT2          (FB_TOP_LEFT1  + FB_TOP_SIZE)
  17. #define FB_TOP_RIGHT1         (FB_TOP_LEFT2  + FB_TOP_SIZE)
  18. #define FB_TOP_RIGHT2         (FB_TOP_RIGHT1 + FB_TOP_SIZE)
  19. #define FB_BOT_1              (FB_TOP_RIGHT2 + FB_TOP_SIZE)
  20. #define FB_BOT_2              (FB_BOT_1      + FB_BOT_SIZE)
  21.  
  22. @ This must be Position-independent Code
  23.  
  24.     .global linux_payloads_start
  25. linux_payloads_start:
  26.  
  27.     .cpu arm946e-s
  28.  
  29. arm9_start:
  30.     b arm9_init
  31.     @ required by BRAHMA
  32.     arm9ep_backup:  .long 0xFFFF0000
  33. arm9_init:
  34.     b linux_arm9_stage_start
  35.  
  36. @@@@@@@@@@@@@@@@@@@@@@@@ ARM9 Stage 0 @@@@@@@@@@@@@@@@@@@@@@@@
  37.  
  38. linux_arm9_stage_start:
  39.  
  40.     @ Disable MPU
  41.     mrc p15, 0, r0, c1, c0, 0
  42.     bic r0, r0, #1
  43.     mcr p15, 0, r0, c1, c0, 0
  44.  
  45.     @ Disable IRQ and FIQ
  46.     mrs r0, cpsr
  47.     orr r0, r0, #(0x80 | 0x40)
  48.     msr cpsr_c, r0
  49.  
  50.  
  51.     @ Drain write buffer
  52.     mcr p15, 0, r0, c7, c10, 4
  53.  
  54.     @ Map VRAM to region 7
  55.     @ Region base: 0x18000000
  56.     @ Region size: 8MB (0b10110)
  57.     ldr r0, =0x1800002D
  58.     mcr p15, 0, r0, c6, c7, 0
  59.  
  60.     @ Set region 7 permissions:
  61.     @ Privileged: Read/write access
  62.     @ User: Read/write access
  63.     mrc p15, 0, r0, c5, c0, 2
  64.     bic r0, r0, #(0b1111 << 28)
  65.     orr r0, r0, #(0b0011 << 28)
  66.     mcr p15, 0, r0, c5, c0, 2
  67.  
  68.     ldr r0, =SHARED_CHAR
  69.     ldr r1, =0xFFFFFF
  70.     str r1, [r0]
  71.  
  72.  
  73.     @ The ARM9 code is loaded to 0x23F00000 so the
  74.     @ linux_arm11_stage_start address will be at:
  75.     @     0x23F00000 + ARM9_payload_size
  76.  
  77.     ldr r0, =PA_ARM11_CODE_ADDR
  78.     ldr r1, linux_arm11_stage_pa
  79.     str r1, [r0]
  80.  
  81. loop:
  82.     @ldr r0, =SHARED_CHAR
  83.     @ldr r0, [r0]
  84.     @bl fill_screen
  85.  
  86.     b loop
  87.  
  88. @ r0 = color
  89. fill_screen:
  90.     mov r9, r0
  91.  
  92.     and r3, r0, #0xFF
  93.     lsr r4, r0, #8
  94.     and r4, r4, #0xFF
  95.     lsr r5, r0, #16
  96.     and r5, r5, #0xFF
  97.  
  98.     ldr r0, =(FB_TOP_SIZE)
  99.     ldr r1, =(FB_TOP_LEFT1)
  100.     ldr r7, =(FB_TOP_SIZE)
  101.     add r2, r1, r0 @limit_addr
  102.     mov r6, r1 @ ptr
  103. _fill_for_1:
  104.     strb r3, [r6, #0]
  105.     strb r4, [r6, #1]
  106.     strb r5, [r6, #2]
  107.     add r8, r6, r7
  108.     strb r3, [r8, #0]
  109.     strb r4, [r8, #1]
  110.     strb r5, [r8, #2]
  111.     add r6, r6, #3
  112.     cmp r6, r2
  113.     blt _fill_for_1
  114.  
  115.     mov r0, r9
  116.  
  117.     and r3, r0, #0xFF
  118.     lsr r4, r0, #8
  119.     and r4, r4, #0xFF
  120.     lsr r5, r0, #16
  121.     and r5, r5, #0xFF
  122.  
  123.     ldr r0, =(FB_TOP_SIZE)
  124.     ldr r1, =(FB_TOP_RIGHT1)
  125.     ldr r7, =(FB_TOP_SIZE)
  126.     add r2, r1, r0 @limit_addr
  127.     mov r6, r1 @ ptr
  128. _fill_for_2:
  129.     strb r3, [r6, #0]
  130.     strb r4, [r6, #1]
  131.     strb r5, [r6, #2]
  132.     add r8, r6, r7
  133.     strb r3, [r8, #0]
  134.     strb r4, [r8, #1]
  135.     strb r5, [r8, #2]
  136.     add r6, r6, #3
  137.     cmp r6, r2
  138.     blt _fill_for_2
  139.  
  140.     bx lr
  141.  
  142.  
  143.     .ltorg
  144.  
  145. linux_arm11_stage_pa:
  146.     .long 0x23F00000 + (linux_arm11_stage_start - linux_payloads_start)
  147.  
  148.  
  149. @@@@@@@@@@@@@@@@@@@@@@@@ ARM11 Stage 1 @@@@@@@@@@@@@@@@@@@@@@@@
  150.  
  151.     .cpu mpcore
  152. linux_arm11_stage_start:
  153.  
  154.     @ Disable FIQs, IRQs, imprecise aborts
  155.     @ and enter SVC mode
  156.     CPSID aif, #0x13
  157.  
  158.     @ Invalidate Entire Instruction Cache,
  159.     @ also flushes the branch target cache
  160.     mov r0, #0
  161.     mcr p15, 0, r0, c7, c5, 0
  162.  
  163.     @ Invalidate Entire Data Cache
  164.     mov r0, #0
  165.     mcr p15, 0, r0, c7, c6, 0
  166.  
  167.     @ Disable the MMU and data cache
  168.     @ (the MMU is already disabled)
  169.     mrc p15, 0, r1, c1, c0, 0
  170.     bic r1, r1, #0b101
  171.     mcr p15, 0, r1, c1, c0, 0
  172.  
  173.     @ Clear exclusive records
  174.     clrex
  175.  
  176.     @@@ Map FBs to the VRAM @@@
  177.  
  178.     @ Top screen
  179.     ldr r0, =LCD_FB_PDC0
  180.  
  181.     @ Left eye
  182.     ldr r1, =FB_TOP_LEFT1
  183.     str r1, [r0, #(LCD_FB_A_ADDR_OFFSET + 0)]
  184.     ldr r1, =FB_TOP_LEFT2
  185.     str r1, [r0, #(LCD_FB_A_ADDR_OFFSET + 4)]
  186.  
  187.     @ Right eye
  188.     ldr r1, =FB_TOP_RIGHT1
  189.     str r1, [r0, #(LCD_FB_B_ADDR_OFFSET + 0)]
  190.     ldr r1, =FB_TOP_RIGHT2
  191.     str r1, [r0, #(LCD_FB_B_ADDR_OFFSET + 4)]
  192.  
  193.     @ Bottom screen
  194.     ldr r0, =LCD_FB_PDC1
  195.  
  196.     ldr r1, =FB_BOT_1
  197.     str r1, [r0, #(LCD_FB_A_ADDR_OFFSET + 0)]
  198.     ldr r1, =FB_BOT_2
  199.     str r1, [r0, #(LCD_FB_A_ADDR_OFFSET + 4)]
  200.  
  201.     @ Setup the registers before
  202.     @ jumping to the kernel entry
  203.     mov r0, #0
  204.     ldr r1, =MACHINE_NUMBER
  205.     ldr r2, =PARAMS_ADDR
  206.     ldr lr, =ZIMAGE_ADDR
  207.  
  208.     @ Jump to the kernel!
  209.     bx lr
  210.  
  211.     .ltorg
  212.  
  213.     .global linux_payloads_end
  214. linux_payloads_end:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement