⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asm_init.s

📁 gumstiz u-boot loader in linux
💻 S
📖 第 1 页 / 共 3 页
字号:
    addi    r5, r0, 0x00    bl      .sio_bw    addi    r4, r0, SIO_PCSCI   /* select PCSCIR */    addi    r5, r0, 0x01    bl      .sio_bw    addi    r4, r0, SIO_PCSCD   /* select PCSCDR */    addi    r5, r0, 0x76    bl      .sio_bw    addi    r4, r0, SIO_PCSCI   /* select PCSCIR */    addi    r5, r0, 0x02    bl      .sio_bw    addi    r4, r0, SIO_PCSCD   /* select PCSCDR */    addi    r5, r0, 0x40    bl      .sio_bw/* * CS1 */    addi    r4, r0, SIO_PCSCI   /* select PCSCIR */    addi    r5, r0, 0x05    bl      .sio_bw    addi    r4, r0, SIO_PCSCD   /* select PCSCDR */    addi    r5, r0, 0x00    bl      .sio_bw    addi    r4, r0, SIO_PCSCI   /* select PCSCIR */    addi    r5, r0, 0x05    bl      .sio_bw    addi    r4, r0, SIO_PCSCD   /* select PCSCDR */    addi    r5, r0, 0x70    bl      .sio_bw    addi    r4, r0, SIO_PCSCI   /* select PCSCIR */    addi    r5, r0, 0x06    bl      .sio_bw    addi    r4, r0, SIO_PCSCD   /* select PCSCDR */    addi    r5, r0, 0x1C    bl      .sio_bw/* * CS2 */    addi    r4, r0, SIO_PCSCI   /* select PCSCIR */    addi    r5, r0, 0x08    bl      .sio_bw    addi    r4, r0, SIO_PCSCD   /* select PCSCDR */    addi    r5, r0, 0x00    bl      .sio_bw    addi    r4, r0, SIO_PCSCI   /* select PCSCIR */    addi    r5, r0, 0x09    bl      .sio_bw    addi    r4, r0, SIO_PCSCD   /* select PCSCDR */    addi    r5, r0, 0x71    bl      .sio_bw    addi    r4, r0, SIO_PCSCI   /* select PCSCIR */    addi    r5, r0, 0x0A    bl      .sio_bw    addi    r4, r0, SIO_PCSCD   /* select PCSCDR */    addi    r5, r0, 0x1C    bl      .sio_bw    mtspr   8, r7               /* restore link register */    bclr    20, 0               /* return to caller *//* * this function writes a register to the SIO chip */.sio_bw:    stb     r4, 0(r3)           /* write index register with register offset */    eieio    sync    stb     r5, 1(r3)           /* 1st write */    eieio    sync    stb     r5, 1(r3)           /* 2nd write */    eieio    sync    bclr    20, 0               /* return to caller *//* * this function reads a register from the SIO chip */.sio_br:    stb     r4, 0(r3)           /* write index register with register offset */    eieio    sync    lbz     r3, 1(r3)           /* retrieve specified reg offset contents */    eieio    sync    bclr    20, 0               /* return to caller *//* * Print a message to COM1 in polling mode * r10=COM1 port, r3=(char*)string */.globl PrintfPrintf:    lis     r10, CFG_ISA_IO@h   /* COM1 port */    ori     r10, r10, 0x03f8WaitChr:    lbz     r0, 5(r10)          /* read link status */    eieio    andi.   r0, r0, 0x40        /* mask transmitter empty bit */    beq     cr0, WaitChr        /* wait till empty */    lbzx    r0, r0, r3          /* get char */    stb     r0, 0(r10)          /* write to transmit reg */    eieio    addi    r3, r3, 1           /* next char */    lbzx    r0, r0, r3          /* get char */    cmpwi   cr1, r0, 0          /* end of string ? */    bne     cr1, WaitChr    blr/* * Print 8/4/2 digits hex value to COM1 in polling mode * r10=COM1 port, r3=val */OutHex2:    li      r9, 4               /* shift reg for 2 digits */    b       OHstartOutHex4:    li      r9, 12              /* shift reg for 4 digits */    b       OHstart    .globl OutHexOutHex:    li      r9, 28              /* shift reg for 8 digits */OHstart:    lis     r10, CFG_ISA_IO@h   /* COM1 port */    ori     r10, r10, 0x03f8OutDig:    lbz     r0, 5(r10)          /* read link status */    eieio    andi.   r0, r0, 0x40        /* mask transmitter empty bit */    beq     cr0, OutDig    sraw    r0, r3, r9    clrlwi  r0, r0, 28    cmpwi   cr1, r0, 9    ble     cr1, digIsNum    addic   r0, r0, 55    b       nextDigdigIsNum:    addic   r0, r0, 48nextDig:    stb     r0, 0(r10)          /* write to transmit reg */    eieio    addic.  r9, r9, -4    bge     OutDig    blr/* * Print 3 digits hdec value to COM1 in polling mode * r10=COM1 port, r3=val, r7=x00, r8=x0, r9=x, r0, r6=scratch */.globl OutDecOutDec:    li      r6, 10    divwu   r0, r3, r6          /* r0 = r3 / 10, r9 = r3 mod 10 */    mullw   r10, r0, r6    subf    r9, r10, r3    mr      r3, r0    divwu   r0, r3, r6          /* r0 = r3 / 10, r8 = r3 mod 10 */    mullw   r10, r0, r6    subf    r8, r10, r3    mr      r3, r0    divwu   r0, r3, r6          /* r0 = r3 / 10, r7 = r3 mod 10 */    mullw   r10, r0, r6    subf    r7, r10, r3    lis     r10, CFG_ISA_IO@h   /* COM1 port */    ori     r10, r10, 0x03f8    or.     r7, r7, r7    bne     noblank1    li      r3, 0x20    b       OutDec4noblank1:    addi    r3, r7, 48          /* convert to ASCII */OutDec4:    lbz     r0, 0(r13)          /* slow down dummy read */    lbz     r0, 5(r10)          /* read link status */    eieio    andi.   r0, r0, 0x40        /* mask transmitter empty bit */    beq     cr0, OutDec4    stb     r3, 0(r10)          /* x00 to transmit */    eieio    or.     r7, r7, r8    beq     OutDec5    addi    r3, r8, 48          /* convert to ASCII */OutDec5:    lbz     r0, 0(r13)          /* slow down dummy read */    lbz     r0, 5(r10)          /* read link status */    eieio    andi.   r0, r0, 0x40        /* mask transmitter empty bit */    beq     cr0, OutDec5    stb     r3, 0(r10)          /* x0  to transmit */    eieio    addi    r3, r9, 48          /* convert to ASCII */OutDec6:    lbz     r0, 0(r13)          /* slow down dummy read */    lbz     r0, 5(r10)          /* read link status */    eieio    andi.   r0, r0, 0x40        /* mask transmitter empty bit */    beq     cr0, OutDec6    stb     r3, 0(r10)          /* x   to transmit */    eieio    blr/* * Print a char to COM1 in polling mode * r10=COM1 port, r3=char */.globl    OutChrOutChr:    lis     r10, CFG_ISA_IO@h   /* COM1 port */    ori     r10, r10, 0x03f8OutChr1:    lbz     r0, 5(r10)          /* read link status */    eieio    andi.   r0, r0, 0x40        /* mask transmitter empty bit */    beq     cr0, OutChr1        /* wait till empty */    stb     r3, 0(r10)          /* write to transmit reg */    eieio    blr/* * Input:  r3 adr to read * Output: r3 val or -1 for error */spdRead:    mfspr   r26, 8              /* save link register */    lis     r30, CFG_ISA_IO@h    ori     r30, r30, 0x220     /* GPIO Port 1 */    li      r7, 0x00    li      r8, 0x100    and.    r5, r3, r8    beq     spdbank0    li      r12, 0x08    li      r4, 0x10    li      r6, 0x18    b       spdRead1spdbank0:    li      r12, 0x20           /* set I2C data */    li      r4, 0x40            /* set I2C clock */    li      r6, 0x60            /* set I2C clock and data */spdRead1:    li      r8, 0x80    bl      spdStart            /* access I2C bus as master */    li      r10, 0xa0           /* write to SPD */    bl      spdWriteByte    bl      spdReadAck          /* ACK returns in r10 */    cmpw    cr0, r10, r7    bne     AckErr              /* r10 must be 0, if ACK received */    mr      r10, r3             /* adr to read */    bl      spdWriteByte    bl      spdReadAck    cmpw    cr0, r10, r7    bne     AckErr    bl      spdStart    li      r10, 0xa1           /* read from SPD */    bl      spdWriteByte    bl      spdReadAck    cmpw    cr0, r10, r7    bne     AckErr    bl      spdReadByte         /* return val in r10 */    bl      spdWriteAck    bl      spdStop             /* release I2C bus */    mr      r3, r10    mtspr   8, r26              /* restore link register */    blr/* * ACK error occurred */AckErr:    bl      spdStop    orc     r3, r0, r0          /* return -1 */    mtspr   8, r26              /* restore link register */    blr/* * Routines to read from RAM spd. * r30 - GPIO Port1 address in all cases. * r4 - clock mask for SPD * r6 - port mask for SPD * r12 - data mask for SPD */waitSpd:    li      r0, 0x1000    mtctr   r0wSpd:    bdnz    wSpd    bclr    20, 0               /* return to caller *//* * establish START condition on I2C bus */spdStart:    mfspr   r27, 8              /* save link register */    stb     r6, 0(r30)          /* set SDA and SCL */    eieio    stb     r6, 1(r30)          /* switch GPIO to output */    eieio    bl      waitSpd    stb     r4, 0(r30)          /* reset SDA */    eieio    bl      waitSpd    stb     r7, 0(r30)          /* reset SCL */    eieio    bl      waitSpd    mtspr   8, r27    bclr    20, 0               /* return to caller *//* * establish STOP condition on I2C bus */spdStop:    mfspr   r27, 8              /* save link register */    stb     r7, 0(r30)          /* reset SCL and SDA */    eieio    stb     r6, 1(r30)          /* switch GPIO to output */    eieio    bl      waitSpd    stb     r4, 0(r30)          /* set SCL */    eieio    bl      waitSpd    stb     r6, 0(r30)          /* set SDA and SCL */    eieio    bl      waitSpd    stb     r7, 1(r30)          /* switch GPIO to input */    eieio    mtspr   8, r27    bclr    20, 0               /* return to caller */spdReadByte:    mfspr   r27, 8    stb     r4, 1(r30)          /* set GPIO for SCL output */    eieio    li      r9, 0x08    li      r10, 0x00loopRB:    stb     r7, 0(r30)          /* reset SDA and SCL */    eieio    bl      waitSpd    stb     r4, 0(r30)          /* set SCL */    eieio    bl      waitSpd    lbz     r5, 0(r30)          /* read from GPIO Port1 */    rlwinm  r10, r10, 1, 0, 31    and.    r5, r5, r12    beq     clearBit    ori     r10, r10, 0x01      /* append _1_ */clearBit:    stb     r7, 0(r30)          /* reset SCL */    eieio    bl      waitSpd    addic.  r9, r9, -1    bne     loopRB    mtspr   8, r27    bclr    20, 0               /* return (r10) to caller *//* * spdWriteByte writes bits 24 - 31 of r10 to I2C. * r8 contains bit mask 0x80 */spdWriteByte:    mfspr   r27, 8              /* save link register */    li      r9, 0x08            /* write octet */    and.    r5, r10, r8    bne     sWB1    stb     r7, 0(r30)          /* set SDA to _0_ */    eieio    b       sWB2sWB1:    stb     r12, 0(r30)         /* set SDA to _1_ */    eieiosWB2:    stb     r6, 1(r30)          /* set GPIO to output */    eieioloopWB:    and.    r5, r10, r8    bne     sWB3    stb     r7, 0(r30)          /* set SDA to _0_ */    eieio    b       sWB4sWB3:    stb     r12, 0(r30)         /* set SDA to _1_ */    eieiosWB4:    bl      waitSpd    and.    r5, r10, r8    bne     sWB5    stb     r4, 0(r30)          /* set SDA to _0_ and SCL */    eieio    b       sWB6sWB5:    stb     r6, 0(r30)          /* set SDA to _1_ and SCL */    eieiosWB6:    bl      waitSpd    and.    r5, r10, r8    bne     sWB7    stb     r7, 0(r30)          /* set SDA to _0_ and reset SCL */    eieio    b       sWB8sWB7:    stb     r12, 0(r30)         /* set SDA to _1_ and reset SCL */    eieiosWB8:    bl      waitSpd    rlwinm  r10, r10, 1, 0, 31  /* next bit */    addic.  r9, r9, -1    bne     loopWB    mtspr   8, r27    bclr    20, 0               /* return to caller *//* * Read ACK from SPD, return value in r10 */spdReadAck:    mfspr   r27, 8              /* save link register */    stb     r4, 1(r30)          /* set GPIO to output */    eieio    stb     r7, 0(r30)          /* reset SDA and SCL */    eieio    bl      waitSpd    stb     r4, 0(r30)          /* set SCL */    eieio    bl      waitSpd    lbz     r10, 0(r30)         /* read GPIO Port 1 and mask SDA */    and     r10, r10, r12    bl      waitSpd    stb     r7, 0(r30)          /* reset SDA and SCL */    eieio    bl      waitSpd    mtspr   8, r27    bclr    20, 0               /* return (r10) to caller */spdWriteAck:    mfspr   r27, 8    stb     r12, 0(r30)         /* set SCL */    eieio    stb     r6, 1(r30)          /* set GPIO to output */    eieio    bl      waitSpd    stb     r6, 0(r30)          /* SDA and SCL */    eieio    bl      waitSpd    stb     r12, 0(r30)         /* reset SCL */    eieio    bl      waitSpd    mtspr   8, r27    bclr    20, 0               /* return to caller */get_lnk_reg:    mflr    r3                  /* return link reg */    blr/* * Messages for console output */.globl MessageBlockMessageBlock:Mok:    .ascii  "OK\015\012\000"Mfail:    .ascii  "FAILED\015\012\000"Mna:    .ascii  "NA\015\012\000"MinitLogo:    .ascii  "\015\012*** ELTEC Elektronik, Mainz ***\015\012"    .ascii  "\015\012Initialising RAM\015\012\000"Mspd01:    .ascii  "       Reading SPD of bank0/1 ..... \000"Mspd23:    .ascii  "       Reading SPD of bank2/3 ..... \000"MfpmRam:    .ascii  "       RAM-Type: FPM \015\012\000"MedoRam:    .ascii  "       RAM-Type: EDO \015\012\000"MsdRam:    .ascii  "       RAM-Type: SDRAM \015\012\000"Mactivate:    .ascii  "       Activating \000"Mmbyte:    .ascii  " MB .......... \000"    .align  4

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -