Esempio n. 1
0
// =========================================================================
// 函数功能: 由arm调用,唤醒dsp并使之处于复位态。
// 函数参数: start_address,dsp的入口地址
// 返回值  : 无
// =========================================================================
void Dcore_WakeupDspReset(void)
{
    g_ptSysconfig0Reg->KICKR[0] = KICK0R_UNLOCK;
    g_ptSysconfig0Reg->KICKR[1] = KICK1R_UNLOCK;
    g_ptLpsc0Reg->MDCTL[cn_PSC0_DSP] &= ~(u32)LRST;
    g_ptSysconfig0Reg->KICKR[0] = KICK0R_LOCK;
    g_ptSysconfig0Reg->KICKR[1] = KICK1R_LOCK;
    Cpucfg_EnableLPSC(cn_PSC0_DSP);
    g_ptSysconfig0Reg->KICKR[0] = KICK0R_UNLOCK;
    g_ptSysconfig0Reg->KICKR[1] = KICK1R_UNLOCK;
    g_ptLpsc0Reg->MDCTL[cn_PSC0_DSP] |= LRST;
    g_ptSysconfig0Reg->KICKR[0] = KICK0R_LOCK;
    g_ptSysconfig0Reg->KICKR[1] = KICK1R_LOCK;
}
Esempio n. 2
0
// =========================================================================
// 函数功能: 由arm调用,唤醒dsp并使之从start_address地址开始运行。调用本函数前,
//      必须先把代码加载到start_address所在的地址,dsp不可调用本函数。
// 函数参数: start_address,dsp的入口地址
// 返回值  : 无
// =========================================================================
void Dcore_WakeupDspRun(void (*start_address)(void))
{
    g_ptSysconfig0Reg->KICKR[0] = KICK0R_UNLOCK;
    g_ptSysconfig0Reg->KICKR[1] = KICK1R_UNLOCK;
    g_ptLpsc0Reg->MDCTL[cn_PSC0_DSP] &= ~(u32)LRST;
    g_ptSysconfig0Reg->HOST1CFG = (u32)start_address;
    g_ptSysconfig0Reg->KICKR[0] = KICK0R_LOCK;
    g_ptSysconfig0Reg->KICKR[1] = KICK1R_LOCK;
    Cpucfg_EnableLPSC(cn_PSC0_DSP);
    g_ptSysconfig0Reg->KICKR[0] = KICK0R_UNLOCK;
    g_ptSysconfig0Reg->KICKR[1] = KICK1R_UNLOCK;
    g_ptLpsc0Reg->MDCTL[cn_PSC0_DSP] |= LRST;
    g_ptSysconfig0Reg->KICKR[0] = KICK0R_LOCK;
    g_ptSysconfig0Reg->KICKR[1] = KICK1R_LOCK;
}
Esempio n. 3
0
// =========================================================================
// 函数功能:spi口初始化,本驱动中,cs由spi模块按gpio的output方式访问,故cs一律设
//              置为gpio输出功能。根据l138的引脚管理特点,pinmux中的设置优先于
//              spi模块中的设置,如果在pinmux中把spi0的scs0引脚设置为GP2[14]的
//              话,该引脚将由系统gpio模块控制,spi模块对它的所有设置和操作均无
//              效。因此,配置spi之前,应该先在pinmux中把该引脚配置为spi的cs功
//              能,ti的文档有误,pinmux中只能把这些引脚分配给spi使用,而不能指
//              定其为cs还是gpio。是否作为cs使用,由spi模块决定
// 输入参数:tpSpi,被操作的spi控制结构的地址
//           tagpInConfig,配置结构,包含配置信息
// 输出参数:无
// 返回值  :true=成功,false=失败
// =========================================================================
bool_t Spi_Init(volatile tagSpiReg * tpSpi, tagSpiConfig* tagpInConfig)
{
    u32 u32Prescaler;
    if(tpSpi == g_ptSpi0Reg)
        Cpucfg_EnableLPSC(cn_PSC0_SPI0);
    else if(tpSpi == g_ptSpi1Reg)
        Cpucfg_EnableLPSC(cn_PSC1_SPI1);
    else
        return false;
    if (tagpInConfig != NULL)
    {

      // reset tpSpi port.
      tpSpi->GCR0 = 0;

      tpSpi->GCR0 |= CN_SPI_RESET;

      // config master/slave mode.
      if (SPI_MODE_MASTER == tagpInConfig->tagMode)
      {
         // set clkmod and master for master mode.
         tpSpi->GCR1 = CN_SPI_CLKMOD | CN_SPI_MASTER;
      }
      else if (SPI_MODE_SLAVE == tagpInConfig->tagMode)
      {
         // clear spigcr1 for slave mode.
         tpSpi->GCR1 = 0;
      }
      else
      {
         goto error_exit;
      }

      // config pin options.
      switch (tagpInConfig->tagPinOption)
      {
         case SPI_3PIN:
            // enable tpSpi SOMI, SIMO, and CLK.
            tpSpi->PC0 = SOMI | SIMO | CLK;
            break;

         case SPI_4PIN_CS:
            // enable tpSpi SOMI, SIMO, CLK, and set cs[0~7] as gpio.
            tpSpi->PC0 = SOMI | SIMO | CLK;
            tpSpi->PC0 &= ~all_cs;        //所有片选脚设为gpio
            tpSpi->PC4 = all_cs;          //拉高所有片选
            tpSpi->PC1 |= all_cs;         //所有片选脚设为输出
            break;

         case SPI_4PIN_EN:
            // enable tpSpi SOMI, SIMO, CLK, and ENA.
            tpSpi->PC0 = SOMI | SIMO | CLK | ENA;
            break;

         case SPI_5PIN:
            // enable tpSpi SOMI, SIMO, CLK, SCS0, ENA and set cs[0~7] as gpio.
            tpSpi->PC0 = SOMI | SIMO | CLK | ENA;
            tpSpi->PC0 &= ~all_cs;        //所有片选脚设为gpio
            tpSpi->PC4 = all_cs;          //拉高所有片选
            tpSpi->PC1 |= all_cs;         //所有片选脚设为输出
            break;

         default:
             goto error_exit;
      }

      // config tpSpi direction, polarity, and phase.
      tpSpi->FMT0 = 0;

      if (SPI_SHIFT_LSB == tagpInConfig->tagShiftDir)
      {
         tpSpi->FMT0 |= SHIFTDIR;
      }

      if (tagpInConfig->polarity)
      {
         tpSpi->FMT0 |= POLARITY;
      }

      if (tagpInConfig->phase)
      {
         tpSpi->FMT0 |= PHASE;
      }

      // set the u32Prescaler and character length.
      u32Prescaler = (((CN_CFG_PLL0_SYSCLK2 / tagpInConfig->freq) - 1) & 0xFF);
      //u32Prescaler = 0x80;
      tpSpi->FMT0 |= u32Prescaler << SHIFT_PRESCALE;

      tpSpi->FMT0 |= (tagpInConfig->char_len&0x1f)<< SHIFT_CHARLEN;

      tpSpi->DELAY = (8 << 24) | (8 << 16);

      // disable interrupts.
      tpSpi->INT = 0x00;
      tpSpi->LVL = 0x00;

      // enable tpSpi.
      tpSpi->GCR1 |= CN_SPI_ENABLE;

    }
    return true;

error_exit:
    if(tpSpi == g_ptSpi0Reg)
        Cpucfg_DisableLPSC(cn_PSC0_SPI0);
    else if(tpSpi == g_ptSpi1Reg)
        Cpucfg_DisableLPSC(cn_PSC1_SPI1);
    return false;
}
Esempio n. 4
0
void Lcd_Display_On(void)
{
    Cpucfg_EnableLPSC(cn_PSC1_LCDC);
}
Esempio n. 5
0
void __lcd_hard_init(void)
{
    u32 x,y,reg;
    u16 *pdata;
    // enable power and setup lcdc.
    Cpucfg_EnableLPSC(cn_PSC1_LCDC);

        /* Palette */
    pdata = (u16*)(u8g_dsp_buffer - CN_PALETTE_SIZE);
#if CN_LCD_TYPE == CN_MODE_GREY_MONO
    *pdata++ = 0;
    *pdata++ = 15;
#elif CN_LCD_TYPE == CN_MODE_GREY_04
    *pdata++ = 0;
    *pdata++ = 5;
    *pdata++ = 10;
    *pdata++ = 15;
#elif CN_LCD_TYPE == CN_MODE_GREY_16
    *pdata++ = 0;
    *pdata++ = 1;
    *pdata++ = 2;
    *pdata++ = 3;
    *pdata++ = 4;
    *pdata++ = 5;
    *pdata++ = 6;
    *pdata++ = 7;
    *pdata++ = 8;
    *pdata++ = 9;
    *pdata++ = 10;
    *pdata++ = 11;
    *pdata++ = 12;
    *pdata++ = 13;
    *pdata++ = 14;
    *pdata++ = 15;
#endif

#if ((CN_LCD_TYPE == CN_MODE_GREY_MONO) || (CN_LCD_TYPE == CN_MODE_GREY_04) || (CN_LCD_TYPE == CN_MODE_GREY_16))

    //以下分配LCD控制器所需的引脚
    GPIO_CfgPinFunc(7,8,cn_p7_8_lcd_d0);
    GPIO_CfgPinFunc(7,9,cn_p7_9_lcd_d1);
    GPIO_CfgPinFunc(7,10,cn_p7_10_lcd_d2);
    GPIO_CfgPinFunc(7,11,cn_p7_11_lcd_d3);
    GPIO_CfgPinFunc(8,10,cn_p8_10_lcd_mclk);
    GPIO_CfgPinFunc(8,11,cn_p8_11_lcd_pclk);
    GPIO_CfgPinFunc(6,0,cn_p6_0_nlcd_ac_enb_cs);
    GPIO_CfgPinFunc(8,8,cn_p8_8_lcd_vsync);
    GPIO_CfgPinFunc(8,9,cn_p8_9_lcd_hsync);

    g_ptSysconfig0Reg->MSTPRI[2] &= 0x0fffffff;      //设置LCD数据传送次高优先级
    g_ptSysconfig0Reg->MSTPRI[2] |= 0x10000000;      //设置LCD数据传送次高优先级
    // Turn raster controller off
    g_ptLcdcReg->RASTER_CTRL       &= 0xfffffffe;

    // Clear status bits
    g_ptLcdcReg->LCD_STAT           = 0x000003ff;

    // PCLK = 1.27MHz, 帧频66,raster mode
    reg = CN_LCD_CLKVAL /(CN_LCD_SIZE_X * CN_LCD_SIZE_Y * 66) * 4;
    g_ptLcdcReg->LCD_CTRL &= ~CN_LCDC_LCD_CTRL_CLKDIV_MASK;
    g_ptLcdcReg->LCD_CTRL |= reg << CN_LCDC_LCD_CTRL_CLKDIV_SHIFT;
    g_ptLcdcReg->LCD_CTRL |= CN_LCDC_LCD_CTRL_MODESEL_MASK;

    g_ptLcdcReg->RASTER_CTRL =
                       (CN_LCDC_RASTER_CTRL_NIB_MODE_ENABLE << CN_LCDC_RASTER_CTRL_NIB_MODE_SHIFT)
                       +(CN_LCDC_RASTER_CTRL_MONO_COLOR_MONOCHROME << CN_LCDC_RASTER_CTRL_MONO_COLOR_SHIFT);


    // HBP = 0; HFP = 0; HSW = 0x3; PPL = 0x13
    g_ptLcdcReg->RASTER_TIMING_0 =
                        (4 << CN_LCDC_RASTER_TIMING_0_HBP_SHIFT)
                       +(4 << CN_LCDC_RASTER_TIMING_0_HFP_SHIFT)
                       +(4 << CN_LCDC_RASTER_TIMING_0_HSW_SHIFT)
                       +((CN_LCD_SIZE_X/16 -1)<< CN_LCDC_RASTER_TIMING_0_PPL_SHIFT);
    // VBP = 0x3; VFP = 0x2; VSW = 0xA: LPP = 0xef;
    g_ptLcdcReg->RASTER_TIMING_1    =
                         (10 << CN_LCDC_RASTER_TIMING_1_VBP_SHIFT)
                        +(9  << CN_LCDC_RASTER_TIMING_1_VFP_SHIFT)
                        +(5  << CN_LCDC_RASTER_TIMING_1_VSW_SHIFT)
                        +((CN_LCD_SIZE_Y -1)<< CN_LCDC_RASTER_TIMING_1_LPP_SHIFT);
    g_ptLcdcReg->RASTER_TIMING_2 =
                         (CN_LCDC_RASTER_TIMING_2_IPC_RISING << CN_LCDC_RASTER_TIMING_2_IPC_SHIFT);

    g_ptLcdcReg->LCDDMA_CTRL        = 0x00000540;
    // Frame buffer start
    g_ptLcdcReg->LCDDMA_FB0_BASE    = (u32)(u8g_dsp_buffer - CN_PALETTE_SIZE);
    // Frame buffer end,不知为何要减1
    g_ptLcdcReg->LCDDMA_FB0_CEILING = (u32)(u8g_dsp_buffer + cn_frame_buffer_size - 1);
    g_ptLcdcReg->RASTER_CTRL       |= 0x00000001;         // Enable controller
#endif

    return;
}