unsik Kim <donari75@gmail.com> - mflash support
[fw/openocd] / src / flash / mflash.h
1 /***************************************************************************\r
2  *   Copyright (C) 2007-2008 by unsik Kim <donari75@gmail.com>             *\r
3  *                                                                         *\r
4  *   This program is free software; you can redistribute it and/or modify  *\r
5  *   it under the terms of the GNU General Public License as published by  *\r
6  *   the Free Software Foundation; either version 2 of the License, or     *\r
7  *   (at your option) any later version.                                   *\r
8  *                                                                         *\r
9  *   This program is distributed in the hope that it will be useful,       *\r
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
12  *   GNU General Public License for more details.                          *\r
13  *                                                                         *\r
14  *   You should have received a copy of the GNU General Public License     *\r
15  *   along with this program; if not, write to the                         *\r
16  *   Free Software Foundation, Inc.,                                       *\r
17  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
18  ***************************************************************************/\r
19 \r
20 #ifndef _MFLASH_H\r
21 #define _MFLASH_H\r
22 \r
23 typedef unsigned long mg_io_uint32;\r
24 typedef unsigned short mg_io_uint16;\r
25 typedef unsigned char mg_io_uint8;\r
26 \r
27 typedef struct mflash_gpio_num_s\r
28 {\r
29         char port[2];\r
30         signed short num;\r
31 } mflash_gpio_num_t;\r
32 \r
33 typedef struct mflash_gpio_drv_s\r
34 {\r
35         char *name;\r
36         int (*set_gpio_to_output) (mflash_gpio_num_t gpio);\r
37         int (*set_gpio_output_val) (mflash_gpio_num_t gpio, u8 val);\r
38 } mflash_gpio_drv_t;\r
39 \r
40 typedef struct _mg_io_type_drv_info {\r
41 \r
42     mg_io_uint16 general_configuration;            // 00\r
43     mg_io_uint16 number_of_cylinders;               // 01\r
44     mg_io_uint16 reserved1;                       // 02\r
45     mg_io_uint16 number_of_heads;                   // 03\r
46     mg_io_uint16 unformatted_bytes_per_track;        // 04\r
47     mg_io_uint16 unformatted_bytes_per_sector;       // 05\r
48     mg_io_uint16 sectors_per_track;                 // 06\r
49     mg_io_uint8  vendor_unique1[6];                // 07/08/09\r
50 \r
51     mg_io_uint8  serial_number[20];                // 10~19\r
52 \r
53     mg_io_uint16 buffer_type;                      // 20\r
54     mg_io_uint16 buffer_sector_size;                // 21\r
55     mg_io_uint16 number_of_ecc_bytes;                // 22\r
56 \r
57     mg_io_uint8  firmware_revision[8];             // 23~26\r
58     mg_io_uint8  model_number[40];                 // 27\r
59 \r
60     mg_io_uint8  maximum_block_transfer;            // 47 low byte\r
61     mg_io_uint8  vendor_unique2;                   // 47 high byte\r
62     mg_io_uint16 dword_io;                    // 48\r
63 \r
64     mg_io_uint16 capabilities;                    // 49\r
65     mg_io_uint16 reserved2;                       // 50\r
66 \r
67     mg_io_uint8  vendor_unique3;                   // 51 low byte\r
68     mg_io_uint8  pio_cycle_timing_mode;              // 51 high byte\r
69     mg_io_uint8  vendor_unique4;                   // 52 low byte\r
70     mg_io_uint8  dma_cycle_timing_mode;              // 52 high byte\r
71     mg_io_uint16 translation_fields_valid;          // 53 (low bit)\r
72     mg_io_uint16 number_of_current_cylinders;        // 54\r
73     mg_io_uint16 number_of_current_heads;            // 55\r
74     mg_io_uint16 current_sectors_per_track;          // 56\r
75     mg_io_uint16 current_sector_capacity_lo;      // 57 & 58\r
76     mg_io_uint16 current_sector_capacity_hi;     // 57 & 58\r
77     mg_io_uint8  multi_sector_count;                // 59 low\r
78     mg_io_uint8  multi_sector_setting_valid;         // 59 high (low bit)\r
79 \r
80     mg_io_uint16 total_user_addressable_sectors_lo;     // 60 & 61\r
81     mg_io_uint16 total_user_addressable_sectors_hi;     // 60 & 61\r
82 \r
83     mg_io_uint8  single_dma_modes_supported;         // 62 low byte\r
84     mg_io_uint8  single_dma_transfer_active;         // 62 high byte\r
85     mg_io_uint8  multi_dma_modes_supported;          // 63 low byte\r
86     mg_io_uint8  multi_dma_transfer_active;          // 63 high byte\r
87     mg_io_uint16 adv_pio_mode;\r
88     mg_io_uint16 min_dma_cyc;\r
89     mg_io_uint16 recommend_dma_cyc;\r
90     mg_io_uint16 min_pio_cyc_no_iordy;\r
91     mg_io_uint16 min_pio_cyc_with_iordy;\r
92     mg_io_uint8  reserved3[22];\r
93     mg_io_uint16 major_ver_num;\r
94     mg_io_uint16 minor_ver_num;\r
95     mg_io_uint16 feature_cmd_set_suprt0;\r
96     mg_io_uint16 feature_cmd_set_suprt1;\r
97     mg_io_uint16 feature_cmd_set_suprt2;\r
98     mg_io_uint16 feature_cmd_set_en0;\r
99     mg_io_uint16 feature_cmd_set_en1;\r
100     mg_io_uint16 feature_cmd_set_en2;\r
101     mg_io_uint16 reserved4;\r
102     mg_io_uint16 req_time_for_security_er_done;\r
103     mg_io_uint16 req_time_for_enhan_security_er_done;\r
104     mg_io_uint16 adv_pwr_mgm_lvl_val;\r
105     mg_io_uint16 reserved5;\r
106     mg_io_uint16 re_of_hw_rst;\r
107     mg_io_uint8  reserved6[68];\r
108     mg_io_uint16 security_stas;\r
109     mg_io_uint8  vendor_uniq_bytes[62];\r
110     mg_io_uint16 cfa_pwr_mode;\r
111     mg_io_uint8  reserved7[186];\r
112 \r
113     mg_io_uint16 scts_per_secure_data_unit;\r
114     mg_io_uint16 integrity_word;\r
115 \r
116 } mg_io_type_drv_info;\r
117 \r
118 typedef struct mg_drv_info_s {\r
119         mg_io_type_drv_info drv_id;\r
120         u32 tot_sects;\r
121 } mg_drv_info_t;\r
122 \r
123 typedef struct mflash_bank_s\r
124 {\r
125         u32 base;\r
126         u32 chip_width;\r
127         u32 bus_width;\r
128 \r
129         mflash_gpio_num_t rst_pin;\r
130         mflash_gpio_num_t wp_pin;\r
131         mflash_gpio_num_t dpd_pin;\r
132 \r
133         mflash_gpio_drv_t *gpio_drv;\r
134         target_t *target;\r
135         mg_drv_info_t *drv_info;\r
136 \r
137         u8 proved;\r
138 } mflash_bank_t;\r
139 \r
140 extern int mflash_register_commands(struct command_context_s *cmd_ctx);\r
141 extern int mflash_init_drivers(struct command_context_s *cmd_ctx);\r
142 \r
143 #define MG_MFLASH_SECTOR_SIZE       (0x200)        //512Bytes = 2^9\r
144 #define MG_MFLASH_SECTOR_SIZE_MASK  (0x200-1)\r
145 #define MG_MFLASH_SECTOR_SIZE_SHIFT (9)\r
146 \r
147 #define MG_BUFFER_OFFSET    0x8000\r
148 #define MG_REG_OFFSET           0xC000\r
149 #define MG_REG_FEATURE          0x2 // write case\r
150 #define MG_REG_ERROR            0x2 // read case\r
151 #define MG_REG_SECT_CNT         0x4\r
152 #define MG_REG_SECT_NUM         0x6\r
153 #define MG_REG_CYL_LOW          0x8\r
154 #define MG_REG_CYL_HIGH         0xA\r
155 #define MG_REG_DRV_HEAD         0xC\r
156 #define MG_REG_COMMAND          0xE // write case\r
157 #define MG_REG_STATUS           0xE // read  case\r
158 #define MG_REG_DRV_CTRL         0x10\r
159 #define MG_REG_BURST_CTRL       0x12\r
160 \r
161 #define MG_OEM_DISK_WAIT_TIME_LONG   15000 // msec\r
162 #define MG_OEM_DISK_WAIT_TIME_NORMAL  3000 // msec\r
163 #define MG_OEM_DISK_WAIT_TIME_SHORT   1000 // msec\r
164 \r
165 typedef enum _mg_io_type_wait{\r
166 \r
167     mg_io_wait_bsy       = 1,\r
168     mg_io_wait_not_bsy   = 2,\r
169     mg_io_wait_rdy       = 3,\r
170     mg_io_wait_drq       = 4,  // wait for data request\r
171     mg_io_wait_drq_noerr = 5,  // wait for DRQ but ignore the error status bit\r
172     mg_io_wait_rdy_noerr = 6   // wait for ready, but ignore error status bit\r
173 \r
174 } mg_io_type_wait;\r
175 \r
176 //= "Status Register" bit masks.\r
177 typedef enum _mg_io_type_rbit_status{\r
178 \r
179     mg_io_rbit_status_error            = 0x01, // error bit in status register\r
180     mg_io_rbit_status_corrected_error  = 0x04, // corrected error in status register\r
181     mg_io_rbit_status_data_req         = 0x08, // data request bit in status register\r
182     mg_io_rbit_status_seek_done        = 0x10, // DSC - Drive Seek Complete\r
183     mg_io_rbit_status_write_fault      = 0x20, // DWF - Drive Write Fault\r
184     mg_io_rbit_status_ready            = 0x40,\r
185     mg_io_rbit_status_busy             = 0x80\r
186 \r
187 } mg_io_type_rbit_status;\r
188 \r
189 //= "Error Register" bit masks.\r
190 typedef enum _mg_io_type_rbit_error{\r
191 \r
192     mg_io_rbit_err_general          = 0x01,\r
193     mg_io_rbit_err_aborted          = 0x04,\r
194     mg_io_rbit_err_bad_sect_num     = 0x10,\r
195     mg_io_rbit_err_uncorrectable    = 0x40,\r
196     mg_io_rbit_err_bad_block        = 0x80\r
197 \r
198 } mg_io_type_rbit_error;\r
199 \r
200 //= "Device Control Register" bit.\r
201 typedef enum _mg_io_type_rbit_devc{\r
202 \r
203     mg_io_rbit_devc_intr      = 0x02,//  interrupt enable bit (1:disable, 0:enable)\r
204     mg_io_rbit_devc_srst      = 0x04  // softwrae reset bit (1:assert, 0:de-assert)\r
205 \r
206 } mg_io_type_rbit_devc;\r
207 \r
208 // "Drive Select/Head Register" values.\r
209 typedef enum _mg_io_type_rval_dev{\r
210 \r
211     mg_io_rval_dev_must_be_on      =   0x80, // These 1 bits are always on\r
212     mg_io_rval_dev_drv_master      =  (0x00 | mg_io_rval_dev_must_be_on),// Master\r
213     mg_io_rval_dev_drv_slave0      =  (0x10 | mg_io_rval_dev_must_be_on),// Slave0\r
214     mg_io_rval_dev_drv_slave1      =  (0x20 | mg_io_rval_dev_must_be_on),// Slave1\r
215     mg_io_rval_dev_drv_slave2      =  (0x30 | mg_io_rval_dev_must_be_on),// Slave2\r
216     mg_io_rval_dev_lba_mode        =  (0x40 | mg_io_rval_dev_must_be_on)\r
217 \r
218 } mg_io_type_rval_dev;\r
219 \r
220 typedef enum _mg_io_type_cmd\r
221 {\r
222     mg_io_cmd_read             =0x20,\r
223     mg_io_cmd_write            =0x30,\r
224 \r
225     mg_io_cmd_setmul           =0xC6,\r
226     mg_io_cmd_readmul          =0xC4,\r
227     mg_io_cmd_writemul         =0xC5,\r
228 \r
229     mg_io_cmd_idle             =0x97,//0xE3\r
230     mg_io_cmd_idle_immediate   =0x95,//0xE1\r
231 \r
232     mg_io_cmd_setsleep         =0x99,//0xE6\r
233     mg_io_cmd_stdby            =0x96,//0xE2\r
234     mg_io_cmd_stdby_immediate  =0x94,//0xE0\r
235 \r
236     mg_io_cmd_identify         =0xEC,\r
237     mg_io_cmd_set_feature      =0xEF,\r
238 \r
239     mg_io_cmd_confirm_write    =0x3C,\r
240     mg_io_cmd_confirm_read     =0x40,\r
241     mg_io_cmd_wakeup           =0xC3\r
242 \r
243 } mg_io_type_cmd;\r
244 \r
245 #endif\r