KT24-1110_65E-HA-651B/apps/common/iap/iAP_iic.c

229 lines
6.2 KiB
C
Raw Permalink Normal View History

2024-11-10 10:44:17 +00:00
#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 */