This commit is contained in:
huxi
2025-12-03 11:12:34 +08:00
parent c23ae4f24c
commit bc195654bf
8163 changed files with 3799544 additions and 92 deletions
@@ -0,0 +1,44 @@
//设备错误代码:
typedef enum dev_err {
DEV_ERR_NONE = 0,
DEV_ERR_NOT_MOUNT,
DEV_ERR_OVER_CAPACITY,
DEV_ERR_UNKNOW_CLASS,
DEV_ERR_NOT_READY,//设备已经在线,但是没初始化完成
DEV_ERR_LUN,
DEV_ERR_TIMEOUT,
DEV_ERR_CMD_TIMEOUT,
DEV_ERR_READ_TIMEOUT,//0x08
DEV_ERR_WRITE_TIMEOUT,
DEV_ERR_OFFLINE,//0x0a
DEV_ERR_CRC,
DEV_ERR_CMD_CRC,
DEV_ERR_READ_CRC,
DEV_ERR_WRITE_CRC,
DEV_ERR_CONTROL_STALL,
DEV_ERR_RXSTALL,//0x10
DEV_ERR_TXSTALL,
DEV_ERR_CONTROL,
DEV_ERR_NOT_STORAGE,
DEV_ERR_INVALID_PATH,
DEV_ERR_INVALID_DATA,
DEV_ERR_OUTOFMEMORY,
DEV_ERR_HANDLE_FREE,
DEV_ERR_INVALID_HANDLE,//24
DEV_ERR_INVALID_BUF,
DEV_ERR_INUSE,
DEV_ERR_NO_READ,
DEV_ERR_NO_WRITE,
DEV_ERR_NO_IOCTL,
DEV_ERR_NO_POWER,
DEV_ERR_NOT_EXIST,
DEV_ERR_UNKNOW,
} DEV_ERR;
@@ -0,0 +1,264 @@
#ifndef __NORFLASH_H__
#define __NORFLASH_H__
#include "typedef.h"
//spi_width:
#define SPI_MODE_UNIDIR_1BIT 0//半双工,do分时发送/接收
#define SPI_MODE_BIDIR_1BIT 1//全双工,di接收,do发送
#define SPI_MODE_UNIDIR_2BIT 2//半双工,di & do共2bit分时发送/接收
#define SPI_MODE_UNIDIR_4BIT 4//半双工,di & do & wp & hold 共4bit分时发送/接收
#define WINBOND_WRITE_ENABLE 0x06
#define WINBOND_WRITE_SR_ENABLE 0x50
#define WINBOND_JEDEC_ID 0x9F
#define WINBOND_UUID 0x4B
#define WINBOND_READ_SR1 0x05
#define WINBOND_READ_SR2 0x35
#define WINBOND_READ_SR3 0x15
#define WINBOND_WRITE_SR1 0x01
#define WINBOND_WRITE_SR2 0x31
#define WINBOND_WRITE_SR3 0x11
#define WINBOND_FAST_READ 0x0B
#define WINBOND_FAST_READ_DUAL_OUTPUT 0x3B
#define WINBOND_FAST_READ_QUAD_OUTPUT 0x6B
#define WINBOND_FAST_READ_DUAL_IO 0xBB
#define WINBOND_FAST_READ_QUAD_IO 0xEB
#define WINBOND_CONTINUOUS_READ_NORMAL_MODE 0x00
#define WINBOND_CONTINUOUS_READ_ENHANCE_MODE 0x20
#define WINBOND_PAGE_PROGRAM 0x02
#define WINBOND_PAGE_ERASE 0x81
#define WINBOND_SECTOR_ERASE 0x20
#define WINBOND_BLOCK_ERASE 0xD8
#define WINBOND_CHIP_ERASE 0xC7
#define WINBOND_POWER_DOWN 0xB9
#define WINBOND_RELEASE 0xAB
struct flash_info_t {
u8 uuid[16];
u32 id;
u32 capacity;
};
struct flash_wp_arg {
u32 id;
u8 split_mode: 1; //0 连续写,1,分开写
u8 write_en_use_50h: 1; //0:06H 1:50H
u8 res: 2;
u8 numOfwp_array: 4; //写保护参数的个数
struct {
u8 sr1;
u8 sr2;
u16 wp_addr; //写保护结束地址,单位K
} wp_array[15];
} __attribute__((packed));
struct custom_data_t {
u16 u16crc;
u16 len;
u8 otp_mode;//0xa0:flash_mode 0xa1:otp mode
union {
struct {
u8 wr_sr_cmd[2];//寄存器的写命令,当两个命令是一样的,就使用连续写模式
u8 otp_lock_sr1;
u8 otp_lock_sr1_mask;//mask ==0 就忽略此寄存器
u8 otp_lock_sr2;
u8 otp_lock_sr2_mask;//mask ==0 就忽略此寄存器
u16 otp_page_num;
u16 otp_page_size;
u32 otp_offset[5];
} __attribute__((packed)) otp_info;
u8 user_info_data[59];
} __attribute__((packed)) u;
} __attribute__((packed));
struct spi_platform_data {
u8 spi_idx;
u8 width;
u8 clk_div;
u8 port;
u8 cs_port;
u8 clk_port;
u8 do_port;
u8 di_port;
u8 d2_port;
u8 d3_port;
};
enum DEV_FLASH_TYPE {
DEV_FLASH_INTERNAL_NORFLASH,
DEV_FLASH_EXTERNAL_NORFLASH,
DEV_FLASH_NANDFLASH,
DEV_FLASH_NANDFLASH_FTL,
};
struct flash_platform_data {
enum DEV_FLASH_TYPE flash_type;
u8 read_mode;
u8 power_io;
u8 power_io_level;
u8 power_ldo_io;
u8 power_ldo_io_level;
u8 qe_position;
struct spi_platform_data spi_pdata;
};
struct flash_info_t *get_flash_info(void);
void flash_poweron_base(u32 port, u32 out0_time, u32 poweron_time, void (*custom_udelay)(u32), void (*custom_mdelay)(u32));
void flash_poweroff_base(u32 port, u32 out0_time, u32 discharge_time, void (*custom_udelay)(u32), void (*custom_mdelay)(u32));
u8 get_flash_is4byte_mode(void);
u32 get_flash_capacity(void);
u32 norflash_get_id(void);
void norflash_get_uuid(u8 *buffer);
u16 norflash_cmd_custom(void);
void norflash_read_status_reg(u8 *status_reg1, u8 *status_reg2);
u8 norflash_spi_write_sr_reg(u8 reg1, u8 reg2) ;
int norflash_write_protect(u8 sr_mode, u8 wr_en_mode, u32 sr1, u32 sr2);
int norflash_write_protect_config(u32 addr, const struct flash_wp_arg *p);
#define TZFLASH_STA_NUM 4
struct flash_reg {
u8 cmd[4];
u8 sr_value[4];
u8 sr_mask[4];
u8 num_of_reg: 2;
u8 wr_en_mode: 1;
u8 continue_mode: 4;
u8 rev: 1;
};
struct flash_func_len {
u16 all_len;
u8 version;
u8 func_len;//lb
u8 sta_len;//lb
u8 func_otp;//lb
u8 func_dtr;
u8 func_wp;//bp,tb,sec,cmp
u8 func_wps;
u8 func_wps_op;
u8 func_qe;
u8 func_srp;
u8 func_sus;
u8 func_dc;
u8 func_drv;
u8 func_mpm;//dp
u8 func_qpi;
u8 func_init;
u8 func_read_continue;
} __attribute__((packed));
#define TZFLASH_STA_NUM 4
struct flash_sta_cmd {
u8 sta_cmd_r[TZFLASH_STA_NUM];
u8 sta_cmd_w[TZFLASH_STA_NUM];
} __attribute__((packed));
#define FLASH_SUPPORT_MPM_FUNC 0
struct flash_dev_sta_info {
struct flash_func_len func_cfg;
struct flash_sta_cmd sta_cfg;
u8 *cfg_ptr;
};
struct flash_otp_cfg {//flash otp信息
u32 otp_offset[5];//otp page的偏移地址组数
u16 otp_page_size;//otp的page大小
u8 otp_NumberOfpage;//otp的page数量
// struct flash_reg lock_cfg[2];//read,write
u8 wr_en_cmd;//0x50h:sr,0x06h:wr_en
u8 sr_mask[TZFLASH_STA_NUM];
u8 sr_value[TZFLASH_STA_NUM];//注意:锁定后不可擦写,sr的值也常是1
} __attribute__((packed));
struct flash_wps_cfg {//flash wps信息
u8 wr_en_cmd;//0x50h:sr,0x06h:wr_en
u8 sr_mask[TZFLASH_STA_NUM];
u8 sr_value[TZFLASH_STA_NUM];
// struct flash_reg r_reg_cfg;//read
// struct flash_reg w_reg_cfg;//write
} __attribute__((packed));
struct flash_wp_cfg { //写保护配置信息
u8 numOfwp_array;//写保护参数的个数
u8 wr_en_cmd;//0x50h:sr,06h:
u8 sr_mask[TZFLASH_STA_NUM]; //sr要保留或修改的bit
struct {
u8 sr_value[TZFLASH_STA_NUM]; //写保护sr取值
u16 wp_addr;//写保护结束地址,单位K
} wp_array[0]; //写保护的组数,修改可变长
} __attribute__((packed));
struct flash_dtr_cfg {
s8 x1_dummy;//-1:使用默认值
s8 x2_dummy;//-1:使用默认值
s8 x4_dummy;//-1:使用默认值,-2:不支持
} __attribute__((packed));
struct flash_reg_param {
int reg_mask;//需配置的reg映射
u8 sr_mask[TZFLASH_STA_NUM];
u8 sr_value[TZFLASH_STA_NUM];
u8 wr_en_cmd;//0x50h:sr,0x06h:wr_en
};
struct wps_addr_info {
u8 lock_en;
u32 wp_saddr;
u32 wp_eaddr;
};
int norflash_cfg_wpl(struct flash_wps_cfg *cfg);
int norflash_set_wps_addr(u8 lock, u32 saddr, u32 eaddr);
int norflash_params_v3_wp(u32 wp_addr, int index, struct flash_wp_cfg *cfg);
int norflash_get_flash_v3_wp_func_value(u8 *cfg_buf);
int norflash_get_flash_v3_dtr_func_value(u8 *cfg_buf);
void norflash_exit_continue_mode(void);
#ifdef __SFC_DTR
void __dtr_norflash_exit_continue_mode(void);
#endif
int norflash_read(u8 *buf, u32 addr, u32 len);
int norflash_write(u8 *buf, u32 addr, u32 len);
int norflash_write_async(u8 *buf, u32 offset, u32 len);
u8 norflash_eraser(u32 eraser_cmd, u32 addr);
u8 norflash_read_otp_lb(void);
u32 norflash_erase_otp(u32 page);
u32 norflash_write_otp(u8 *buffer, u32 len, u32 page, u32 offset);
void norflash_read_otp(u8 *buffer, u32 len, u32 page, u32 offset);
void norflash_read_otp_page(u8 *buffer, u32 len, u32 addr);
#ifdef BFLT_AUTH_BURN
u32 bflt_norflash_read_otp(u8 *buffer, u32 len, u32 offset) ;
u32 bflt_norflash_write_otp(u8 *buffer, u32 len, u32 offset) ;
u32 bflt_norflash_erase_otp(u32 offset) ;
u32 norflash_otp_lock(u8 *custom) ;
#endif
void norflash_enter_powerdown(void);
void norflash_powerdown_release(u32 delay);
void norflash_soft_reset(u32 delay);
void norflash_init(struct flash_platform_data *pdata);
void norflash_read_bt_mac(u8 *mac);
int norflash_ioctl(u32 cmd, u32 arg);
void norflash_select_device(u32 index, u32 port);
u8 P25QXXH_flash_close_quad_page_mode();
extern const struct device_operations norflash_dev_ops;
#endif