Esempio n. 1
0
int epdc_ctrl_init(void *lcdbase)
{
	/*
	 * We rely on lcdbase being a physical address, i.e., either MMU off,
	 * or 1-to-1 mapping. Might want to add some virt2phys here.
	 */
	if (!lcdbase)
		return -1;

	eink_color_fg = 0xFF;
	eink_color_bg = 0xFF;

	/* Reset */
	REG_SET(EPDC_BASE, EPDC_CTRL, EPDC_CTRL_SFTRST);
	while (!(REG_RD(EPDC_BASE, EPDC_CTRL) & EPDC_CTRL_CLKGATE))
		;
	REG_CLR(EPDC_BASE, EPDC_CTRL, EPDC_CTRL_SFTRST);

	/* Enable clock gating (clear to enable) */
	REG_CLR(EPDC_BASE, EPDC_CTRL, EPDC_CTRL_CLKGATE);
	while (REG_RD(EPDC_BASE, EPDC_CTRL) &
	       (EPDC_CTRL_SFTRST | EPDC_CTRL_CLKGATE))
		;

	debug("resolution %dx%d, bpp %d\n", (int)panel_info.vl_col,
		(int)panel_info.vl_row, NBITS(panel_info.vl_bpix));


	/* Set framebuffer pointer */
	REG_WR(EPDC_BASE, EPDC_UPD_ADDR, (u32)lcdbase);

#if 0
	/* Set Working Buffer pointer */
	REG_WR(EPDC_BASE, EPDC_WB_ADDR, panel_info.epdc_data.working_buf_addr);
	/* Set Waveform Buffer pointer */
	REG_WR(EPDC_BASE, EPDC_WVADDR, panel_info.epdc_data.waveform_buf_addr);
#endif 

	/* Set waveform and working buffer, they will be changed later */
	REG_WR(EPDC_BASE, EPDC_WVADDR, (unsigned long)CONFIG_TEMP_INIT_WAVEFORM_ADDR);
	REG_WR(EPDC_BASE, EPDC_WB_ADDR, (unsigned long)CONFIG_WORKING_BUF_ADDR);
	
#if 0
	/* Get waveform data address and offset */
	int data_offs = setup_waveform_file();
	if(data_offs == -1) {
		printf("Can't load waveform data!\n");
		return -1;
	}
#endif

	/* Initialize EPDC, passing pointer to EPDC registers */
	epdc_init_settings();

	epdc_initialized = 1;

	return;
}
Esempio n. 2
0
void lcd_ctrl_init(void *lcdbase)
{
	/*
	 * We rely on lcdbase being a physical address, i.e., either MMU off,
	 * or 1-to-1 mapping. Might want to add some virt2phys here.
	 */
	if (!lcdbase)
		return;

	lcd_color_fg = 0xFF;
	lcd_color_bg = 0xFF;

	/* Reset */
	REG_SET(EPDC_BASE, EPDC_CTRL, EPDC_CTRL_SFTRST);
	while (!(REG_RD(EPDC_BASE, EPDC_CTRL) & EPDC_CTRL_CLKGATE))
		;
	REG_CLR(EPDC_BASE, EPDC_CTRL, EPDC_CTRL_SFTRST);

	/* Enable clock gating (clear to enable) */
	REG_CLR(EPDC_BASE, EPDC_CTRL, EPDC_CTRL_CLKGATE);
	while (REG_RD(EPDC_BASE, EPDC_CTRL) &
	       (EPDC_CTRL_SFTRST | EPDC_CTRL_CLKGATE))
		;

	debug("resolution %dx%d, bpp %d\n", (int)panel_info.vl_col,
		(int)panel_info.vl_row, NBITS(panel_info.vl_bpix));

	/* Set framebuffer pointer */
	REG_WR(EPDC_BASE, EPDC_UPD_ADDR, (u32)lcdbase);

	/* Set Working Buffer pointer */
	REG_WR(EPDC_BASE, EPDC_WB_ADDR, panel_info.epdc_data.working_buf_addr);

	/* Get waveform data address and offset */
	if (setup_waveform_file()) {
		printf("Can't load waveform data!\n");
		return;
	}

	/* Set Waveform Buffer pointer */
	REG_WR(EPDC_BASE, EPDC_WVADDR,
		panel_info.epdc_data.waveform_buf_addr);

	/* Initialize EPDC, passing pointer to EPDC registers */
	epdc_init_settings();

	return;
}
Esempio n. 3
0
void epd_enable(void)
{
	char temp = TEMP_USE_DEFAULT;
	debug("epd_enable\n");
	
	//epdc_power_on();
	/* Draw data to display */
	//draw_mode0();

	/* Enable clock gating (clear to enable) */
	REG_CLR(EPDC_BASE, EPDC_CTRL, EPDC_CTRL_CLKGATE);
	while (REG_RD(EPDC_BASE, EPDC_CTRL) &
	       (EPDC_CTRL_SFTRST | EPDC_CTRL_CLKGATE))
		;

	REG_WR(EPDC_BASE, EPDC_TEMP, TEMP_USE_DEFAULT);
	temp = read_temperature();
//	temp = do_read_temperature_via_i2c();
	temp_set_index(temp);
	
	/* Set Waveform Bufferr register to real waveform address */
	REG_WR(EPDC_BASE, EPDC_WVADDR, panel_info.epdc_data.waveform_buf_addr);

	debug("epdc_irq's value %08x\nEPDC_IRQ_CLR's value %08x\n",REG_RD(EPDC_BASE, EPDC_IRQ), REG_RD(EPDC_BASE, EPDC_IRQ_CLR));
	debug("EPDC LUT STATUS %08x\n",REG_RD(EPDC_BASE,EPDC_STATUS_LUTS));
	draw_splash_screen();
	debug("epdc_irq's value %08x\nEPDC_IRQ_CLR's value %08x\n",REG_RD(EPDC_BASE, EPDC_IRQ), REG_RD(EPDC_BASE, EPDC_IRQ_CLR));
	debug("EPDC LUT STATUS %08x\n",REG_RD(EPDC_BASE,EPDC_STATUS_LUTS));
}
Esempio n. 4
0
static void set_clocks(void)
{
	u32 ssp_source_clk, ssp_clk;
	u32 ssp_div = 1;
	u32 val = 0;

	/*
	 * Configure 480Mhz IO clock
	 */

	/* Ungate IO_CLK and set divider */
	REG_CLR(CLKCTRL_BASE + CLKCTRL_FRAC, FRAC_CLKGATEIO);
	REG_CLR(CLKCTRL_BASE + CLKCTRL_FRAC, 0x3f << FRAC_IOFRAC);
	REG_SET(CLKCTRL_BASE + CLKCTRL_FRAC, IO_DIVIDER << FRAC_IOFRAC);

	/*
	 * Set SSP CLK to desired value
	 */

	/* Calculate SSP_CLK divider relatively to 480Mhz IO_CLK*/
	ssp_source_clk = 480 * MHz;
	ssp_clk = CONFIG_SSP_CLK;
	ssp_div = (ssp_source_clk + ssp_clk - 1) / ssp_clk;

	/* Enable SSP clock */
	val = REG_RD(CLKCTRL_BASE + CLKCTRL_SSP);
	val &= ~SSP_CLKGATE;
	REG_WR(CLKCTRL_BASE + CLKCTRL_SSP, val);

	/* Wait while clock is gated */
	while (REG_RD(CLKCTRL_BASE + CLKCTRL_SSP) & SSP_CLKGATE)
		;

	/* Set SSP clock divider */
	val &= ~(0x1ff << SSP_DIV);
	val |= ssp_div << SSP_DIV;
	REG_WR(CLKCTRL_BASE + CLKCTRL_SSP, val);

	/* Wait until new divider value is set */
	while (REG_RD(CLKCTRL_BASE + CLKCTRL_SSP) & SSP_BUSY)
		;

	/* Set SSP clock source to IO_CLK */
	REG_SET(CLKCTRL_BASE + CLKCTRL_CLKSEQ, CLKSEQ_BYPASS_SSP);
	REG_CLR(CLKCTRL_BASE + CLKCTRL_CLKSEQ, CLKSEQ_BYPASS_SSP);
}
Esempio n. 5
0
int timer_init(void)
{
	u32 val;

	/*
	 * Reset Timers and Rotary Encoder module
	 */

	/* Clear SFTRST */
	REG_CLR(TIMROT_BASE + ROTCTRL, 1 << 31);
	while (REG_RD(TIMROT_BASE + ROTCTRL) & (1 << 31))
		;

	/* Clear CLKGATE */
	REG_CLR(TIMROT_BASE + ROTCTRL, 1 << 30);

	/* Set SFTRST and wait until CLKGATE is set */
	REG_SET(TIMROT_BASE + ROTCTRL, 1 << 31);
	while (!(REG_RD(TIMROT_BASE + ROTCTRL) & (1 << 30)))
		;

	/* Clear SFTRST and CLKGATE */
	REG_CLR(TIMROT_BASE + ROTCTRL, 1 << 31);
	REG_CLR(TIMROT_BASE + ROTCTRL, 1 << 30);

	/*
	* Now initialize timer
	*/

	/* Set fixed_count to 0 */
	REG_WR(TIMROT_BASE + TIMCOUNT, 0);

	/* set UPDATE bit and 1Khz frequency */
	REG_WR(TIMROT_BASE + TIMCTRL,
	       TIMCTRL_RELOAD | TIMCTRL_UPDATE | TIMCTRL_SELECT_1KHZ);

	/* Set fixed_count to maximal value */
	REG_WR(TIMROT_BASE + TIMCOUNT, TIMER_LOAD_VAL);

	/* init the timestamp and lastdec value */
	reset_timer_masked();

	return 0;
}
Esempio n. 6
0
////////////////////////////////////////////////////////////////////////////////
// UserEarlyConfig()函数在启动代码中执行,这时还没有RTOS存在。
////////////////////////////////////////////////////////////////////////////////
bool_t UserEarlyConfig(void)
{
  // 尽早初始化中断控制模块使之可用。
  if(!ICOLL_Init()){
    return FALSE;
  }
  // 将所有USART的时钟源设置为PLL (BUG:UART只能用12MHZ晶振作时钟源)。
  outl(1, REG_SET(HW_UARTCLKSEL));
  outl(1, REG_CLR(HW_UARTCLKUEN));
  outl(1, REG_SET(HW_UARTCLKUEN));
  
  return TRUE;
}
Esempio n. 7
0
static void set_pinmux(void)
{

#if defined(CONFIG_SPI_SSP1)

	/* Configure SSP1 pins for ENC28j60: 8maA */
	REG_CLR(PINCTRL_BASE + PINCTRL_MUXSEL(4), 0x00003fff);

	REG_CLR(PINCTRL_BASE + PINCTRL_DRIVE(8), 0X03333333);
	REG_SET(PINCTRL_BASE + PINCTRL_DRIVE(8), 0x01111111);

	REG_CLR(PINCTRL_BASE + PINCTRL_PULL(2), 0x0000003f);
#endif

#if defined(CONFIG_SPI_SSP2)

	/* Configure SSP2 pins for ENC28j60: 8maA */
	REG_CLR(PINCTRL_BASE + PINCTRL_MUXSEL(0), 0x00000fc3);
	REG_SET(PINCTRL_BASE + PINCTRL_MUXSEL(0), 0x00000a82);

	REG_CLR(PINCTRL_BASE + PINCTRL_MUXSEL(1), 0x00030300);
	REG_SET(PINCTRL_BASE + PINCTRL_MUXSEL(1), 0x00020200);

	REG_CLR(PINCTRL_BASE + PINCTRL_DRIVE(0), 0X00333003);
	REG_SET(PINCTRL_BASE + PINCTRL_DRIVE(0), 0x00111001);

	REG_CLR(PINCTRL_BASE + PINCTRL_DRIVE(2), 0x00030000);
	REG_SET(PINCTRL_BASE + PINCTRL_DRIVE(2), 0x00010000);

	REG_CLR(PINCTRL_BASE + PINCTRL_DRIVE(3), 0x00000003);
	REG_SET(PINCTRL_BASE + PINCTRL_DRIVE(3), 0x00000001);

	REG_CLR(PINCTRL_BASE + PINCTRL_PULL(0), 0x00100039);
#endif

}
Esempio n. 8
0
void HW_SetPinMux(rt_uint8_t port, rt_uint8_t pin, rt_uint8_t mux_type)
{
    rt_uint32_t addr = HW_IOCON(port, pin);
    rt_uint32_t val = inl(addr);   // read origin value

    val &= ~7UL;     // clear MUX field
    val |= mux_type; // set MUX field with new value

    outl(val ,addr);   // Set new value
}

void HW_GpioSetDir(rt_uint8_t port, rt_uint8_t pin, rt_uint8_t isOut)
{
    rt_uint32_t addr = HW_GPIO_DATA_BASE | ((port>>2)<<16) | 0x8000;
    rt_uint32_t val;
    addr = isOut? REG_SET(addr) : REG_CLR(addr);
    val = (1 << ((port%4)*8+pin));
    outl(val, addr);
}

void HW_GpioSetVal(rt_uint8_t port, rt_uint8_t pin)
{
    rt_uint32_t addr, val;
    addr = REG_SET(HW_GPIO_DATA_BASE | ((port>>2)<<16));
    val  = (1 << ((port%4)*8+pin));
    outl(val, addr);
}

void HW_GpioClrVal(rt_uint8_t port, rt_uint8_t pin)
{
    rt_uint32_t addr, val;