Squashed backup commit (no shallow-clone history issues) of xiaomi-mt6833-dev/kernel_xiaomi_mt6833 (lineage-23.2 branch, upstream commit 9eece662e) plus all fixes applied to get everpal_defconfig building clean against a modern (GCC 15.2.0) toolchain -- see the previous commit message on the lineage-23.2 branch (also in this repo history is not available here since this is a squashed snapshot; full incremental history lives in the local DL380 checkout and the upstream GitHub remote). Upstream: https://github.com/xiaomi-mt6833-dev/kernel_xiaomi_mt6833 (lineage-23.2)
121 lines
4.3 KiB
C
121 lines
4.3 KiB
C
// DS28E16.h - Include file for DS28E16/DS28E50?
|
|
//
|
|
#ifndef __DS28E16_H__
|
|
#define __DS28E16_H__
|
|
|
|
#define ERROR_NO_DEVICE -1
|
|
#define ERROR_R_STATUS -2
|
|
#define ERROR_R_ROMID -3
|
|
#define ERROR_R_PAGEDATA -4
|
|
#define ERROR_COMPUTE_MAC -5
|
|
#define ERROR_S_SECRET -6
|
|
#define ERROR_UNMATCH_MAC -7
|
|
#define DS_TRUE 1
|
|
#define DS_FALSE 0
|
|
|
|
#define CMD_RELEASE_BYTE 0xAA
|
|
// 1-wire ROM commands
|
|
#define CMD_SEARCH_ROM 0xF0
|
|
#define CMD_READ_ROM 0x33
|
|
#define CMD_MATCH_ROM 0x55
|
|
#define CMD_SKIP_ROM 0xCC
|
|
#define CMD_RESUME_ROM 0xA5
|
|
|
|
// DS28E16 commands
|
|
#define CMD_START 0x66
|
|
#define CMD_WRITE_MEM 0x96
|
|
#define CMD_READ_MEM 0x44
|
|
#define CMD_READ_STATUS 0xAA
|
|
#define CMD_SET_PAGE_PROT 0xC3
|
|
#define CMD_COMP_READ_AUTH 0xA5
|
|
#define CMD_COMP_S_SECRET 0x3C
|
|
#define CMD_DECREMENT_CNT 0xC9
|
|
#define CMD_DISABLE_DEVICE 0x33
|
|
|
|
#define CMD_READ_RNG 0xD2
|
|
|
|
// Result bytes
|
|
#define RESULT_SUCCESS 0xAA
|
|
#define RESULT_FAIL_PROTECTION 0x55
|
|
#define RESULT_FAIL_PARAMETETER 0x77
|
|
#define RESULT_FAIL_DEVICEDISABLED 0x88
|
|
#define RESULT_FAIL_COUNTERINVALID 0x22
|
|
#define RESULT_FAIL_COUNTERNOSET 0x33
|
|
#define RESULT_FAIL_SEQUENCEWRONG 0x00
|
|
#define RESULT_FAIL_NONE 0xFF
|
|
|
|
// Delays
|
|
#define DELAY_DS28E16_EE_WRITE 100
|
|
#define DELAY_DS28E16_EE_READ 50
|
|
#define DELAY_DS28E16_RNG_READ 40
|
|
#define DELAY_DS28E16_ENC_READ 40
|
|
|
|
// DS28E16
|
|
#define PROT_RP 0x01
|
|
#define PROT_WP 0x02
|
|
#define PROT_WP_RP 0x03
|
|
#define PROT_DC 0x08
|
|
|
|
// page number
|
|
#define PAGE0 0x00
|
|
#define PAGE1 0x01
|
|
#define DC_PAGE 0x02
|
|
#define SECRET_PAGE 0x03
|
|
#define MAX_PAGENUM 0x04
|
|
|
|
#define ANONYMOUS 1
|
|
|
|
//retry times config
|
|
#define SET_SRAM_RETRY 4
|
|
#define GET_USER_MEMORY_RETRY 8
|
|
#define GET_PERSONALITY_RETRY 8
|
|
#define GET_ROM_ID_RETRY 8
|
|
#define GET_BLOCK_STATUS_RETRY 8
|
|
#define SET_BLOCK_STATUS_RETRY 8
|
|
#define GET_MAC_RETRY 8
|
|
#define GET_VERIFY_RETRY 8
|
|
#define GET_S_SECRET_RETRY 4
|
|
|
|
// xiaomi's battery identity
|
|
#define FAMILY_CODE 0x9f
|
|
#define CUSTOM_ID_MSB 0x04
|
|
#define CUSTOM_ID_LSB 0xF0
|
|
|
|
#define DC_INIT_VALUE 0x1FFFF
|
|
|
|
#define CURRENT_DS28E16_TASK 0
|
|
|
|
extern unsigned char last_result_byte;
|
|
|
|
// Command functions
|
|
// 1-Wire ROMID commands
|
|
unsigned char crc_low_first(unsigned char *ptr, unsigned char len);
|
|
short Read_RomID(unsigned char *RomID);
|
|
|
|
// Common Functions
|
|
unsigned short docrc16(unsigned short data);
|
|
int DS28E16_standard_cmd_flow(unsigned char *write_buf, int delay_ms, unsigned char *read_buf, int *read_len, int write_len);
|
|
|
|
// Command Functions (no high level verification)
|
|
int DS28E16_cmd_readStatus(unsigned char *data); // 读入芯片的页面保护属性、一个MAN_ID字节和一个芯片版本字节,合计6个字节
|
|
int DS28E16_cmd_readMemory(int pg, unsigned char *data); // pg=0,1,2页面,一次读入32个字节,前16个字节为有效数据,后续16个字节固定为0x00或0xFF
|
|
int DS28E16_cmd_writeMemory(int pg, unsigned char *data); // pg=0,1,2页面,一次必须完整写入16个字节
|
|
int DS28E16_cmd_decrementCounter(void); // 执行此函数,完成17位计数器减1操作
|
|
int DS28E16_cmd_setPageProtection(int pg, unsigned char prot); // 设置芯片的页面属性
|
|
int DS28E16_cmd_device_disable(int op, unsigned char *password);// 芯片自毁,不能恢复
|
|
int DS28E16_cmd_computeReadPageAuthentication(int anon, int pg, unsigned char *challenge, unsigned char *hmac); // 器件基于会话密码、随机数、页面数据和ROMID,返回器件的算法结果
|
|
int DS28E16_cmd_computeS_Secret(int anon, int bdconst, int pg, unsigned char *partial); // 基于主机发送的密钥种子,器件在内部计算出会话密码
|
|
|
|
// host functions
|
|
int AuthenticateDS28E16(int anon, int bdconst, int S_Secret_PageNum, int PageNum, unsigned char *Challenge, unsigned char *Secret_Seeds, unsigned char *S_Secret);
|
|
|
|
// retry interface
|
|
static int ds28el16_Read_RomID_retry(unsigned char *RomID);
|
|
static int ds28el16_get_page_status_retry(unsigned char *data);
|
|
static int DS28E16_cmd_computeS_Secret_retry(int anon, int bdconst,
|
|
int pg, unsigned char *session_seed);
|
|
static int DS28E16_cmd_computeReadPageAuthentication_retry(int anon, int pg,
|
|
unsigned char *challenge, unsigned char *hmac);
|
|
static int ds28el16_get_page_data_retry(int page, unsigned char *data);
|
|
#endif
|