drv_comm.c

来自「8032底层驱动部分。因为可以移植 所以单独来拿出来」· C语言 代码 · 共 876 行 · 第 1/2 页

C
876
字号
#ifdef __SWDBG_SUPPORT__
extern kal_uint8 SWDBG_Profile;
#endif  /* _SWDBG_SUPPORT__ */

/*To get all customized data*/
void Drv_Customize_Init(void)
{
	extern bmt_customized_struct *bmt_charing_para;
	extern kal_uint8 gCHRDET_EINT_NO;
	extern kal_uint8 gUSB_EINT_NO;

   uart_customize_init();
   keypad_customize_init();
   bmt_charing_para=bmt_get_customized_chr_para();
   gCHRDET_EINT_NO = custom_eint_get_channel(chrdet_eint_chann);
   
   #if defined(__USB_ENABLE__)
   gUSB_EINT_NO = custom_eint_get_channel(usb_eint_chann);
   #endif
   
   #ifdef __CHARGER_USB_DETECT_WIHT_ONE_EINT__
   chr_usb_detect.chr_usb_eint = custom_eint_get_channel(chr_usb_eint_chann);
   chr_usb_detect.chr_usb_adc = custom_adc_get_channel(chr_usb_adc_channel);
   chr_usb_detect.chr_usb_volt = bmt_get_chr_usb_detect_volt();
   #endif
}   

/*************************************************************************
* FUNCTION
*   Drv_query_boot_mode
*
* DESCRIPTION
*   Return boot mode.
*
* PARAMETERS
*
* RETURNS
*   FACTORY_BOOT, NORMAL_BOOT and USBMS_BOOT
*
* GLOBALS AFFECTED
*
*************************************************************************/
boot_mode_type Drv_query_boot_mode(void)
{
	
#ifdef __MULTI_BOOT__

   if( INT_BootMode() == MTK_FACTORY_MODE )
      return FACTORY_BOOT;
   
#ifdef __USB_ENABLE__

   if( INT_USBBoot() == KAL_TRUE )
      return USBMS_BOOT;
      
#endif /* __USB_ENABLE__ */   

#endif /* __MULTI_BOOT__ */   

   return NORMAL_BOOT;
}



/*
* FUNCTION
*  Drv_Init
*
* DESCRIPTION
*     This function is the initial function for all device drivers.
*     This function is called once to initialize the device driver.
*
* CALLS
*
* PARAMETERS
*  None
*
* RETURNS
*  None
*
* GLOBALS AFFECTED
*   external_global
*/
void Drv_Init(void)
{
   drv_hisr_init();
   lpwr_init();
   DRVPDN_ini();
   /*To get all customized data*/
   Drv_Customize_Init();
   custom_drv_init();
   #if ( defined(MT6218B) || defined(MT6219)|| defined(MT6217)||defined(MT6228)|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M)  )	
   /*turn on gpt3 to count powen on period*/
   GPT3_Init();
   GPT_Start(3);   
   	#if !defined(__L1_STANDALONE__) && !defined(__MAUI_BASIC__)
   	Visual_Init();
   	#endif /*!defined(__L1_STANDALONE__) && !defined(__MAUI_BASIC__)*/
   #endif
#if (defined(DRV_TIMING_DEBUG) && defined(MT6218B))   
   DRV_WriteReg(0x8010001c,1);
   DRV_WriteReg(0x80100024,0x04);
   //DRV_WriteReg(0x80100024,1); // (1/16K)
#endif

   #ifdef MT6205B
      DRV_MEMCPY = (MEMCPY_FUNC)0x48000150;
   #elif defined(MT6218)||defined(MT6218B)||defined(MT6219)||defined(MT6217)||defined(MT6228)|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) 
      DRV_MEMCPY_PTR = (MEMCPY_FUNC)0x48000134;
   #endif
   
   GPTI_init();
   WDT_init();
   DMA_Ini();
   ADC_Init();
#ifndef __L1_STANDALONE__
   //#ifdef PMIC_PRESENT
   #if ( (defined(MT6318))|| (defined(MT6305)) )
      #if ( (defined(MT6318)) )
      B2PSI_init();  
      pmic_init();
      #endif
      PW_PowerInit();
/*
	if(BMT.PWRon == PWRKEYPWRON)
		GPTI_BusyWait(Custom_Keypress_Period);
*/
   #else
      #ifdef __USB_ENABLE__
      {
			extern charger_usb_present_enum PW_is_charger_usb_present(void);

			switch (PW_is_charger_usb_present())
			{
			case CHARGER_PRESENT:				
				break;
			case USB_PRESENT:
				BMT.PWRon = USBPWRON;
				break;
			case NO_PRESENT:
				break;
         } 
      }
      #endif   /*__USB_ENABLE__*/
      DRV_POWERON();
   #endif   /*PMIC_PRESENT*/
#else /*__L1_STANDALONE__*/
   DRV_POWERON();
#endif   /*__L1_STANDALONE__*/

	/* update the system boot mode */
	system_boot_mode = Drv_query_boot_mode();
	
#ifdef __DMA_UART_VIRTUAL_FIFO__
	DMA_Vfifo_init();
#endif
   UART_HWInit(uart_port1);
   #ifdef __DMA_UART_VIRTUAL_FIFO__	  
   
   if(UART_VFIFO_support[uart_port1])
      UART_Register(uart_port1,UART_TYPE,&UartDriver_VFIFO);
   else 
      UART_Register(uart_port1,UART_TYPE,&UartDriver);
   
   if(UART_VFIFO_support[uart_port2])
      UART_Register(uart_port2,UART_TYPE,&UartDriver_VFIFO);
   else
      UART_Register(uart_port2,UART_TYPE,&UartDriver);         
   #else
	UART_Register(uart_port1,UART_TYPE,&UartDriver);
   UART_Register(uart_port2,UART_TYPE,&UartDriver);         
   #endif   
   UART_Open(uart_port1,MOD_UART1_HISR);
   /*TY adds these to expand flexibility 2004/10/15*/
   UART_Register_TX_cb(uart_port1, MOD_UART1_HISR, UART_dafault_tx_cb);
   UART_Register_RX_cb(uart_port1, MOD_UART1_HISR, UART_dafault_rx_cb);
   UART_HWInit(uart_port2);
   
   UART_Open(uart_port2,MOD_UART2_HISR);
   /*TY adds these to expand flexibility 2004/10/15*/
   UART_Register_TX_cb(uart_port2, MOD_UART2_HISR, UART_dafault_tx_cb);
   UART_Register_RX_cb(uart_port2, MOD_UART2_HISR, UART_dafault_rx_cb);
   
// if platform is designed to use uart3, pls define it, default setting is turned off.    
#ifdef __UART3_SUPPORT__		 
   UART_HWInit(uart_port3);
	//UART_Register(uart_port3,UART_TYPE,&UartDriver);
	#ifdef __DMA_UART_VIRTUAL_FIFO__	  
	if(UART_VFIFO_support[uart_port3])
      UART_Register(uart_port3,UART_TYPE,&UartDriver_VFIFO);
   else
	UART_Register(uart_port3,UART_TYPE,&UartDriver);
   #else
	UART_Register(uart_port3,UART_TYPE,&UartDriver);
   #endif   
   UART_Open(uart_port3,MOD_UART3_HISR);
   /*TY adds these to expand flexibility 2004/10/15*/
   UART_Register_TX_cb(uart_port3, MOD_UART3_HISR, UART_dafault_tx_cb);
   UART_Register_RX_cb(uart_port3, MOD_UART3_HISR, UART_dafault_rx_cb);
#endif   /*__UART3_SUPPORT__*/

#ifdef __SWDBG_SUPPORT__

   UART_Register(uart_port_swdbg, UART_TYPE, (UartDriver_strcut *)&swdbgdrv);

#endif   /* __SWDBG_SUPPORT__ */

#ifdef __USB_ENABLE__
   USB2UART_init();
#endif   /*__USB_ENABLE__*/

#ifdef __IRDA_SUPPORT__
   /*TY adds this 2004/10/27*/   
   /* Register UART API */
   UART_Register(uart_port_irda, IRDA_TYPE, &ircomm_uart_api);
#endif   
#if defined(__BTVCSR_HCI_BCHS__) || defined(__BTMTK__)
{
	kal_uint8 i;
	for(i = start_of_virtual_port; i < end_of_virtual_port + 1; i++)
		UART_Register(i, IRDA_TYPE, &sppa_uart_api);
}
#elif defined __CMUX_SUPPORT__
{
	kal_uint8 i;
	for(i = start_of_virtual_port; i < end_of_virtual_port + 1; i++)
		UART_Register(i, IRDA_TYPE, &cmux_uart_api);

}
#endif
   Kbd_Init();
   RTC_init(RTC_TCintr,RTC_ALintr);
   
#if (defined(__MSDC_MS__) || defined(__MSDC_SD_MMC__) || defined (__MSDC_MSPRO__))   
   MSDC_Initialize();
#endif   
   
#ifdef IC_MODULE_TEST
   IC_ModuleTest_Start();
#endif   /*IC_MODULE_TEST*/

   EINT_SW_Debounce_Init();
#ifdef MT6218B/*only 6218B has this */   
   GCU_Disable_ReverseBit();
#endif   
#ifdef __SWDBG_SUPPORT__

   /* initialize SWDBG */
   swdbg_init();

#endif   /* __SWDBG_SUPPORT__ */
   
   /* Cipher/Hash engine initialize */
   che_init();
 
 	/* ISP/Camera initialize */  
#if (defined(ISP_SUPPORT))
	cis_module_power_on(KAL_FALSE);
#endif
#if defined(MOTION_SENSOR_SUPPORT)
   motion_sensor_init();
#endif   
}

/*
* FUNCTION
*  Drv_Deinit
*
* DESCRIPTION
*     This function is the deinitial function for all device drivers.
*     This function is called once to deinitialize the device driver.
*
* CALLS
*
* PARAMETERS
*  None
*
* RETURNS
*  None
*
* GLOBALS AFFECTED
*   external_global
*/
void Drv_Deinit(void)
{
    custom_drv_deinit();
    #ifdef __BTVCSR_HCI_BCHS__
    bchs_host_controller_power_off();
    #endif
}

#if defined(MT6218)||defined(MT6218B)||defined(MT6219)||defined(MT6217)||defined(MT6228)|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) 
void DRV_MEMCPY(const void *srcaddr, void *dstaddr, kal_uint32 len)
{
   if (!DMA_memcpy(srcaddr,dstaddr,len))
      DRV_MEMCPY_PTR(srcaddr,dstaddr,len);
}
#endif   /*MT6218*/


kal_bool Drv_WriteReg(kal_uint32 addr, kal_uint16 data)
{
   if (addr < 0x70000000)
      return KAL_FALSE;
  
   DRV_WriteReg(addr,data);
   return KAL_TRUE;
}

kal_bool Drv_ReadReg(kal_uint32 addr, kal_uint16 *data)
{
   if (addr < 0x70000000)
      return KAL_FALSE;
      
   *data = DRV_Reg(addr);
   return KAL_TRUE;
}

kal_uint32 drv_get_current_time(void)
{
#if ( defined(MT6218B) || defined(MT6205B) )
   ASSERT(0);
#endif   /*MT6218B, MT6205B*/
	return (DRV_Reg32(0x80200230));
}

kal_uint32 drv_get_duration_tick(kal_uint32 previous_time, kal_uint32 current_time)
{
	kal_uint32 result;
#if ( defined(MT6218B) || defined(MT6205B) )
   ASSERT(0);
#endif   /*MT6218B, MT6205B*/

	if (previous_time > current_time)
	{
#if ( defined(MT6219) || defined(MT6228) )
		result = 0x80000 - previous_time + current_time;
#else /*MT6229, MT6227, MT6226, MT6217, MT6226M*/
      result = 0x1000000 - previous_time + current_time;
#endif   /*MT6228, MT6229, MT6227, MT6226, MT6226M*/
	}
	else
	{
		result = current_time - previous_time;
	}
	return result;
}

kal_uint32 drv_get_duration_ms(kal_uint32 previous_time)
{
	kal_uint32 result;
	kal_uint32 current_time;
	
	current_time = drv_get_current_time();
	result = drv_get_duration_tick(previous_time, current_time);
	result*=1000;
	result/=32768;
	return result;
}

#ifdef DRV_TIMING_DEBUG
DRV_DBG_STRUCT  DRV_DBG_INFO_DATA;

kal_uint32 drv_get_gpt_current_time(void)
{
   //0x80100020, enable!!
   #if ( (defined(MT6218B)) || (defined(MT6219))|| (defined(MT6217))|| (defined(MT6228)|| defined(MT6229) || defined(MT6230))|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M)  )
	return (DRV_Reg32(0x80100020));
	#else /*!MT6218B*/
	return (DRV_Reg32(0x80200230));
	#endif   /*MT6218B*/
}

kal_uint32 drv_get_gpt_duration_tick(kal_uint32 previous_time)
{
   #if ( (defined(MT6218B)) || (defined(MT6219))|| (defined(MT6217))|| (defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
   kal_uint32 current_time = DRV_Reg32(0x80100020);
	kal_uint32 result;
	
	if (previous_time > current_time)
	{
		result = 0x10000 - previous_time + current_time;
	}
	else
	{
		result = current_time - previous_time;
	}
	return result;
	#else /*!MT6218B*/
	kal_uint32 current_time = DRV_Reg32(0x80200230);
	kal_uint32 result;
	if (previous_time > current_time)
	{
		result = 0x80000 - previous_time + current_time;
	}
	else
	{
		result = current_time - previous_time;
	}
	return result;
	#endif   /*MT6218B*/
}

kal_uint32 drv_get_gpt_duration_ms(kal_uint32 previous_time)
{
   #if ( (defined(MT6218B)) || (defined(MT6219))|| (defined(MT6217))|| (defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
	kal_uint32 result;
	result = drv_get_duration_tick(previous_time);
	return result;
	#else /*!MT6218B*/
	kal_uint32 result;
	result = drv_get_duration_tick(previous_time);
	result*=1000;
	result/=32768;
	return result;
	#endif   /*MT6218B*/
}
#endif  /*DRV_TIMING_DEBUG*/

#ifdef DRV_MEMORY_TRACE_DEBUG
DRV_DBG_STRUCT DRV_DBG_INFO_DATA;
/*drv_dbg_trace(NAND_READ_START,drv_get_current_time(),0,0);*/
void drv_dbg_trace(kal_uint16 index, kal_uint32 time, kal_uint32 data1, kal_uint32 data2)
{
   kal_uint32        savedMask;
   savedMask = SaveAndSetIRQMask();
   {
      DRV_DBG_INFO_DATA.dbg_data[DRV_DBG_INFO_DATA.dbg_data_idx&(MAX_DRV_DBG_INFO_SIZE-1)].tag = index;
      DRV_DBG_INFO_DATA.dbg_data[DRV_DBG_INFO_DATA.dbg_data_idx&(MAX_DRV_DBG_INFO_SIZE-1)].time = time;
      DRV_DBG_INFO_DATA.dbg_data[DRV_DBG_INFO_DATA.dbg_data_idx&(MAX_DRV_DBG_INFO_SIZE-1)].data1 = data1;
      DRV_DBG_INFO_DATA.dbg_data[DRV_DBG_INFO_DATA.dbg_data_idx&(MAX_DRV_DBG_INFO_SIZE-1)].data2 = data2;
      DRV_DBG_INFO_DATA.dbg_data_idx++;
   }
   RestoreIRQMask(savedMask);
}
#endif   /*DRV_MEMORY_TRACE_DEBUG*/

⌨️ 快捷键说明

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