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 + -
显示快捷键?