xmodem1k_client
此函数按照1K XMODEM协议,操作串口,将数据传递到FLASH里面。有两个入口参数,第一个入口参数按照地址和数据长度操作FLASH;第二个入口参数为串口相关的操作函数。
boot_data_program
操作FLASH,写入程序。
gp_xmodem_fun
总结
一个串口有收发功能,我们把这些功能起一个抽象的函数名,然后把这些抽象的函数打包成一个结构体,此处打包成了结构体xmodem_fun_handle。
使用时,我们拿着结构体,当做入口参数进行调用。
这个过程一直是抽象地进行,即我们把具体的函数名换了一个比较体面的假名字,用假的、抽象的名字进行功能的实现。
抽象实例化
将具体的函数名称赋值给抽象函数的指针,这就实现了抽象的函数具体化。
uartreadnoblock 即具体的值,也是函数功能的具体实现。
uint8_t uartreadnoblock (uint8_t *p_ch)
{
uint32_t statusFlag;
#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT
uint32_t ctrl = LPUART1->CTRL;
bool isSevenDataBits =
((ctrl & LPUART_CTRL_M7_MASK) || ((!(ctrl & LPUART_CTRL_M_MASK)) && (ctrl & LPUART_CTRL_PE_MASK)));
#endif
#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO
if (0 == ((LPUART1->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT))
#else
if (!(LPUART1->STAT & LPUART_STAT_RDRF_MASK))
#endif
{
statusFlag = LPUART_GetStatusFlags(LPUART1);
if (statusFlag & kLPUART_RxOverrunFlag)
{
LPUART_ClearStatusFlags(LPUART1, kLPUART_RxOverrunFlag);
return 0;
}
if (statusFlag & kLPUART_NoiseErrorFlag)
{
LPUART_ClearStatusFlags(LPUART1, kLPUART_NoiseErrorFlag);
return 0;
}
if (statusFlag & kLPUART_FramingErrorFlag)
{
LPUART_ClearStatusFlags(LPUART1, kLPUART_FramingErrorFlag);
return 0;
}
if (statusFlag & kLPUART_ParityErrorFlag)
{
LPUART_ClearStatusFlags(LPUART1, kLPUART_ParityErrorFlag);
return 0;
}
return 0;
}
#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT
if (isSevenDataBits)
{
*p_ch = (LPUART1->DATA & 0x7F);
}
else
{
*p_ch = LPUART1->DATA;
}
#else
*p_ch = (uint8_t)(LPUART1->DATA);
#endif
return 1;
}