📄 lcd_if.c
字号:
*
*****************************************************************************/
SYS_UWORD16 f_lcd_if_poll_read( E_LCD_IF_CS d_cs,
E_LCD_IF_DATA_TYPE d_type )
{
// SYS_UWORD8 d_data_type = 0;
/* Switch to chip select */
/* Set data type and access */
F_LCD_CAM_NANDFLASH_AQUIRE_BUS;
F_LCD_SET_PIN_CONFIG;
f_lcd_if_set_cs_and_data_type( d_cs, d_type, C_LCD_IF_READ );
/* Wait for data received from the LCD Controller hardware */
F_LCD_IF_WAIT_READ_STATUS;
/* retrieve data read */
F_LCD_CAM_NANDFLASH_RELEASE_BUS;
return (*(volatile SYS_UWORD16*) C_LCD_IF_RD_REG);
} /* f_lcd_if_poll_read */
/******************************************************************************
*
* FUNCTION NAME: f_lcd_if_it_write
*
* LCD Controller write procedure in interrupt mode.
* Direct access to the data buffer
*
* ARGUMENT LIST:
*
* Argument Type IO Description
* ------------ ------------------- -- ---------------------------------
* d_cs E_LCD_IF_CS I LCD Controller Chip select
* p_buffer SYS_UWORD16 I Pointer to the data buffer
* d_size SYS_UWORD32 I Data buffer size
* d_type E_LCD_IF_DATA_TYPE I Instruction / Data type selector
* pf_callback_sts T_LCD_IF_CALLBACK I Status callback function pointer.
*
* RETURN VALUE: E_LCD_IF_RET function status.
*
*****************************************************************************/
E_LCD_IF_RET f_lcd_if_it_write( E_LCD_IF_CS d_cs,
SYS_UWORD16 *p_buffer,
SYS_UWORD32 d_size,
E_LCD_IF_DATA_TYPE d_type,
T_LCD_IF_CALLBACK pf_callback_sts )
{
// SYS_UWORD8 d_data_type = 0;
/* Check the callback function argument */
if( pf_callback_sts == (T_LCD_IF_CALLBACK) NULL )
return( C_LCD_IF_RET_ERR );
F_LCD_CAM_NANDFLASH_AQUIRE_BUS;
F_LCD_SET_PIN_CONFIG;
/* Switch to chip select */
/* Set data type and access */
f_lcd_if_set_cs_and_data_type( d_cs, d_type, C_LCD_IF_WRITE );
/* save buffer references and install status callback function */
d_lcd_if_internal.d_cs_struct[d_cs].d_tx.p_callback = pf_callback_sts;
d_lcd_if_internal.d_cs_struct[d_cs].d_tx.p_buffer = p_buffer;
d_lcd_if_internal.d_cs_struct[d_cs].d_tx.d_buffer_size = d_size;
/* set d_interrupt_state to C_LCD_IF_IT_BUFF */
d_lcd_if_internal.d_interrupt_state = C_LCD_IF_IT_BUFF;
/* Enable LCD Interface TX FIFO Empty interrupt */
F_LCD_IF_ENABLE_TX_FIFO_EMPTY_IT;
return( C_LCD_IF_RET_OK );
} /* f_lcd_if_it_write */
/******************************************************************************
*
* FUNCTION NAME: f_lcd_if_it_write_cust
*
* LCD Controller write procedure in interrupt mode.
* LCD Controller Tx FIFO copy done by transmit callback function.
*
* ARGUMENT LIST:
*
* Argument Type IO Description
* ------------ ------------------- -- ---------------------------------
* d_cs E_LCD_IF_CS I LCD Controller Chip select
* d_type E_LCD_IF_DATA_TYPE I Instruction / Data type selector
* pf_callback_tx T_LCD_IF_CALLBACK I Transmit callback function pointer.
*
* RETURN VALUE: E_LCD_IF_RET function status.
*
*****************************************************************************/
E_LCD_IF_RET f_lcd_if_it_write_cust( E_LCD_IF_CS d_cs,
E_LCD_IF_DATA_TYPE d_type,
T_LCD_IF_CALLBACK pf_callback_tx )
{
// SYS_UWORD8 d_data_type = 0;
/* Check the callback function argument */
if( pf_callback_tx == (T_LCD_IF_CALLBACK) NULL )
return( C_LCD_IF_RET_ERR );
F_LCD_CAM_NANDFLASH_AQUIRE_BUS;
F_LCD_SET_PIN_CONFIG;
/* Switch to chip select */
/* Set data type and access */
f_lcd_if_set_cs_and_data_type( d_cs, d_type, C_LCD_IF_WRITE );
/* install transmit callback function */
d_lcd_if_internal.d_cs_struct[d_cs].d_tx.p_callback = pf_callback_tx;
/* set d_interrupt_state to C_LCD_IF_IT_CUST */
d_lcd_if_internal.d_interrupt_state = C_LCD_IF_IT_CUST;
/* Enable LCD Interface TX FIFO Empty interrupt */
F_LCD_IF_ENABLE_TX_FIFO_EMPTY_IT;
return( C_LCD_IF_RET_OK );
} /* f_lcd_if_it_write_cust */
/******************************************************************************
*
* FUNCTION NAME: f_lcd_if_dma_enable
*
* LCD Controller write procedure start in DMA mode.
*
* ARGUMENT LIST:
*
* Argument Type IO Description
* ------------ ------------------- -- ---------------------------------
* d_cs E_LCD_IF_CS I LCD Controller Chip select
* d_min_frame_sz E_LCD_IF_FRAME_SZ I LCD Interface Minimum frame size
* d_type E_LCD_IF_DATA_TYPE I Instruction / Data type selector
*
* RETURN VALUE: None.
*
*****************************************************************************/
void f_lcd_if_dma_enable( E_LCD_IF_CS d_cs,
E_LCD_IF_FRAME_SZ d_min_frame_sz,
E_LCD_IF_DATA_TYPE d_type )
{
// SYS_UWORD8 d_data_type = 0;
/* Switch to chip select */
/* Set data type and access */
F_LCD_CAM_NANDFLASH_AQUIRE_BUS;
F_LCD_SET_PIN_CONFIG;
f_lcd_if_set_cs_and_data_type( d_cs, d_type, C_LCD_IF_WRITE );
/* enables DMA capabilities */
F_LCD_IF_ENABLE_DMA;
} /* f_lcd_if_dma_enable */
/******************************************************************************
*
* FUNCTION NAME: f_lcd_if_dma_disable
*
* LCD Controller write procedure stop in DMA mode.
*
* ARGUMENT LIST:
*
* Argument Type IO Description
* ------------ ------------------- -- ---------------------------------
* d_cs E_LCD_IF_CS I LCD Controller Chip select
* pf_callback_sts T_LCD_IF_CALLBACK I Status Callback function pointer
*
* RETURN VALUE: E_LCD_IF_RET function status.
*
*****************************************************************************/
E_LCD_IF_RET f_lcd_if_dma_disable( E_LCD_IF_CS d_cs,
T_LCD_IF_CALLBACK pf_callback_sts )
{
/* Check the callback function argument */
if( pf_callback_sts == (T_LCD_IF_CALLBACK) NULL )
return( C_LCD_IF_RET_ERR );
/* disable DMA capabilities */
F_LCD_IF_DISABLE_DMA;
/* install status callback function */
d_lcd_if_internal.d_cs_struct[d_cs].d_tx.p_callback = pf_callback_sts;
/* set d_interrupt_state to C_LCD_IF_IT_CUST */
d_lcd_if_internal.d_interrupt_state = C_LCD_IF_IT_CUST;
/* Enable LCD Interface TX FIFO Empty interrupt */
F_LCD_IF_ENABLE_TX_FIFO_EMPTY_IT;
F_LCD_CAM_NANDFLASH_RELEASE_BUS;
return( C_LCD_IF_RET_OK );
} /* f_lcd_if_dma_disable */
/******************************************************************************
*
* FUNCTION NAME: f_lcd_if_set_cs_and_data_type
*
* Updates CNTL_REG and LCD_CNTL_REG to change LCD Controller addressing.
* Updates LCD_CNTL_REG to set data type and read or write access
*
* ARGUMENT LIST:
*
* Argument Type IO Description
* ------------ ------------------- -- ---------------------------------
* d_cs E_LCD_IF_CS I LCD Controller Chip select
* d_type E_LCD_IF_DATA_TYPE I data type
* d_access E_LCD_IF_DATA_ACCESS I Data access
*
* RETURN VALUE: None
*
*****************************************************************************/
void f_lcd_if_set_cs_and_data_type( E_LCD_IF_CS d_cs, E_LCD_IF_DATA_TYPE d_type, E_LCD_IF_DATA_ACCESS d_access )
{
SYS_UWORD8 d_data_type;
/* if the argument equals the current chip select, nothing to do */
if( d_lcd_if_internal.d_current_cs != d_cs )
{
/* What is the chip select value ? */
if( d_cs == C_LCD_IF_CS_NOT_SELECTED )
{
/* not a valid CS */
return;
} // End if
/* update current struct pointer */
//d_lcd_if_internal.p_current_struct = &d_lcd_if_internal.d_cs_struct[d_cs];
/* Update CNTL_REG register and LCD_CNTL_REG to the new chip select */
/* The CNTL_REG:CLOCK_EN bit is set to Clock enable */
(*(volatile SYS_UWORD16*) C_LCD_IF_CNTL_REG) = d_lcd_if_internal.d_cs_struct[d_cs].d_cntl_reg;
(*(volatile SYS_UWORD16*) C_LCD_IF_LCD_CNTL_REG) = d_lcd_if_internal.d_cs_struct[d_cs].d_lcd_cntl_reg;
/* update d_current_cs */
d_lcd_if_internal.d_current_cs = d_cs;
} // End if
/* Sets LCD_CNTL_REG:LCD_RS to type defined in argument and start read */
if( d_type == C_LCD_IF_INSTRUCTION )
{
d_data_type = (SYS_UWORD8) d_lcd_if_internal.d_cs_struct[d_cs].d_isll;
}
else
{
d_data_type = (SYS_UWORD8) ~d_lcd_if_internal.d_cs_struct[d_cs].d_isll;
} // End if
if( d_data_type == 0 )
{
(*(volatile SYS_UWORD16*) C_LCD_IF_LCD_CNTL_REG) &= ~( 0x01 << C_LCD_IF_LCD_CNTL_REG_LCD_RS_POS );
}
else
{
(*(volatile SYS_UWORD16*) C_LCD_IF_LCD_CNTL_REG) |= ( 0x01 << C_LCD_IF_LCD_CNTL_REG_LCD_RS_POS );
} // End if
// Set access type
if( d_access == C_LCD_IF_READ )
{
(*(volatile SYS_UWORD16*) C_LCD_IF_LCD_CNTL_REG) |=
(C_LCD_IF_LCD_CNTL_REG_LCD_START_READ_EN << C_LCD_IF_LCD_CNTL_REG_LCD_START_READ_POS);
}
else
{
(*(volatile SYS_UWORD16*) C_LCD_IF_LCD_CNTL_REG) &=
~(C_LCD_IF_LCD_CNTL_REG_LCD_START_READ_EN << C_LCD_IF_LCD_CNTL_REG_LCD_START_READ_POS);
} // End if
} /* f_lcd_if_set_cs_and_data_type */
/******************************************************************************
*
* FUNCTION NAME: f_lcd_if_dummy_callback
*
* Dummy callback function for Internal structure initialization.
*
*
* ARGUMENT LIST:
*
* Argument Type IO Description
* ------------ ------------------- -- ---------------------------------
* None.
*
* RETURN VALUE: E_LCD_IF_CALLBACK_RET
*
*****************************************************************************/
static E_LCD_IF_CALLBACK_RET f_lcd_if_dummy_callback( void )
{
/* EMPTY DUMMY FUNCTION */
return C_LCD_IF_CALLBACK_OK;
} /* f_lcd_if_dummy_callback */
static void lcd_if_nop_delay(SYS_UWORD32 ms)
{
unsigned short a;
while (ms-- > 0) for (a=0;a<1000;a++) asm(" nop");
}
/******************************************************************************
*
* FUNCTION NAME: f_lcd_if_initialization
*
*
*
* ARGUMENT LIST:
*
* Argument Type IO Description
* ------------ ------------------- -- ---------------------------------
* None.
*
* RETURN VALUE:
*
*****************************************************************************/
void f_lcd_if_initialization( void )
{
T_LCD_IF_INIT init_struct_ptr;
volatile SYS_UWORD8 i;
init_struct_ptr.d_mode = C_LCD_IF_8086_MODE;
init_struct_ptr.b_flip_bytes = C_LCD_IF_MSB_FIRST;
init_struct_ptr.d_isll = C_LCD_IF_LOW;
init_struct_ptr.d_tx_init.d_clock_divider = C_LCD_IF_DIV1; // High speed needed for DMA
init_struct_ptr.d_rx_init.d_clock_divider = C_LCD_IF_DIV1;
init_struct_ptr.d_rx_init.d_dummy_cycles = C_LCD_IF_0_CYCLE;
F_LCD_CAM_NANDFLASH_AQUIRE_BUS;
F_LCD_SET_PIN_CONFIG;
f_lcd_if_reset();
f_lcd_if_clock(C_LCD_IF_CLOCK_ON);
f_lcd_if_init(C_LCD_IF_CS1, &(init_struct_ptr) );
// Reset for 20 ms.
*((volatile short *) 0xffffa000) = 0x2afb; // The correct initialisation code. For some reason, the f_lcd_if_init function has changed :(
f_lcd_if_reset_lcd_controller(C_LCD_IF_CS1, C_LCD_IF_ON);
lcd_if_nop_delay(100);
f_lcd_if_reset_lcd_controller(C_LCD_IF_CS1, C_LCD_IF_OFF);
lcd_if_nop_delay(100);
f_lcd_if_reset_lcd_controller(C_LCD_IF_CS1, C_LCD_IF_ON);
lcd_if_nop_delay(100);
f_lcd_if_reset_lcd_controller(C_LCD_IF_CS1, C_LCD_IF_OFF);
#if 0
f_lcd_if_reset();
f_lcd_if_clock(C_LCD_IF_CLOCK_ON);
f_lcd_if_init(C_LCD_IF_CS0, &(init_struct_ptr) );
f_lcd_if_init(C_LCD_IF_CS1, &(init_struct_ptr) );
f_lcd_if_reset_lcd_controller(C_LCD_IF_CS0, C_LCD_IF_ON);
for(i=0;i<10;i++);
f_lcd_if_reset_lcd_controller(C_LCD_IF_CS0, C_LCD_IF_OFF);
for(i=0;i<10;i++);
f_lcd_if_reset_lcd_controller(C_LCD_IF_CS1, C_LCD_IF_ON);
for(i=0;i<10;i++);
f_lcd_if_reset_lcd_controller(C_LCD_IF_CS1, C_LCD_IF_OFF);
f_lcd_if_reset();
f_lcd_if_clock(C_LCD_IF_CLOCK_ON);
f_lcd_if_init(C_LCD_IF_CS1, &(init_struct_ptr) );
f_lcd_if_reset_lcd_controller(C_LCD_IF_CS1, C_LCD_IF_ON);
for(i=0;i<10;i++);
f_lcd_if_reset_lcd_controller(C_LCD_IF_CS1, C_LCD_IF_OFF);
#endif
F_LCD_CAM_NANDFLASH_RELEASE_BUS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -