145 lines
3.2 KiB
C
145 lines
3.2 KiB
C
/*************************************************************/
|
|
/** @file: iAP.c
|
|
@brief: 苹果iAP 协议
|
|
@details:
|
|
@author: Bingquan Cai
|
|
@date: 2013-10-11,09:34
|
|
@note:
|
|
*/
|
|
/*************************************************************/
|
|
#include "apple_dock/iAP.h"
|
|
#include "apple_dock/iAP2.h"
|
|
#include "apple_dock/iAP_device.h"
|
|
#include "apple_dock/iAP_iic.h"
|
|
/* #include "usb_global_var.h" */
|
|
/* #include "usb_driver.h" */
|
|
/* #include "usb_slave_scsi.h" */
|
|
#include "app_config.h"
|
|
#include "init.h"
|
|
|
|
#if TCFG_USB_APPLE_DOCK_EN
|
|
|
|
static void *iap_usb_hdl = NULL;
|
|
|
|
#if USB_MALLOC_ENABLE
|
|
#else
|
|
static u8 USB_IAP_SEND_BUF[0x400] SEC(.mass_storage) __attribute__((aligned(4)));
|
|
static u8 USB_IAP_RECV_BUF[0x200] SEC(.mass_storage) __attribute__((aligned(4)));
|
|
#endif
|
|
|
|
extern u8 MCU_SRAMToUSB_app(void *hdl, u8 *pBuf, u16 uCount);
|
|
extern u8 MCU_USBToSRAM_app(void *hdl, u8 *pBuf, u16 uCount);
|
|
|
|
|
|
static void iAP_ZLP(void)
|
|
{
|
|
delay(50000);
|
|
}
|
|
|
|
static u8 iAP_bulk_in_process(void)
|
|
{
|
|
//iAP_printf_buf(iAP_var_pTxBuf, iAP_var_wLength);
|
|
return MCU_SRAMToUSB_app(iap_usb_hdl, iAP_var_pTxBuf, iAP_var_wLength);
|
|
}
|
|
|
|
static u8 iAP_bulk_out_process(void)
|
|
{
|
|
u8 len;
|
|
|
|
len = MCU_USBToSRAM_app(iap_usb_hdl, iAP_var_pRxBuf, 0x200);
|
|
iAP_var_wLength = len;
|
|
/* iAP_printf_buf(iAP_var_pRxBuf, len); */
|
|
return len;
|
|
}
|
|
|
|
u8 iAP_transport(u8 type)
|
|
{
|
|
u8 res = TRUE;
|
|
if (type & BIT(IAP_TRANSPORT_ZLP)) {
|
|
iAP_ZLP();
|
|
}
|
|
if (type & BIT(IAP_TRANSPORT_IN)) {
|
|
res = iAP_bulk_in_process();
|
|
}
|
|
if (type & BIT(IAP_TRANSPORT_OUT)) {
|
|
u8 len = iAP_bulk_out_process();
|
|
if (type & BIT(IAP_TRANSPORT_OUT_LEN)) {
|
|
return len;
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
|
|
|
|
u8 apple_mfi_link(void *hdl)
|
|
{
|
|
u8 res;
|
|
|
|
if (MFI_CHIP_OFFLINE == chip_online_status) {
|
|
iAP_deg_str("mfi chip offline\n");
|
|
return NO_MFI_CHIP;
|
|
}
|
|
if (MFI_PROCESS_READY != mfi_pass_status) {
|
|
return mfi_pass_status;
|
|
}
|
|
|
|
iap_usb_hdl = hdl;
|
|
|
|
//Reset session Tx & Rx buffer
|
|
#if USB_MALLOC_ENABLE
|
|
if (iAP_var_pTxBuf == NULL) {
|
|
iAP_var_pTxBuf = malloc(0x400);
|
|
}
|
|
if (iAP_var_pRxBuf == NULL) {
|
|
iAP_var_pRxBuf = malloc(0x200);
|
|
}
|
|
#else
|
|
iAP_var_pTxBuf = USB_IAP_SEND_BUF;
|
|
iAP_var_pRxBuf = USB_IAP_RECV_BUF;
|
|
#endif
|
|
|
|
memset(iAP_var_pTxBuf, 0, 0x400);
|
|
memset(iAP_var_pRxBuf, 0, 0x200);
|
|
|
|
/*Detect iAP support protocol type*/
|
|
if (IAP2_VERSIONS == iAP_support()) {
|
|
iAP_deg_str("iAP2 support!\n");
|
|
/* iAP_deg_str("iap2"); */
|
|
/* os_time_dly(2); */
|
|
res = iAP2_link() + IAP2_LINK_ERR;
|
|
if (IAP2_LINK_SUCC == res) {
|
|
mfi_pass_status = MFI_PROCESS_PASS;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
return IAP2_LINK_ERR;
|
|
}
|
|
|
|
void apple_mfi_unlink(void)
|
|
{
|
|
#if USB_MALLOC_ENABLE
|
|
local_irq_disable();
|
|
if (iAP_var_pTxBuf) {
|
|
free(iAP_var_pTxBuf);
|
|
iAP_var_pTxBuf = NULL;
|
|
}
|
|
if (iAP_var_pRxBuf) {
|
|
free(iAP_var_pRxBuf);
|
|
iAP_var_pRxBuf = NULL;
|
|
}
|
|
local_irq_enable();
|
|
#endif
|
|
}
|
|
|
|
static int apple_dock_init(void)
|
|
{
|
|
apple_link_init();
|
|
apple_mfi_chip_online_check_api();
|
|
return 0;
|
|
}
|
|
early_initcall(apple_dock_init);
|
|
|
|
#endif /* TCFG_USB_APPLE_DOCK_EN */
|
|
|