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

📄 cpuio.c

📁 《嵌入式固件开发》一书的源码
💻 C
字号:
/********************************************************************* * * Copyright: *  MOTOROLA, INC. All Rights Reserved.   *  You are hereby granted a copyright license to use, modify, and *  distribute the SOFTWARE so long as this entire notice is *  retained without alteration in any modified and/or redistributed *  versions, and that such modified versions are clearly identified *  as such. No licenses are granted by implication, estoppel or *  otherwise under any patents or trademarks of Motorola, Inc. This  *  software is provided on an "AS IS" basis and without warranty. * *  To the maximum extent permitted by applicable law, MOTOROLA  *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING  *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE  *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY  *  ACCOMPANYING WRITTEN MATERIALS. *  *  To the maximum extent permitted by applicable law, IN NO EVENT *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING  *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS  *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.    *  *  Motorola assumes no responsibility for the maintenance and support *  of this software ********************************************************************/#include "config.h"#include "cpuio.h"#include "ether.h"#include "genlib.h"#define M5272C3/********************************************************************/void    mcf5272_sim_init (MCF5272_IMM *);void    mcf5272_gpio_init (MCF5272_IMM *);void    mcf5272_cs_init (MCF5272_IMM *);void    mcf5272_uart_init(MCF5272_IMM *);/********************************************************************//* * Out of reset, the low-level assembly code calls this routine to * obtain the address at which to map the MBAR. */void *mcf5272_mbar (void){    return (void *)IMM_ADDRESS;}/********************************************************************//* * Out of reset, the low-level assembly code calls this routine to * obtain the address at which to map the RAMBAR. */void *mcf5272_rambar (void){    return (void *)INT_SRAM_ADDRESS;}/********************************************************************//* * Out of reset, the low-level assembly code calls this routine to * initialize the MCF5272 for this board. A temporary stack has been * setup in the internal SRAM, and the stack pointer will be changed * to point to SDRAM once this routine returns. */voidmcf5272_init (MCF5272_IMM *imm){    mcf5272_uart_init(imm);    mcf5272_sim_init(imm);    mcf5272_gpio_init(imm);    mcf5272_cs_init(imm);    /* Turn Instruction Cache ON    mcf5272_wr_cacr(0x81000500);     */}/****************************************************************/voidmcf5272_sim_init (MCF5272_IMM *imm){    /*******************************************************    *    * This routine executed upon reset to initialize    * MCF5272 SIM registers.  An initial stack must have been setup    * in the SRAM in order for this routine to work.    *    *******************************************************/    /*     * Initialize System Config Register     * Setup Watch Dog Timeout     */    MCF5272_WR_SIM_SCR(imm,MCF5272_SIM_SCR_HWWD_1024);    /*     * Initialize System Protection Register     * Enable all bus error exceptions     */    MCF5272_WR_SIM_SPR(imm,0        | MCF5272_SIM_SPR_ADC | MCF5272_SIM_SPR_ADCEN        | MCF5272_SIM_SPR_WPV | MCF5272_SIM_SPR_WPVEN        | MCF5272_SIM_SPR_SMV | MCF5272_SIM_SPR_SMVEN        | MCF5272_SIM_SPR_SBE | MCF5272_SIM_SPR_SBEEN        | MCF5272_SIM_SPR_HWT | MCF5272_SIM_SPR_HWTEN        | MCF5272_SIM_SPR_RPV | MCF5272_SIM_SPR_RPVEN        | MCF5272_SIM_SPR_EXT | MCF5272_SIM_SPR_EXTEN        | MCF5272_SIM_SPR_SUV | MCF5272_SIM_SPR_SUVEN        ) ;    /*      * Initilize Interrupt Control Registers     * Mask all interrupt sources     */    MCF5272_WR_SIM_ICR1(imm,0x88888888);    MCF5272_WR_SIM_ICR2(imm,0x88888888);    MCF5272_WR_SIM_ICR3(imm,0x88888888);    MCF5272_WR_SIM_ICR4(imm,0x88880000);    /*      * Initialize Programmable Interrupt Transition Register     * Make all external interrupts trigger on falling edge     */     MCF5272_WR_SIM_PITR(imm,MCF5272_SIM_PITR_NEG_EDGE);    /*     * Initialize Programmable Interrupt Vector Register     * Place peripheral interrupt vectors beginning at vector 64     */    MCF5272_WR_SIM_PIVR(imm,MCF5272_SIM_PIVR_NORMAL);}/********************************************************************/void mcf5272_gpio_init (MCF5272_IMM *imm){    /*     * Inititialize Port A     */    /* Enable USB signals */    MCF5272_WR_GPIO_PACNT(imm,0x00001555);    /* Configure all pins as inputs */    MCF5272_WR_GPIO_PADDR(imm,0);    /*     * Inititialize Port B     */    /* Enable USART1 and FEC signals*/    MCF5272_WR_GPIO_PBCNT(imm,0x55554155);    /* Configure all GPIO pins as inputs */    MCF5272_WR_GPIO_PADDR(imm,0);        /*     * Inititialize Port C     * Since we are in 32-bit mode, Port C is not available!     */    /*     * Inititialize Port D     * Configure all signals as high impedence     */    MCF5272_WR_GPIO_PDCNT(imm,0);}/********************************************************************/voidmcf5272_uart_init(MCF5272_IMM *imm){    register uint16 ubgs;    /* Initialize UART0 */        /* Reset Transmitter */    MCF5272_WR_UART0_UCR(imm,MCF5272_UART_UCR_RESET_TX);    /* Reset Receiver */    MCF5272_WR_UART0_UCR(imm,MCF5272_UART_UCR_RESET_RX);    /* Reset Mode Register */    MCF5272_WR_UART0_UCR(imm,MCF5272_UART_UCR_RESET_MR);    /* No parity, 8-bits per character */    MCF5272_WR_UART0_UMR(imm, 0        | MCF5272_UART_UMR1_PM_NONE        | MCF5272_UART_UMR1_BC_8 );    /* No echo or loopback, 1 stop bit */    MCF5272_WR_UART0_UMR(imm, 0        | MCF5272_UART_UMR2_CM_NORMAL        | MCF5272_UART_UMR2_STOP_BITS_1);    /* Set Rx and Tx baud by timer */    MCF5272_WR_UART0_UCSR(imm, 0        | MCF5272_UART_UCSR_RCS(0xD)        | MCF5272_UART_UCSR_TCS(0xD));    /* Mask all USART interrupts */    MCF5272_WR_UART0_UIMR(imm, 0);                     /* Calculate baud settings */    ubgs = (uint16)((SYSTEM_CLOCK*1000000)/(UART_BAUD * 32));    MCF5272_WR_UART0_UBG1(imm, (uint8)((ubgs & 0xFF00) >> 8));    MCF5272_WR_UART0_UBG2(imm, (uint8)(ubgs & 0x00FF));    /* Enable receiver and transmitter */    MCF5272_WR_UART0_UCR(imm, 0        | MCF5272_UART_UCR_TX_ENABLED        | MCF5272_UART_UCR_RX_ENABLED);    /* Disable UART1 */    MCF5272_WR_UART1_UCR(imm, 0        | MCF5272_UART_UCR_TX_DISABLED        | MCF5272_UART_UCR_RX_DISABLED);}/********************************************************************/voidmcf5272_cs_init (MCF5272_IMM *imm){    /* This routine initializes ChipSelects to setup memory devices */    /* ChipSelect 0 - 2MB FLASH */#if defined(M5272C3)    MCF5272_WR_CS_CSBR0(imm, 0        | MCF5272_CS_BR_BASE(FLASH_ADDRESS)        | MCF5272_CS_BR_SRAM        | MCF5272_CS_BR_PS_16        | MCF5272_CS_BR_EN);    #elif defined(HSEVB)    MCF5272_WR_CS_CSBR0(imm, 0        | MCF5272_CS_BR_BASE(FLASH_ADDRESS)        | MCF5272_CS_BR_SRAM_8          | MCF5272_CS_BR_EN);    #else#error "Must define BOARD variable"#endif    MCF5272_WR_CS_CSOR0(imm, 0        | MCF5272_CS_OR_MASK_2M        | MCF5272_CS_OR_WS(5));    /* Chip Select 2 - 512KB SRAM - see schematic */#if defined(M5272C3)    MCF5272_WR_CS_CSBR2(imm, 0        | MCF5272_CS_BR_BASE(EXT_SRAM_ADDRESS)        | MCF5272_CS_BR_SRAM        | MCF5272_CS_BR_PS_32        | MCF5272_CS_BR_EN);    MCF5272_WR_CS_CSOR2(imm, 0        | MCF5272_CS_OR_MASK_512K        | MCF5272_CS_OR_WS(0));#endif    /* ChipSelect 7 - 4MB SDRAM */    MCF5272_WR_CS_CSBR7(imm, 0        | MCF5272_CS_BR_BASE(SDRAM_ADDRESS)        | MCF5272_CS_BR_SDRAM         | MCF5272_CS_BR_PS_LINE         | MCF5272_CS_BR_EN);    MCF5272_WR_CS_CSOR7(imm, 0        | MCF5272_CS_OR_MASK_4M        | MCF5272_CS_OR_WS(0x1F));    /* Do not initialize SDRAM if already running in SDRAM */    if (!(MCF5272_RD_SDRAMC_SDCCR(imm) & MCF5272_SDRAMC_SDCCR_ACT))    {        switch (SYSTEM_CLOCK)        {            case 48:                MCF5272_WR_SDRAMC_SDCTR(imm, 0                    | MCF5272_SDRAMC_SDCTR_RTP_48MHz                    | MCF5272_SDRAMC_SDCTR_RC(1)                    | MCF5272_SDRAMC_SDCTR_RP(1)                    | MCF5272_SDRAMC_SDCTR_RCD(1)                    | MCF5272_SDRAMC_SDCTR_CLT_2                    );                break;            case 33:                MCF5272_WR_SDRAMC_SDCTR(imm, 0                    | MCF5272_SDRAMC_SDCTR_RTP_33MHz                    | MCF5272_SDRAMC_SDCTR_RC(1)                    | MCF5272_SDRAMC_SDCTR_RP(1)                    | MCF5272_SDRAMC_SDCTR_RCD(1)                    | MCF5272_SDRAMC_SDCTR_CLT_2                    );                break;            case 25:                MCF5272_WR_SDRAMC_SDCTR(imm, 0                    | MCF5272_SDRAMC_SDCTR_RTP_25MHz                    | MCF5272_SDRAMC_SDCTR_RC(1)                    | MCF5272_SDRAMC_SDCTR_RP(1)                    | MCF5272_SDRAMC_SDCTR_RCD(1)                    | MCF5272_SDRAMC_SDCTR_CLT_2                    );                break;            case 66:            default:                MCF5272_WR_SDRAMC_SDCTR(imm, 0                    | MCF5272_SDRAMC_SDCTR_RTP_66MHz                    | MCF5272_SDRAMC_SDCTR_RC(1)                    | MCF5272_SDRAMC_SDCTR_RP(3)                    | MCF5272_SDRAMC_SDCTR_RCD(2)                    | MCF5272_SDRAMC_SDCTR_CLT_2                    );                break;        }#if defined (M5272C3)        MCF5272_WR_SDRAMC_SDCCR(imm, 0            | MCF5272_SDRAMC_SDCCR_MCAS_A9            | MCF5272_SDRAMC_SDCCR_BALOC_A21            | MCF5272_SDRAMC_SDCCR_REG            | MCF5272_SDRAMC_SDCCR_INIT            );#elif defined(HSEVB)        MCF5272_WR_SDRAMC_SDCCR(imm, 0            | MCF5272_SDRAMC_SDCCR_MCAS_A10            | MCF5272_SDRAMC_SDCCR_BALOC_A21            | MCF5272_SDRAMC_SDCCR_REG            | MCF5272_SDRAMC_SDCCR_INIT            );#else#error "Must define BOARD variable"#endif    }    /* ChipSelect 1,3,4,5 and 6 - Empty */    MCF5272_WR_CS_CSBR1(imm, 0);    MCF5272_WR_CS_CSOR1(imm, 0);#if defined (HSEVB)    MCF5272_WR_CS_CSBR3(imm, 0        | MCF5272_CS_BR_BASE(BOARD_REG_ADDRESS)        | MCF5272_CS_BR_PS_8         | MCF5272_CS_BR_SRAM_8         | MCF5272_CS_BR_EN);    MCF5272_WR_CS_CSOR3(imm, 0        | MCF5272_CS_OR_MASK_4K        | MCF5272_CS_OR_WS(4));#else    MCF5272_WR_CS_CSBR3(imm, 0);    MCF5272_WR_CS_CSOR3(imm, 0);#endif    MCF5272_WR_CS_CSBR4(imm, 0);    MCF5272_WR_CS_CSOR4(imm, 0);    MCF5272_WR_CS_CSBR5(imm, 0);    MCF5272_WR_CS_CSOR5(imm, 0);    MCF5272_WR_CS_CSBR6(imm, 0);    MCF5272_WR_CS_CSOR6(imm, 0);}voidInitUART(int baud){}voidinitCPUio(){}intdevInit(int baud){/*  InitUART(baud); */    InitRemoteIO();    return(0);}int ConsoleBaudRate;intgetchar (void){    MCF5272_IMM *imm;    if (remotegetchar) {        return(remotegetchar());    }    imm = mcf5272_get_immp();    /* Wait until character has been received */    while (!(MCF5272_RD_UART0_USR(imm) & MCF5272_UART_USR_RXRDY)) {#if INCLUDE_ETHERNET        polletherdev();#endif    }    return MCF5272_RD_UART0_URB(imm);}intrputchar(char ch){    MCF5272_IMM *imm;    if (remoteputchar) {        return(remoteputchar(ch));    }    imm = mcf5272_get_immp();    /* Wait until space is available in the FIFO */    while (!(MCF5272_RD_UART0_USR(imm) & MCF5272_UART_USR_TXRDY));    /* Send the character */    MCF5272_WR_UART0_UTB(imm, (uint8)ch);#if INCLUDE_ETHERNET    SendIPMonChar(ch,0);#endif    return(ch);}intgotachar (void){    MCF5272_IMM *imm;    if (remotegotachar) {        return(remotegotachar());    }    imm = mcf5272_get_immp();    return (MCF5272_RD_UART0_USR(imm) & MCF5272_UART_USR_RXRDY);}voidrawon(void){}voidrawoff(void){}/********************************************************************/

⌨️ 快捷键说明

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