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

📄 lcd_if.c

📁 MMI层OBJ不能完全编译
💻 C
📖 第 1 页 / 共 2 页
字号:
   *
   *****************************************************************************/

  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 + -