7.1 _start 入口函数
7.1.1 vectors.S (arch\arm\lib)
从上一节可以知道,uboot 的入口函数为 _start 。此 函数定义在 vectors.S (arch\arm\lib) 中。
在此文件中,定义了异常向量表,及其操作函数。_start 开始后,直接跳入 reset 复位中执行启动。
1 #include <config.h> 2 3 /* 4 ************************************************************************* 5 * 6 * Symbol _start is referenced elsewhere, so make it global 7 * 8 ************************************************************************* 9 */ 10 /* 定义全局函数 _start,为 uboot 代码的起始函数 */ 11 .globl _start 12 13 /* 14 ************************************************************************* 15 * 16 * Vectors have their own section so linker script can map them easily 17 * 18 ************************************************************************* 19 */ 20 21 .section ".vectors", "ax" 22 23 /* 24 ************************************************************************* 25 * 26 * Exception vectors as described in ARM reference manuals 27 * 28 * Uses indirect branch to allow reaching handlers anywhere in memory. 29 * 30 ************************************************************************* 31 */ 32 33 _start: 34 35 #ifdef CONFIG_SYS_DV_NOR_BOOT_CFG 36 .word CONFIG_SYS_DV_NOR_BOOT_CFG 37 #endif 38 /* 当异常发生的时候,由硬件机制处理器自动的跳到一个固定地址去执行相关异常处理程序,而这个固定地址就是所谓的异常向量。 */ 39 b reset /* 跳转到reset执行 0x00000000 复位异常*/ 40 /* LDR{条件} 目的寄存器 <存储器地址> */ 41 ldr pc, _undefined_instruction /* 未定义指令终止模式,当未定义指令执行时进入该模式,可用于支持硬件协处理器的软件仿真 */ 42 ldr pc, _software_interrupt /* 软中断异常 */ 43 ldr pc, _prefetch_abort /* 预取异常 */ 44 ldr pc, _data_abort /* 数据访问终止模式,当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护 */ 45 ldr pc, _not_used /* 未使用异常,多余的指令 */ 46 ldr pc, _irq /* 中断模式,用于通用的中断处理 */ 47 ldr pc, _fiq /* 快速中断模式,用于高速数据传输或通道处理 */ 48 49 #ifdef CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK 50 /* 51 * Various SoCs need something special and SoC-specific up front in 52 * order to boot, allow them to set that in their boot0.h file and then 53 * use it here. 54 */ 55 #include <asm/arch/boot0.h> 56 ARM_SOC_BOOT0_HOOK 57 #endif 58 59 /* 60 ************************************************************************* 61 * 62 * Indirect vectors table 63 * 64 * Symbols referenced here must be defined somewhere else 65 * 66 ************************************************************************* 67 */ 68 69 .globl _undefined_instruction 70 .globl _software_interrupt 71 .globl _prefetch_abort 72 .globl _data_abort 73 .globl _not_used 74 .globl _irq 75 .globl _fiq 76 77 _undefined_instruction: .word undefined_instruction 78 _software_interrupt: .word software_interrupt 79 _prefetch_abort: .word prefetch_abort 80 _data_abort: .word data_abort 81 _not_used: .word not_used 82 _irq: .word irq 83 _fiq: .word fiq 84 85 .balignl 16,0xdeadbeef 86 87 /* 88 ************************************************************************* 89 * 90 * Interrupt handling 91 * 92 ************************************************************************* 93 */ 94 95 /* SPL interrupt handling: just hang */ 96 97 #ifdef CONFIG_SPL_BUILD /** CONFIG_SPL_BUILD 未定义,不走此分支 */ 98 99 .align 5 100 undefined_instruction: 101 software_interrupt: 102 prefetch_abort: 103 data_abort: 104 not_used: 105 irq: 106 fiq: 107 108 1: 109 bl 1b /* hang and never return */ 110 111 #else /* !CONFIG_SPL_BUILD */ 112 113 /* IRQ stack memory (calculated at run-time) + 8 bytes */ 114 .globl IRQ_STACK_START_IN 115 IRQ_STACK_START_IN: 116 .word 0x0badc0de 117 118 #ifdef CONFIG_USE_IRQ /** CONFIG_USE_IRQ 未定义 不走 */ 119 /* IRQ stack memory (calculated at run-time) */ 120 .globl IRQ_STACK_START 121 IRQ_STACK_START: 122 .word 0x0badc0de 123 124 /* IRQ stack memory (calculated at run-time) */ 125 .globl FIQ_STACK_START 126 FIQ_STACK_START: 127 .word 0x0badc0de 128 129 #endif /* CONFIG_USE_IRQ */ 130 131 @ 132 @ IRQ stack frame. 133 @ 134 #define S_FRAME_SIZE 72 135 136 #define S_OLD_R0 68 137 #define S_PSR 64 138 #define S_PC 60 139 #define S_LR 56 140 #define S_SP 52 141 142 #define S_IP 48 143 #define S_FP 44 144 #define S_R10 40 145 #define S_R9 36 146 #define S_R8 32 147 #define S_R7 28 148 #define S_R6 24 149 #define S_R5 20 150 #define S_R4 16 151 #define S_R3 12 152 #define S_R2 8 153 #define S_R1 4 154 #define S_R0 0 155 156 #define MODE_SVC 0x13 157 #define I_BIT 0x80 158 159 /* 160 * use bad_save_user_regs for abort/prefetch/undef/swi ... 161 * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling 162 * 发生异常中断时候保存的用户信息的寄存器设置 163 */ 164 165 .macro bad_save_user_regs 166 @ carve out a frame on current user stack 167 sub sp, sp, #S_FRAME_SIZE 168 stmia sp, {r0 - r12} @ Save user registers (now in svc mode) r0-r12 169 ldr r2, IRQ_STACK_START_IN 170 @ get values for "aborted" pc and cpsr (into parm regs) 171 ldmia r2, {r2 - r3} 172 add r0, sp, #S_FRAME_SIZE @ grab pointer to old stack 173 add r5, sp, #S_SP 174 mov r1, lr 175 stmia r5, {r0 - r3} @ save sp_SVC, lr_SVC, pc, cpsr 176 mov r0, sp @ save current stack into r0 (param register) 177 .endm 178 179 .macro irq_save_user_regs 180 sub sp, sp, #S_FRAME_SIZE 181 stmia sp, {r0 - r12} @ Calling r0-r12 182 @ !!!! R8 NEEDS to be saved !!!! a reserved stack spot would be good. 183 add r8, sp, #S_PC 184 stmdb r8, {sp, lr}^ @ Calling SP, LR 185 str lr, [r8, #0] @ Save calling PC 186 mrs r6, spsr 187 str r6, [r8, #4] @ Save CPSR 188 str r0, [r8, #8] @ Save OLD_R0 189 mov r0, sp 190 .endm 191 192 .macro irq_restore_user_regs 193 ldmia sp, {r0 - lr}^ @ Calling r0 - lr 194 mov r0, r0 195 ldr lr, [sp, #S_PC] @ Get PC 196 add sp, sp, #S_FRAME_SIZE 197 subs pc, lr, #4 @ return & move spsr_svc into cpsr 198 .endm 199 200 .macro get_bad_stack 201 ldr r13, IRQ_STACK_START_IN @ setup our mode stack 202 203 str lr, [r13] @ save caller lr in position 0 of saved stack 204 mrs lr, spsr @ get the spsr 205 str lr, [r13, #4] @ save spsr in position 1 of saved stack 206 mov r13, #MODE_SVC @ prepare SVC-Mode 207 @ msr spsr_c, r13 208 msr spsr, r13 @ switch modes, make sure moves will execute 209 mov lr, pc @ capture return pc 210 movs pc, lr @ jump to next instruction & switch modes. 211 .endm 212 213 .macro get_irq_stack @ setup IRQ stack 214 ldr sp, IRQ_STACK_START 215 .endm 216 217 .macro get_fiq_stack @ setup FIQ stack 218 ldr sp, FIQ_STACK_START 219 .endm 220 221 /* 222 * exception handlers 223 */ 224 225 .align 5 226 undefined_instruction: 227 get_bad_stack 228 bad_save_user_regs 229 bl do_undefined_instruction 230 231 .align 5 232 software_interrupt: 233 get_bad_stack 234 bad_save_user_regs 235 bl do_software_interrupt 236 237 .align 5 238 prefetch_abort: 239 get_bad_stack 240 bad_save_user_regs 241 bl do_prefetch_abort 242 243 .align 5 244 data_abort: 245 get_bad_stack 246 bad_save_user_regs 247 bl do_data_abort 248 249 .align 5 250 not_used: 251 get_bad_stack 252 bad_save_user_regs 253 bl do_not_used 254 255 #ifdef CONFIG_USE_IRQ 256 257 .align 5 258 irq: 259 get_irq_stack 260 irq_save_user_regs 261 bl do_irq 262 irq_restore_user_regs 263 264 .align 5 265 fiq: 266 get_fiq_stack 267 /* someone ought to write a more effiction fiq_save_user_regs */ 268 irq_save_user_regs 269 bl do_fiq 270 irq_restore_user_regs 271 272 #else 273 274 .align 5 275 irq: 276 get_bad_stack 277 bad_save_user_regs 278 bl do_irq 279 280 .align 5 281 fiq: 282 get_bad_stack 283 bad_save_user_regs 284 bl do_fiq 285 286 #endif /* CONFIG_USE_IRQ */ 287 288 #endif /* CONFIG_SPL_BUILD */
7.1.2 start.S (arch\arm\cpu\arm920t)
在此汇编中,主要执行 reset 函数,主要是做一些重要的硬件初始化、重定向arm启动到 ram,设置栈、跳转到第二阶段去执行启动、
1 #include <asm-offsets.h> 2 #include <common.h> 3 #include <config.h> 4 5 /* 6 ************************************************************************* 7 * 8 * Startup Code (called from the ARM reset exception vector) 9 * 10 * do important init only if we don't start from memory! 11 * relocate armboot to ram 12 * setup stack 13 * jump to second stage 14 * 15 ************************************************************************* 16 */ 17 18 .globl reset 19 20 reset: 21 /* 22 * set the cpu to SVC32 mode 23 * 将 CPU 设置为管理员(SVC)模式 24 */ 25 mrs r0, cpsr /** 将状态寄存器的内容传送至通用寄存器,将 CPSR 中的内容传送至 R0 */ 26 bic r0, r0, #0x1f /** 位清除指令 将 R0 最低 5 位清零,其余位不变 工作模式位清零 */ 27 orr r0, r0, #0xd3 /** 工作模式位设置为“10011”(管理模式),并将中断禁止位和快中断禁止位置1 28 "1101 0011" 指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中 */ 29 msr cpsr, r0 /** 将通用寄存器的内容传送至状态寄存器, 将中的内容 R0 传送至CPSR */ 30 31 #if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) 32 /* 33 * relocate exception table 34 */ 35 ldr r0, =_start 36 ldr r1, =0x0 37 mov r2, #16 38 copyex: 39 subs r2, r2, #1 40 ldr r3, [r0], #4 41 str r3, [r1], #4 42 bne copyex 43 #endif 44 45 #ifdef CONFIG_S3C24X0 46 47 /** 寄存器设置 */ 48 #if defined(CONFIG_S3C2400) 49 #define pWTCON 0x15300000 50 #define INTMSK 0x14400008 /* Interrupt-Controller base addresses */ 51 #define CLKDIVN 0x14800014 /* clock divisor register */ 52 #else 53 #define pWTCON 0x53000000 /** 看门狗定时器控制寄存器 */ 54 #define INTMSK 0x4A000008 /** 中断屏蔽寄存器, bit 写 1 为屏蔽, 0 为开中断 */ 55 #define INTSUBMSK 0x4A00001C /** 中断次级屏蔽寄存器, 与 INTMSK 一样 */ 56 #define CLKDIVN 0x4C000014 /** 时钟分频控制寄存器 */ 57 #endif 58 59 /** 关闭看门狗 */ 60 ldr r0, =pWTCON 61 mov r1, #0x0 62 str r1, [r0] 63 64 /** 屏蔽所有中断 */ 65 mov r1, #0xffffffff 66 ldr r0, =INTMSK 67 str r1, [r0] 68 # if defined(CONFIG_S3C2410) 69 ldr r1, =0x3ff 70 ldr r0, =INTSUBMSK 71 str r1, [r0] 72 # endif 73 74 /** 时钟分频设置,FCLK 是CPU 的时钟, HCLK 是 AHB 总线外设的时钟, PCLK 是 APB 总线外设的时钟 75 默认的 FCLK 是 120M, FCLK:HCLK:PCLK = 1:2:4 */ 76 ldr r0, =CLKDIVN 77 mov r1, #3 78 str r1, [r0] 79 #endif /* CONFIG_S3C24X0 */ 80 81 /* 82 * we do sys-critical inits only at reboot, 83 * not when booting from ram! 84 */ 85 #ifndef CONFIG_SKIP_LOWLEVEL_INIT 86 /* CPU 关键初始化 */ 87 bl cpu_init_crit 88 #endif 89 90 bl _main 91 92 /*------------------------------------------------------------------------------*/ 93 94 .globl c_runtime_cpu_setup 95 c_runtime_cpu_setup: 96 97 mov pc, lr 98 99 /* 100 ************************************************************************* 101 * 102 * CPU_init_critical registers 103 * 104 * setup important registers 105 * setup memory timing 106 * 107 ************************************************************************* 108 */ 109 110 111 #ifndef CONFIG_SKIP_LOWLEVEL_INIT 112 cpu_init_crit: 113 114 /** flush v4 I/D caches, 刷新L1 cache的icache和dcache */ 115 mov r0, #0 /** 置零r0通用寄存器 */ 116 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache, 向c7写入0将使ICache与DCache无效 "0"表示省略opcode_2 MCR{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>} */ 117 mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB, MCR{条件} 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2 */ 118 119 /** disable MMU stuff and caches, 关闭 MMU 及其 caches */ 120 mrc p15, 0, r0, c1, c0, 0 121 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS) 122 bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM) 123 orr r0, r0, #0x00000002 @ set bit 1 (A) Align 124 orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache 125 mcr p15, 0, r0, c1, c0, 0 126 127 #ifndef CONFIG_SKIP_LOWLEVEL_INIT_ONLY 128 /* 129 * before relocating, we have to setup RAM timing 130 * because memory timing is board-dependend, you will 131 * find a lowlevel_init.S in your board directory. 132 */ 133 mov ip, lr /** 保存当前程序地址到 ip 寄存器 */ 134 135 bl lowlevel_init /** 执行 SDRAM 初始化 */ 136 mov lr, ip 137 #endif 138 mov pc, lr /** return */ 139 #endif /* CONFIG_SKIP_LOWLEVEL_INIT */
7.1.3 内存控制器初始化
lowlevel_init.S (board\samsung\jz2440)
主要是为了初始化 SDRAM
1 #include <config.h> 2 #include <version.h> 3 4 5 /* some parameters for the board */ 6 7 /* 8 * 9 * Taken from linux/arch/arm/boot/compressed/head-s3c2410.S 10 * 11 * Copyright (C) 2002 Samsung Electronics SW.LEE <hitchcar@sec.samsung.com> 12 * 13 */ 14 15 /** =============== BWSCON: 地址 0x48000000 总线宽度和等待控制寄存器 ================ */ 16 #define BWSCON 0x48000000 17 18 /* DW:数据总线宽度数据定义 */ 19 #define DW8 (0x0) /** 8 位数据总线宽度 */ 20 #define DW16 (0x1) /** 16 位数据总线宽度 */ 21 #define DW32 (0x2) /** 32 位数据总线宽度 */ 22 23 /* WS: wait 状态 */ 24 #define WAIT (0x1<<2) /** 开启 BANK 的 WAIT 功能 */ 25 26 /* ST: 是否使用 使用 UB/LB */ 27 #define UBLB (0x1<<3) /** BANK 使用 UB/LB */ 28 29 #define B1_BWSCON (DW32) /** BANK1 的总线位宽设置 32 位 */ 30 #define B2_BWSCON (DW16) /** BANK2 的总线位宽设置 16 位 */ 31 #define B3_BWSCON (DW16 + WAIT + UBLB) /** BANK3 的总线位宽设置 16 位,使能 WAIT 和 UB/LB */ 32 #define B4_BWSCON (DW16) /** BANK4 的总线位宽设置 16 位 */ 33 #define B5_BWSCON (DW16) /** BANK5 的总线位宽设置 16 位 */ 34 #define B6_BWSCON (DW32) /** BANK6 的总线位宽设置 32 位 */ 35 #define B7_BWSCON (DW32) /** BANK7 的总线位宽设置 32 位 */ 36 37 /** =================================== end BWSCON =============================== */ 38 39 /** =============== BANK0CON: 地址 0x48000004 BANK0 控制寄存器 ===================== */ 40 #define B0_Tacs 0x0 /* 0clk */ 41 #define B0_Tcos 0x0 /* 0clk */ 42 #define B0_Tacc 0x7 /* 14clk */ 43 #define B0_Tcoh 0x0 /* 0clk */ 44 #define B0_Tah 0x0 /* 0clk */ 45 #define B0_Tacp 0x0 46 #define B0_PMC 0x0 /* normal */ 47 /** =================================== end BANK0CON =============================== */ 48 49 /** =============== BANK1CON: 地址 0x48000008 BANK1 控制寄存器 ===================== */ 50 #define B1_Tacs 0x0 /* 0clk */ 51 #define B1_Tcos 0x0 /* 0clk */ 52 #define B1_Tacc 0x7 /* 14clk */ 53 #define B1_Tcoh 0x0 /* 0clk */ 54 #define B1_Tah 0x0 /* 0clk */ 55 #define B1_Tacp 0x0 56 #define B1_PMC 0x0 57 /** =================================== end BANK1CON =============================== */ 58 59 /** =============== BANK2CON: 地址 0x4800000C BANK2 控制寄存器 ===================== */ 60 #define B2_Tacs 0x0 61 #define B2_Tcos 0x0 62 #define B2_Tacc 0x7 63 #define B2_Tcoh 0x0 64 #define B2_Tah 0x0 65 #define B2_Tacp 0x0 66 #define B2_PMC 0x0 67 /** =================================== end BANK2CON =============================== */ 68 69 /** =============== BANK3CON: 地址 0x48000010 BANK3 控制寄存器 ===================== */ 70 #define B3_Tacs 0x0 /* 0clk */ 71 #define B3_Tcos 0x3 /* 4clk */ 72 #define B3_Tacc 0x7 /* 14clk */ 73 #define B3_Tcoh 0x1 /* 1clk */ 74 #define B3_Tah 0x0 /* 0clk */ 75 #define B3_Tacp 0x3 /* 6clk */ 76 #define B3_PMC 0x0 /* normal */ 77 /** =================================== end BANK3CON =============================== */ 78 79 /** =============== BANK4CON: 地址 0x48000014 BANK4 控制寄存器 ===================== */ 80 #define B4_Tacs 0x0 /* 0clk */ 81 #define B4_Tcos 0x0 /* 0clk */ 82 #define B4_Tacc 0x7 /* 14clk */ 83 #define B4_Tcoh 0x0 /* 0clk */ 84 #define B4_Tah 0x0 /* 0clk */ 85 #define B4_Tacp 0x0 86 #define B4_PMC 0x0 /* normal */ 87 /** =================================== end BANK4CON =============================== */ 88 89 /** =============== BANK5CON: 地址 0x48000018 BANK5 控制寄存器 ===================== */ 90 #define B5_Tacs 0x0 /* 0clk */ 91 #define B5_Tcos 0x0 /* 0clk */ 92 #define B5_Tacc 0x7 /* 14clk */ 93 #define B5_Tcoh 0x0 /* 0clk */ 94 #define B5_Tah 0x0 /* 0clk */ 95 #define B5_Tacp 0x0 96 #define B5_PMC 0x0 /* normal */ 97 /** =================================== end BANK5CON =============================== */ 98 99 /** =============== BANK6CON: 地址 0x4800001C BANK6 控制寄存器 ===================== */ 100 #define B6_MT 0x3 /* 配置BANK6的存器类型为 SDRAM */ 101 #define B6_Trcd 0x1 102 #define B6_SCAN 0x1 /* 9bit */ 103 /** =================================== end BANK6CON =============================== */ 104 105 /** =============== BANK7CON: 地址 0x48000020 BANK7 控制寄存器 ===================== */ 106 #define B7_MT 0x3 /* SDRAM */ 107 #define B7_Trcd 0x1 /* RAS 到 CAS 的延迟为 3 个时钟 */ 108 #define B7_SCAN 0x1 /* 列地址数为 9bit */ 109 /** =================================== end BANK7CON =============================== */ 110 111 /** =============== REFRESH: 地址 0x48000024 BANK7 SDRAM 刷新控制寄存器 ===================== */ 112 #define REFEN 0x1 /* SDRAM 刷新使能 */ 113 #define TREFMD 0x0 /* SDRAM 刷新模式为 CBR/自动刷新*/ 114 #define Trp 0x0 /* SDRAM RAS 预充电时间 2 个时钟 */ 115 #define Trc 0x3 /* SDRAM 半行周期时间 7 个时钟 */ 116 #define Tchr 0x2 /* 3clk */ 117 #define REFCNT 1113 /* SDRAM 刷新计数值, period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */ 118 /** ======================================== end REFRESH ================================== */ 119 120 .globl lowlevel_init 121 lowlevel_init: 122 /* memory control configuration */ 123 /* make r0 relative the current location so that it */ 124 /* reads SMRDATA out of FLASH rather than memory ! */ 125 ldr r0, =SMRDATA /** 执行 SMRDATA 函数,对各个寄存器进行配置 */ 126 ldr r1, =CONFIG_SYS_TEXT_BASE /** CONFIG_SYS_TEXT_BASE 为 0 */ 127 sub r0, r0, r1 128 ldr r1, =BWSCON /* Bus Width Status Controller */ 129 add r2, r0, #13*4 /* 将SMRDATA这一块地址赋值给r2中 */ 130 0: /** 循环操作 */ 131 ldr r3, [r0], #4 132 str r3, [r1], #4 133 cmp r2, r0 134 bne 0b 135 136 /* everything is fine now */ 137 mov pc, lr 138 139 .ltorg 140 /* the literal pools origin */ 141 142 SMRDATA: 143 .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28)) 144 .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) 145 .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) 146 .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) 147 .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) 148 .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) 149 .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) 150 .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) 151 .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) 152 .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) 153 .word 0x32 154 .word 0x30 155 .word 0x30