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,56 @@
#ifndef __DEVICE_H__
#define __DEVICE_H__
#include "typedef.h"
#include "atomic.h"
#include "ioctl_cmds.h"
struct dev_node {
const char *name;
const struct device_operations *ops;
void *priv_data;
};
struct device {
atomic_t ref;
void *private_data;
const struct device_operations *ops;
void *platform_data;
void *driver_data;
};
struct device_operations {
int (*open)(struct dev_node *node, struct device **device, void *arg);
int (*read)(struct device *device, void *buf, u32 len, u32);
int (*ioctl)(struct device *device, u32 cmd, u32 arg);
int (*close)(struct device *device);
int (*write)(struct device *device, void *buf, u32 len, u32);
};
#define REGISTER_DEVICES(node) \
const struct dev_node node[] SEC_USED(.device)
void *dev_open(const char *name, void *arg);
int dev_read(void *device, void *buf, u32 len);
int dev_write(void *device, void *buf, u32 len);
int dev_ioctl(void *device, int cmd, u32 arg);
int dev_close(void *device);
int dev_bulk_read(void *_device, void *buf, u32 offset, u32 len);
int dev_bulk_write(void *_device, void *buf, u32 offset, u32 len);
void set_device_offset(u32 offset);
u32 get_device_offset(void);
#endif
@@ -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,89 @@
#ifndef IOCTL_INF_H
#define IOCTL_INF_H
#define IOCTL_SET_IRQ_NUM 1
#define IOCTL_SET_PRIORITY 2
#define IOCTL_SET_DATA_WIDTH 3
#define IOCTL_SET_SPEED 4
#define IOCTL_SET_DETECT_MODE 5
#define IOCTL_SET_DETECT_FUNC 6
#define IOCTL_SET_DETECT_TIME_INTERVAL 7
#define IOCTL_SET_PORT 8
#define IOCTL_SET_PORT_FUNC 9
#define IOCTL_SET_CS_PORT_FUNC 10
#define IOCTL_SET_READ_MODE 11
#define IOCTL_SET_WRITE_MODE 12
#define IOCTL_SET_WRITE_PROTECT 13
#define IOCTL_SET_START_BIT 14
#define IOCTL_SET_STOP_BIT 15
#define IOCTL_FLUSH 16
#define IOCTL_REGISTER_IRQ_HANDLER 17
#define IOCTL_UNREGISTER_IRQ_HANDLER 18
#define IOCTL_GET_SYS_TIME 19
#define IOCTL_SET_SYS_TIME 20
#define IOCTL_GET_ALARM 21
#define IOCTL_SET_ALARM 22
#define IOCTL_SET_CAP_LOWSPEED_CARD 23
#define IOCTL_SET_VDD50_EN 30
#define IOCTL_GET_WEEKDAY 32
#define IOCTL_CLR_READ_MODE 33
#define IOCTL_SET_READ_CRC 34
#define IOCTL_GET_READ_CRC 35
#define IOCTL_GET_VOLUME 36
#define IOCTL_SET_VOLUME 37
#define IOCTL_SET_ALARM_ENABLE 38
#define IOCTL_CMD_RESUME 39
#define IOCTL_CMD_SUSPEND 40
#define IOCTL_SET_BASE_ADDR 41
#define IOCTL_SET_ASYNC_MODE 42
#define IOCTL_GET_SPEED 43
#define IOCTL_SET_ACTIVE_STATUS 44
#define IOCTL_POWER_RESUME 45
#define IOCTL_POWER_SUSPEND 46
#define IOCTL_CFG_NORFLASH_WPS 60
#define IOCTL_SET_NORFLASH_WPS_ADDR 61
#define IOCTL_GET_PAGE_SIZE 99
#define IOCTL_GET_ID 100
#define IOCTL_GET_SECTOR_SIZE 101
#define IOCTL_GET_BLOCK_SIZE 102
#define IOCTL_GET_CAPACITY 103
#define IOCTL_GET_WIDTH 104
#define IOCTL_GET_HEIGHT 105
#define IOCTL_GET_BLOCK_NUMBER 106
#define IOCTL_CHECK_WRITE_PROTECT 107
#define IOCTL_GET_STATUS 108
#define IOCTL_GET_TYPE 109
#define IOCTL_GET_MAX_LUN 110
#define IOCTL_GET_CUR_LUN 111
#define IOCTL_SET_CUR_LUN 112
#define IOCTL_SET_FORCE_RESET 113
#define IOCTL_SET_CAPACITY 114
#define IOCTL_SET_POWER 115
#define IOCTL_SET_NAND_PARAM 116
#define IOCTL_READ_FLASH_UUID 120
#define IOCTL_GET_FLASH_ERASE_SIZE 121
#define IOCTL_WRITE_MCA_TO_FLASH 122
#define IOCTL_READ_MCA_FROM_FLASH 123
#define IOCTL_SET_SFC_BASE 124
#define IOCTL_ERASE_SECTOR 200
#define IOCTL_ERASE_BLOCK 201
#define IOCTL_ERASE_CHIP 202
#define IOCTL_SET_ENC_END 203
#define IOCTL_ERASE_PAGE 204
#define IOCTL_SET_FTL_UNINIT 205
#define IOCTL_SET_DATA_CALLBACK 301
#define IOCTL_GET_PART_INFO 320
#endif
@@ -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