初版
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user