| target/linux/xburst/image/u-boot/patches/0001-add-xburst-platform-files.patch |
| 7206 | 7206 | index 0000000..6c3788f |
| 7207 | 7207 | --- /dev/null |
| 7208 | 7208 | +++ b/cpu/mips/usb_boot.S |
| 7209 | | @@ -0,0 +1,821 @@ |
| 7209 | @@ -0,0 +1,880 @@ |
| 7210 | 7210 | +/* |
| 7211 | 7211 | + * for jz4740 usb boot |
| 7212 | 7212 | + * |
| ... | ... | |
| 7240 | 7240 | +// So init caches first and then dispatch to a proper boot routine. |
| 7241 | 7241 | +//---------------------------------------------------------------------- |
| 7242 | 7242 | + |
| 7243 | +.macro load_addr reg addr |
| 7244 | + li \reg, 0x80000000 |
| 7245 | + addiu \reg, \reg, \addr |
| 7246 | + la $2, usbboot_begin |
| 7247 | + subu \reg, \reg, $2 |
| 7248 | +.endm |
| 7249 | + |
| 7250 | +usb_boot: |
| 7251 | + //-------------------------------------------------------------- |
| 7252 | + // Initialize PLL: set ICLK to 84MHz and HCLK to 42MHz. |
| 7253 | + //-------------------------------------------------------------- |
| 7254 | + la $9, 0xB0000000 // CPCCR: Clock Control Register |
| 7255 | + la $8, 0x42041110 // I:S:M:P=1:2:2:2 |
| 7256 | + sw $8, 0($9) |
| 7257 | + |
| 7258 | + la $9, 0xB0000010 // CPPCR: PLL Control Register |
| 7259 | + la $8, 0x06000120 // M=12 N=0 D=0 CLK=12*(M+2)/(N+2) |
| 7260 | + sw $8, 0($9) |
| 7261 | + |
| 7262 | + mtc0 $0, $26 // CP0_ERRCTL, restore WST reset state |
| 7263 | + nop |
| 7264 | + |
| 7265 | + mtc0 $0, $16 // CP0_CONFIG |
| 7266 | + nop |
| 7267 | + |
| 7268 | + // Relocate code to beginning of the ram |
| 7269 | + |
| 7270 | + la $2, usbboot_begin |
| 7271 | + la $3, usbboot_end |
| 7272 | + li $4, 0x80000000 |
| 7273 | + |
| 7274 | +1: |
| 7275 | + lw $5, 0($2) |
| 7276 | + sw $5, 0($4) |
| 7277 | + addiu $2, $2, 4 |
| 7278 | + bne $2, $3, 1b |
| 7279 | + addiu $4, $4, 4 |
| 7280 | + |
| 7281 | + li $2, 0x80000000 |
| 7282 | + ori $3, $2, 0 |
| 7283 | + addiu $3, $3, usbboot_end |
| 7284 | + la $4, usbboot_begin |
| 7285 | + subu $3, $3, $4 |
| 7286 | + |
| 7287 | + |
| 7288 | +2: |
| 7289 | + cache 0x0, 0($2) // Index_Invalidate_I |
| 7290 | + cache 0x1, 0($2) // Index_Writeback_Inv_D |
| 7291 | + addiu $2, $2, 32 |
| 7292 | + subu $4, $3, $2 |
| 7293 | + bgtz $4, 2b |
| 7294 | + nop |
| 7295 | + |
| 7296 | + load_addr $3, usb_boot_return |
| 7297 | + |
| 7298 | + jr $3 |
| 7299 | + |
| 7300 | +usbboot_begin: |
| 7301 | + |
| 7243 | 7302 | +init_caches: |
| 7244 | 7303 | + li $2, 3 // cacheable for kseg0 access |
| 7245 | 7304 | + mtc0 $2, $16 // CP0_CONFIG |
| ... | ... | |
| 7282 | 7341 | + // $20: jump target address |
| 7283 | 7342 | + //-------------------------------------------------------------- |
| 7284 | 7343 | +xfer_d2i: |
| 7285 | | + ori $2, $28, 0 // start address |
| 7286 | | + add $3, $2, $19 // end addres |
| 7287 | | + addiu $3, $3, -4 |
| 7288 | 7344 | + |
| 7289 | | +xfer_a_word: |
| 7290 | | + lw $4, 0($2) |
| 7291 | | + mtc0 $4, $28, 1 // CP0_DATALO |
| 7292 | | + cache 0xc, 0($2) // Index_Store_Data_I |
| 7293 | | + bne $2, $3, xfer_a_word |
| 7294 | | + addiu $2, $2, 4 |
| 7345 | + ori $8, $20, 0 |
| 7346 | + addu $9, $8, $19 // total 16KB |
| 7295 | 7347 | + |
| 7296 | | + mtc0 $0, $26 // CP0_ERRCTL, restore WST reset state |
| 7348 | +1: |
| 7349 | + cache 0x0, 0($8) // Index_Invalidate_I |
| 7350 | + cache 0x1, 0($8) // Index_Writeback_Inv_D |
| 7351 | + bne $8, $9, 1b |
| 7352 | + addiu $8, $8, 32 |
| 7297 | 7353 | + |
| 7298 | | + jalr $20 // jump, and place the return address in $31 |
| 7354 | + // flush write-buffer |
| 7355 | + sync |
| 7356 | + |
| 7357 | + // Invalidate BTB |
| 7358 | + mfc0 $8, $16, 7 // CP0_CONFIG |
| 7359 | + nop |
| 7360 | + ori $8, 2 |
| 7361 | + mtc0 $8, $16, 7 |
| 7362 | + nop |
| 7363 | + |
| 7364 | + // Overwrite config to disable ram initalisation |
| 7365 | + li $2, 0xff |
| 7366 | + sb $2, 20($20) |
| 7367 | + |
| 7368 | + jalr $20 |
| 7299 | 7369 | + nop |
| 7300 | 7370 | + |
| 7301 | 7371 | +icache_return: |
| ... | ... | |
| 7307 | 7377 | + nop |
| 7308 | 7378 | + |
| 7309 | 7379 | + |
| 7310 | | +usb_boot: |
| 7311 | | + //-------------------------------------------------------------- |
| 7312 | | + // Initialize PLL: set ICLK to 84MHz and HCLK to 42MHz. |
| 7313 | | + //-------------------------------------------------------------- |
| 7314 | | + la $9, 0xB0000000 // CPCCR: Clock Control Register |
| 7315 | | + la $8, 0x42041110 // I:S:M:P=1:2:2:2 |
| 7316 | | + sw $8, 0($9) |
| 7317 | | + |
| 7318 | | + la $9, 0xB0000010 // CPPCR: PLL Control Register |
| 7319 | | + la $8, 0x06000120 // M=12 N=0 D=0 CLK=12*(M+2)/(N+2) |
| 7320 | | + sw $8, 0($9) |
| 7321 | | + |
| 7322 | 7380 | +usb_boot_return: |
| 7323 | 7381 | + //-------------------------------------------------------------- |
| 7324 | 7382 | + // Enable the USB PHY |
| ... | ... | |
| 7385 | 7443 | + |
| 7386 | 7444 | + //-------------------------------------------------------------- |
| 7387 | 7445 | + // 2. Check and handle EP0 interrupt |
| 7388 | | + //-------------------------------------------------------------- |
| 7446 | + //-------------------------------------------------------------- |
| 7389 | 7447 | +check_intr_ep0in: |
| 7390 | 7448 | + lhu $10, 0x02($27) // read INTRIN |
| 7391 | 7449 | + andi $9, $10, 0x1 // check EP0 interrupt |
| ... | ... | |
| 7460 | 7518 | + nop |
| 7461 | 7519 | + |
| 7462 | 7520 | +__ep0_get_cpu_info: |
| 7463 | | + la $20, cpu_info_data // data pointer to transfer |
| 7521 | + load_addr $20, cpu_info_data // data pointer to transfer |
| 7464 | 7522 | + li $21, 8 // bytes left to transfer |
| 7465 | 7523 | + li $22, 1 // set EP0 to TX state |
| 7466 | 7524 | + li $23, 0 // NoData = 0 |
| ... | ... | |
| 7524 | 7582 | + or $20, $9, $8 // target address |
| 7525 | 7583 | + |
| 7526 | 7584 | + b xfer_d2i |
| 7527 | | + li $19, 0x4000 // 16KB data length |
| 7585 | + li $19, 0x2000 // 16KB data length |
| 7528 | 7586 | + |
| 7529 | 7587 | +__ep0_prog_start2: |
| 7530 | 7588 | + li $9, 0x48 // SVDOUTPKTRDY and DATAEND |
| ... | ... | |
| 7600 | 7658 | + nop |
| 7601 | 7659 | + |
| 7602 | 7660 | +___ep0_get_dev_desc: |
| 7603 | | + la $20, device_desc // data pointer |
| 7661 | + load_addr $20, device_desc // data pointer |
| 7604 | 7662 | + li $22, 1 // set EP0 to TX state |
| 7605 | 7663 | + sub $8, $21, 18 |
| 7606 | 7664 | + blez $8, _ep0_idle_state_fini // wLength <= 18 |
| ... | ... | |
| 7610 | 7668 | + nop |
| 7611 | 7669 | + |
| 7612 | 7670 | +___ep0_get_dev_qualifier: |
| 7613 | | + la $20, dev_qualifier // data pointer |
| 7671 | + load_addr $20, dev_qualifier // data pointer |
| 7614 | 7672 | + li $22, 1 // set EP0 to TX state |
| 7615 | 7673 | + sub $8, $21, 10 |
| 7616 | 7674 | + blez $8, _ep0_idle_state_fini // wLength <= 10 |
| ... | ... | |
| 7620 | 7678 | + nop |
| 7621 | 7679 | + |
| 7622 | 7680 | +___ep0_get_conf_desc: |
| 7623 | | + la $20, config_desc_fs // data pointer of FS mode |
| 7681 | + load_addr $20, config_desc_fs // data pointer of FS mode |
| 7624 | 7682 | + lbu $8, 0x01($27) // read POWER |
| 7625 | 7683 | + andi $8, 0x10 // test HS_MODE |
| 7626 | 7684 | + beqz $8, ___ep0_get_conf_desc2 |
| 7627 | 7685 | + nop |
| 7628 | | + la $20, config_desc_hs // data pointer of HS mode |
| 7686 | + load_addr $20, config_desc_hs // data pointer of HS mode |
| 7629 | 7687 | + |
| 7630 | 7688 | +___ep0_get_conf_desc2: |
| 7631 | 7689 | + li $22, 1 // set EP0 to TX state |
| ... | ... | |
| 7649 | 7707 | + nop |
| 7650 | 7708 | + |
| 7651 | 7709 | +___ep0_get_string_lang_ids: |
| 7652 | | + la $20, string_lang_ids // data pointer |
| 7710 | + load_addr $20, string_lang_ids // data pointer |
| 7653 | 7711 | + b _ep0_idle_state_fini |
| 7654 | 7712 | + li $21, 4 // data length |
| 7655 | 7713 | + |
| 7656 | 7714 | +___ep0_get_string_manufacture: |
| 7657 | | + la $20, string_manufacture // data pointer |
| 7715 | + load_addr $20, string_manufacture // data pointer |
| 7658 | 7716 | + b _ep0_idle_state_fini |
| 7659 | 7717 | + li $21, 16 // data length |
| 7660 | 7718 | + |
| 7661 | 7719 | +___ep0_get_string_product: |
| 7662 | | + la $20, string_product // data pointer |
| 7720 | + load_addr $20, string_product // data pointer |
| 7663 | 7721 | + b _ep0_idle_state_fini |
| 7664 | 7722 | + li $21, 46 // data length |
| 7665 | 7723 | + |
| ... | ... | |
| 7675 | 7733 | + |
| 7676 | 7734 | + //-------------------------------------------------------------- |
| 7677 | 7735 | + // 2.2 Handle EP0 TX state interrupt |
| 7678 | | + //-------------------------------------------------------------- |
| 7679 | | +ep0_tx_state: |
| 7736 | + //-------------------------------------------------------------- |
| 7737 | +ep0_tx_state: |
| 7680 | 7738 | + sub $9, $22, 1 |
| 7681 | 7739 | + bnez $9, check_intr_ep1in |
| 7682 | 7740 | + nop |
| ... | ... | |
| 8026 | 8084 | + .byte 0x30 |
| 8027 | 8085 | + .byte 0x56 |
| 8028 | 8086 | + .byte 0x31 |
| 8087 | +usbboot_end: |
| 8029 | 8088 | + |
| 8030 | 8089 | + .set reorder |
| 8031 | 8090 | diff --git a/include/asm-mips/jz4740.h b/include/asm-mips/jz4740.h |