229 lines
6.2 KiB
C
229 lines
6.2 KiB
C
#include "apple_dock/iAP_iic.h"
|
|
#include "apple_dock/iAP.h"
|
|
#include "asm/iic_hw.h"
|
|
#include "asm/iic_soft.h"
|
|
#include "app_config.h"
|
|
|
|
#if TCFG_USB_APPLE_DOCK_EN
|
|
|
|
#if 0
|
|
static hw_iic_dev iic = 0;
|
|
#define iic_init() hw_iic_init(iic)
|
|
#define iic_uninit() hw_iic_uninit(iic)
|
|
#define iic_start() hw_iic_start(iic)
|
|
#define iic_stop() hw_iic_stop(iic)
|
|
#define iic_sendbyte(byte) hw_iic_tx_byte(iic, byte)
|
|
#define iic_revbyte(ack) hw_iic_rx_byte(iic, ack)
|
|
#else
|
|
static soft_iic_dev iic = 0;
|
|
#define iic_init() soft_iic_init(iic)
|
|
#define iic_uninit() soft_iic_uninit(iic)
|
|
#define iic_start() soft_iic_start(iic)
|
|
#define iic_stop() soft_iic_stop(iic)
|
|
#define iic_sendbyte(byte) soft_iic_tx_byte(iic, byte)
|
|
#define iic_revbyte(ack) soft_iic_rx_byte(iic, ack)
|
|
#endif
|
|
|
|
|
|
|
|
#define IIC_START_BIT BIT(0)
|
|
#define IIC_STOP_BIT BIT(1)
|
|
#define IIC_ACK_BIT BIT(2)
|
|
|
|
u8 iic_wbyte(u8 st, u8 dat)
|
|
{
|
|
bool ack_var = 0;
|
|
if (st & IIC_START_BIT) {
|
|
iic_start();
|
|
}
|
|
ack_var = iic_sendbyte(dat);
|
|
if (st & IIC_STOP_BIT) {
|
|
iic_stop();
|
|
}
|
|
/* printf("a=%d,",ack_var); */
|
|
/* return ack_var ? 1 : 0; */
|
|
return ack_var ? 0 : 1;
|
|
}
|
|
|
|
u8 iic_rbyte(u8 st)
|
|
{
|
|
u8 iic_dat = 0;
|
|
if (st & IIC_START_BIT) {
|
|
iic_start();
|
|
}
|
|
/* iic_dat = iic_revbyte(st & IIC_ACK_BIT); */
|
|
iic_dat = iic_revbyte(!(st & IIC_ACK_BIT));
|
|
if (st & IIC_STOP_BIT) {
|
|
iic_stop();
|
|
}
|
|
/* printf("d=0x%x,",iic_dat); */
|
|
return iic_dat;
|
|
}
|
|
|
|
static void iic_start_addr(u8 addr)
|
|
{
|
|
u8 cnt = 0xff;
|
|
while (--cnt) {
|
|
if (iic_wbyte(IIC_START_BIT, addr)) {
|
|
delay(200);
|
|
continue;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void iAP_iic_write(u8 iic_addr, u8 iic_dat)
|
|
{
|
|
/* iic_write_byte(WRITE_ADDR, iic_addr, iic_dat); */
|
|
iic_start_addr(WRITE_ADDR); //Send the I2C write address of the CP
|
|
iic_wbyte(0, iic_addr); //
|
|
iic_wbyte(IIC_STOP_BIT, iic_dat); //
|
|
}
|
|
|
|
void iAP_iic_writen(u8 iic_addr, u8 *iic_dat, u8 len)
|
|
{
|
|
/* iic_write_buf(WRITE_ADDR, iic_addr, iic_dat, len); */
|
|
iic_start_addr(WRITE_ADDR); //Send the I2C write address of the CP
|
|
iic_wbyte(0, iic_addr); //
|
|
|
|
//deg_string("\niic_dat=");
|
|
for (; len > 1; len--) {
|
|
//iap_put_u8hex(*iic_dat);
|
|
iic_wbyte(0, *iic_dat++); //写数据
|
|
}
|
|
iic_wbyte(IIC_STOP_BIT, *iic_dat); //写数据
|
|
}
|
|
|
|
u8 iAP_iic_read(u8 iic_addr)
|
|
{
|
|
/* return iic_read_byte(WRITE_ADDR, READ_ADDR, iic_addr); */
|
|
u8 iic_dat;
|
|
|
|
iic_start_addr(WRITE_ADDR); //Send the I2C write address of the CP
|
|
iic_wbyte(IIC_STOP_BIT, iic_addr); //
|
|
iic_start_addr(READ_ADDR); //Send the I2C read address of the CP
|
|
iic_dat = iic_rbyte(IIC_STOP_BIT | IIC_ACK_BIT); //
|
|
return iic_dat;
|
|
}
|
|
|
|
void iAP_iic_readn(u8 iic_addr, u8 *iic_dat, u8 len)
|
|
{
|
|
/* iic_read_buf(WRITE_ADDR, READ_ADDR, iic_addr, iic_dat, len); */
|
|
iic_start_addr(WRITE_ADDR); //Send the I2C write address of the CP
|
|
iic_wbyte(IIC_STOP_BIT, iic_addr); //
|
|
iic_start_addr(READ_ADDR); //Send the I2C read address of the CP
|
|
|
|
/* delay8(20); */
|
|
|
|
for (; len > 1; len--) {
|
|
*iic_dat++ = iic_rbyte(0); //
|
|
}
|
|
*iic_dat = iic_rbyte(IIC_STOP_BIT | IIC_ACK_BIT); //
|
|
|
|
#if (IAP_CRACK_CHIP==IAP_CRACK_CP30)
|
|
if (iic_addr == CHALLENGE_DATA_LENGTH) {
|
|
*iic_dat = 32;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
//Authentication Coprocessor 2.0C register map
|
|
#define VALUE_DEVICE_VERSION 0x05
|
|
#define VALUE_FIRMWARE_VERSION 0x01
|
|
#define VALUE_AUTHENTICATION_PROTOCOL_MAJOR_VERSION 0x02
|
|
#define VALUE_AUTHENTICATION_PROTOCOL_MINOR_VERSION 0x00
|
|
#define VALUE_DEVICE_IDL 0x0000
|
|
#define VALUE_DEVICE_IDH 0x0002
|
|
|
|
#define DEVICE_ID_SIZE 4
|
|
|
|
u8 iap_iic_id[4];
|
|
const u8 iap_iic_chip_id[4] = {
|
|
#if (IAP_CRACK_CHIP==IAP_CRACK_CP30)
|
|
0x00, 0x00, 0x03, 0x00
|
|
#else
|
|
0x00, 0x00, 0x02, 0x00
|
|
#endif
|
|
};
|
|
|
|
u8 apple_mfi_chip_online_check_api(void)
|
|
{
|
|
iic_init();
|
|
os_time_dly(2);
|
|
|
|
chip_online_status = MFI_CHIP_OFFLINE;
|
|
|
|
#if 0
|
|
if (VALUE_DEVICE_VERSION != iAP_iic_read(ADDR_DEVICE_VERSION)) {
|
|
return MFI_DV_ERROR;
|
|
}
|
|
if (VALUE_FIRMWARE_VERSION != iAP_iic_read(ADDR_FIRMWARE_VERSION)) {
|
|
return MFI_FV_ERROR;
|
|
}
|
|
if (VALUE_AUTHENTICATION_PROTOCOL_MAJOR_VERSION != iAP_iic_read(ADDR_AUTHENTICATION_PROTOCOL_MAJOR_VERSION)) {
|
|
return MFI_AP_MAJOR_V_ERROR;
|
|
}
|
|
if (VALUE_AUTHENTICATION_PROTOCOL_MINOR_VERSION != iAP_iic_read(ADDR_AUTHENTICATION_PROTOCOL_MINOR_VERSION)) {
|
|
return MFI_AP_MINOR_V_ERROR;
|
|
}
|
|
#endif
|
|
#if 0
|
|
u16 id_l, id_h;
|
|
my_memset(iap_iic_id, 0, sizeof(iap_iic_id));
|
|
iAP_iic_readn(ADDR_DEVICE_ID, (u8 *)(iap_iic_id), DEVICE_ID_SIZE);
|
|
/* id = SW32(id); */
|
|
|
|
id_l = iap_iic_id[1];
|
|
id_l = (id_l << 8) | iap_iic_id[0];
|
|
id_h = iap_iic_id[3];
|
|
id_h = (id_h << 8) | iap_iic_id[2];
|
|
|
|
iAP_put_u16hex(id_l);
|
|
iAP_put_u16hex(id_h);
|
|
|
|
if ((VALUE_DEVICE_IDL != id_l) || (VALUE_DEVICE_IDH != id_h)) {
|
|
/* iAP_deg_puts("-err-"); */
|
|
return MFI_DEVICE_ID_ERROR;
|
|
} else {
|
|
/* iAP_deg_puts("-ok-"); */
|
|
/* iAP_printf_buf((u8 *)id, 4); */
|
|
}
|
|
#else
|
|
__gain:
|
|
memset(iap_iic_id, 0, sizeof(iap_iic_id));
|
|
iAP_iic_readn(ADDR_DEVICE_ID, (u8 *)(iap_iic_id), DEVICE_ID_SIZE);
|
|
/* id = SW32(id); */
|
|
|
|
printf("-iap id \n");
|
|
put_buf(iap_iic_id, sizeof(iap_iic_id));
|
|
put_buf((u8 *)iap_iic_chip_id, sizeof(iap_iic_chip_id));
|
|
printf("cmp=0x%x \n", memcmp(iap_iic_id, (u8 *)iap_iic_chip_id, 4));
|
|
/* if ((iap_iic_id[0] != 0x00) */
|
|
/* || (iap_iic_id[1] != 0x00) */
|
|
/* || (iap_iic_id[2] != 0x02) */
|
|
/* || (iap_iic_id[3] != 0x00) */
|
|
/* ) { */
|
|
if (memcmp(iap_iic_id, (u8 *)iap_iic_chip_id, 4)) {
|
|
/* iAP_deg_puts("-err-"); */
|
|
printf("--err \n");
|
|
os_time_dly(1);
|
|
/* goto __gain; */
|
|
return MFI_DEVICE_ID_ERROR;
|
|
} else {
|
|
printf("--ok \n");
|
|
/* iAP_deg_puts("-ok-"); */
|
|
/* iAP_printf_buf((u8 *)id, 4); */
|
|
}
|
|
#endif
|
|
|
|
chip_online_status = MFI_CHIP_ONLINE;
|
|
|
|
return MFI_CHIP_ONLINE;
|
|
}
|
|
|
|
#endif /* TCFG_USB_APPLE_DOCK_EN */
|
|
|