1 /***************************************************************************
2 * Copyright (C) 2007-2008 by unsik Kim <donari75@gmail.com> *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
18 ***************************************************************************/
25 #include "time_support.h"
30 static int s3c2440_set_gpio_to_output (mflash_gpio_num_t gpio
);
31 static int s3c2440_set_gpio_output_val (mflash_gpio_num_t gpio
, u8 val
);
32 static int pxa270_set_gpio_to_output (mflash_gpio_num_t gpio
);
33 static int pxa270_set_gpio_output_val (mflash_gpio_num_t gpio
, u8 val
);
35 static command_t
*mflash_cmd
;
37 static mflash_bank_t
*mflash_bank
;
39 static mflash_gpio_drv_t pxa270_gpio
= {
41 .set_gpio_to_output
= pxa270_set_gpio_to_output
,
42 .set_gpio_output_val
= pxa270_set_gpio_output_val
45 static mflash_gpio_drv_t s3c2440_gpio
= {
47 .set_gpio_to_output
= s3c2440_set_gpio_to_output
,
48 .set_gpio_output_val
= s3c2440_set_gpio_output_val
51 static mflash_gpio_drv_t
*mflash_gpio
[] =
58 #define PXA270_GAFR0_L 0x40E00054
59 #define PXA270_GAFR3_U 0x40E00070
60 #define PXA270_GAFR3_U_RESERVED_BITS 0xfffc0000u
61 #define PXA270_GPDR0 0x40E0000C
62 #define PXA270_GPDR3 0x40E0010C
63 #define PXA270_GPDR3_RESERVED_BITS 0xfe000000u
64 #define PXA270_GPSR0 0x40E00018
65 #define PXA270_GPCR0 0x40E00024
67 static int pxa270_set_gpio_to_output (mflash_gpio_num_t gpio
)
69 u32 addr
, value
, mask
;
70 target_t
*target
= mflash_bank
->target
;
73 /* remove alternate function. */
74 mask
= 0x3u
<< (gpio
.num
& 0xF)*2;
76 addr
= PXA270_GAFR0_L
+ (gpio
.num
>> 4) * 4;
78 if ((ret
= target_read_u32(target
, addr
, &value
)) != ERROR_OK
)
82 if (addr
== PXA270_GAFR3_U
)
83 value
&= ~PXA270_GAFR3_U_RESERVED_BITS
;
85 if ((ret
= target_write_u32(target
, addr
, value
)) != ERROR_OK
)
88 /* set direction to output */
89 mask
= 0x1u
<< (gpio
.num
& 0x1F);
91 addr
= PXA270_GPDR0
+ (gpio
.num
>> 5) * 4;
93 if ((ret
= target_read_u32(target
, addr
, &value
)) != ERROR_OK
)
97 if (addr
== PXA270_GPDR3
)
98 value
&= ~PXA270_GPDR3_RESERVED_BITS
;
100 ret
= target_write_u32(target
, addr
, value
);
104 static int pxa270_set_gpio_output_val (mflash_gpio_num_t gpio
, u8 val
)
106 u32 addr
, value
, mask
;
107 target_t
*target
= mflash_bank
->target
;
110 mask
= 0x1u
<< (gpio
.num
& 0x1F);
113 addr
= PXA270_GPSR0
+ (gpio
.num
>> 5) * 4;
115 addr
= PXA270_GPCR0
+ (gpio
.num
>> 5) * 4;
118 if ((ret
= target_read_u32(target
, addr
, &value
)) != ERROR_OK
)
123 ret
= target_write_u32(target
, addr
, value
);
128 #define S3C2440_GPACON 0x56000000
129 #define S3C2440_GPADAT 0x56000004
130 #define S3C2440_GPJCON 0x560000d0
131 #define S3C2440_GPJDAT 0x560000d4
133 static int s3c2440_set_gpio_to_output (mflash_gpio_num_t gpio
)
135 u32 data
, mask
, gpio_con
;
136 target_t
*target
= mflash_bank
->target
;
139 if (gpio
.port
[0] >= 'a' && gpio
.port
[0] <= 'h') {
140 gpio_con
= S3C2440_GPACON
+ (gpio
.port
[0] - 'a') * 0x10;
141 } else if (gpio
.port
[0] == 'j') {
142 gpio_con
= S3C2440_GPJCON
;
144 LOG_ERROR("invalid port %d%s", gpio
.num
, gpio
.port
);
145 return ERROR_INVALID_ARGUMENTS
;
148 ret
= target_read_u32(target
, gpio_con
, &data
);
150 if (ret
== ERROR_OK
) {
151 if (gpio
.port
[0] == 'a') {
152 mask
= 1 << gpio
.num
;
155 mask
= 3 << gpio
.num
* 2;
157 data
|= (1 << gpio
.num
* 2);
160 ret
= target_write_u32(target
, gpio_con
, data
);
165 static int s3c2440_set_gpio_output_val (mflash_gpio_num_t gpio
, u8 val
)
167 u32 data
, mask
, gpio_dat
;
168 target_t
*target
= mflash_bank
->target
;
171 if (gpio
.port
[0] >= 'a' && gpio
.port
[0] <= 'h') {
172 gpio_dat
= S3C2440_GPADAT
+ (gpio
.port
[0] - 'a') * 0x10;
173 } else if (gpio
.port
[0] == 'j') {
174 gpio_dat
= S3C2440_GPJDAT
;
176 LOG_ERROR("invalid port %d%s", gpio
.num
, gpio
.port
);
177 return ERROR_INVALID_ARGUMENTS
;
180 ret
= target_read_u32(target
, gpio_dat
, &data
);
182 if (ret
== ERROR_OK
) {
183 mask
= 1 << gpio
.num
;
189 ret
= target_write_u32(target
, gpio_dat
, data
);
194 static int mg_hdrst(u8 level
)
196 return mflash_bank
->gpio_drv
->set_gpio_output_val(mflash_bank
->rst_pin
, level
);
199 static int mg_init_gpio (void)
201 mflash_gpio_drv_t
*gpio_drv
= mflash_bank
->gpio_drv
;
203 gpio_drv
->set_gpio_to_output(mflash_bank
->rst_pin
);
204 gpio_drv
->set_gpio_output_val(mflash_bank
->rst_pin
, 1);
209 static int mg_dsk_wait(mg_io_type_wait wait
, u32 time
)
212 target_t
*target
= mflash_bank
->target
;
213 u32 mg_task_reg
= mflash_bank
->base
+ MG_REG_OFFSET
;
217 duration_start_measure(&duration
);
221 target_read_u8(target
, mg_task_reg
+ MG_REG_STATUS
, &status
);
223 if (status
& mg_io_rbit_status_busy
)
225 if (wait
== mg_io_wait_bsy
)
230 case mg_io_wait_not_bsy
:
232 case mg_io_wait_rdy_noerr
:
233 if (status
& mg_io_rbit_status_ready
)
236 case mg_io_wait_drq_noerr
:
237 if (status
& mg_io_rbit_status_data_req
)
244 /* Now we check the error condition! */
245 if (status
& mg_io_rbit_status_error
)
247 target_read_u8(target
, mg_task_reg
+ MG_REG_ERROR
, &error
);
249 if (error
& mg_io_rbit_err_bad_sect_num
) {
250 LOG_ERROR("sector not found");
253 else if (error
& (mg_io_rbit_err_bad_block
| mg_io_rbit_err_uncorrectable
)) {
254 LOG_ERROR("bad block");
257 LOG_ERROR("disk operation fail");
265 if (status
& mg_io_rbit_status_ready
)
269 if (status
& mg_io_rbit_status_data_req
)
277 duration_stop_measure(&duration
, NULL
);
279 t
=duration
.duration
.tv_usec
/1000;
280 t
+=duration
.duration
.tv_sec
*1000;
286 LOG_ERROR("timeout occured");
290 static int mg_dsk_srst(u8 on
)
292 target_t
*target
= mflash_bank
->target
;
293 u32 mg_task_reg
= mflash_bank
->base
+ MG_REG_OFFSET
;
297 if ((ret
= target_read_u8(target
, mg_task_reg
+ MG_REG_DRV_CTRL
, &value
)) != ERROR_OK
)
301 value
|= (mg_io_rbit_devc_srst
);
303 value
&= ~mg_io_rbit_devc_srst
;
306 ret
= target_write_u8(target
, mg_task_reg
+ MG_REG_DRV_CTRL
, value
);
310 static int mg_dsk_io_cmd(u32 sect_num
, u32 cnt
, u8 cmd
)
312 target_t
*target
= mflash_bank
->target
;
313 u32 mg_task_reg
= mflash_bank
->base
+ MG_REG_OFFSET
;
316 if (mg_dsk_wait(mg_io_wait_rdy_noerr
, MG_OEM_DISK_WAIT_TIME_NORMAL
) != ERROR_OK
)
319 value
= mg_io_rval_dev_drv_master
| mg_io_rval_dev_lba_mode
|((sect_num
>> 24) & 0xf);
321 target_write_u8(target
, mg_task_reg
+ MG_REG_DRV_HEAD
, value
);
322 target_write_u8(target
, mg_task_reg
+ MG_REG_SECT_CNT
, (u8
)cnt
);
323 target_write_u8(target
, mg_task_reg
+ MG_REG_SECT_NUM
, (u8
)sect_num
);
324 target_write_u8(target
, mg_task_reg
+ MG_REG_CYL_LOW
, (u8
)(sect_num
>> 8));
325 target_write_u8(target
, mg_task_reg
+ MG_REG_CYL_HIGH
, (u8
)(sect_num
>> 16));
327 target_write_u8(target
, mg_task_reg
+ MG_REG_COMMAND
, cmd
);
332 static int mg_dsk_drv_info(void)
334 target_t
*target
= mflash_bank
->target
;
335 u32 mg_buff
= mflash_bank
->base
+ MG_BUFFER_OFFSET
;
337 if ( mg_dsk_io_cmd(0, 1, mg_io_cmd_identify
) != ERROR_OK
)
340 if ( mg_dsk_wait(mg_io_wait_drq
, MG_OEM_DISK_WAIT_TIME_NORMAL
) != ERROR_OK
)
343 LOG_INFO("read drive info.");
345 if (! mflash_bank
->drv_info
)
346 mflash_bank
->drv_info
= malloc(sizeof(mg_drv_info_t
));
348 target
->type
->read_memory(target
, mg_buff
, 2, sizeof(mg_io_type_drv_info
) >> 1,
349 (u8
*)&mflash_bank
->drv_info
->drv_id
);
351 mflash_bank
->drv_info
->tot_sects
= (u32
)(mflash_bank
->drv_info
->drv_id
.total_user_addressable_sectors_hi
<< 16)
352 + mflash_bank
->drv_info
->drv_id
.total_user_addressable_sectors_lo
;
354 target_write_u8(target
, mflash_bank
->base
+ MG_REG_OFFSET
+ MG_REG_COMMAND
, mg_io_cmd_confirm_read
);
359 static int mg_mflash_probe(void)
361 mflash_bank
->proved
= 0;
365 LOG_INFO("reset mflash");
369 if (mg_dsk_wait(mg_io_wait_bsy
, MG_OEM_DISK_WAIT_TIME_LONG
) != ERROR_OK
)
374 if (mg_dsk_wait(mg_io_wait_not_bsy
, MG_OEM_DISK_WAIT_TIME_LONG
) != ERROR_OK
)
379 if (mg_dsk_wait(mg_io_wait_bsy
, MG_OEM_DISK_WAIT_TIME_LONG
) != ERROR_OK
)
384 if (mg_dsk_wait(mg_io_wait_not_bsy
, MG_OEM_DISK_WAIT_TIME_LONG
) != ERROR_OK
)
387 if (mg_dsk_drv_info() != ERROR_OK
)
390 mflash_bank
->proved
= 1;
395 static int mg_probe_cmd(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
399 ret
= mg_mflash_probe();
401 if (ret
== ERROR_OK
) {
402 command_print(cmd_ctx
, "mflash (total %u sectors) found at 0x%8.8x",
403 mflash_bank
->drv_info
->tot_sects
, mflash_bank
->base
);
409 static int mg_mflash_do_read_sects(void *buff
, u32 sect_num
, u32 sect_cnt
)
413 target_t
*target
= mflash_bank
->target
;
417 if ( mg_dsk_io_cmd(sect_num
, sect_cnt
, mg_io_cmd_read
) != ERROR_OK
)
420 address
= mflash_bank
->base
+ MG_BUFFER_OFFSET
;
422 duration_start_measure(&duration
);
424 for (i
= 0; i
< sect_cnt
; i
++) {
425 mg_dsk_wait(mg_io_wait_drq
, MG_OEM_DISK_WAIT_TIME_NORMAL
);
427 target
->type
->read_memory(target
, address
, 2, MG_MFLASH_SECTOR_SIZE
/ 2, buff_ptr
);
428 buff_ptr
+= MG_MFLASH_SECTOR_SIZE
;
430 target_write_u8(target
, mflash_bank
->base
+ MG_REG_OFFSET
+ MG_REG_COMMAND
, mg_io_cmd_confirm_read
);
432 LOG_DEBUG("%u (0x%8.8x) sector read", sect_num
+ i
, (sect_num
+ i
) * MG_MFLASH_SECTOR_SIZE
);
434 duration_stop_measure(&duration
, NULL
);
436 if ((duration
.duration
.tv_sec
* 1000 + duration
.duration
.tv_usec
/ 1000) > 3000) {
437 LOG_INFO("read %u'th sectors", sect_num
+ i
);
438 duration_start_measure(&duration
);
442 ret
= mg_dsk_wait(mg_io_wait_rdy
, MG_OEM_DISK_WAIT_TIME_NORMAL
);
447 static int mg_mflash_read_sects(void *buff
, u32 sect_num
, u32 sect_cnt
)
449 u32 quotient
, residue
, i
;
452 quotient
= sect_cnt
>> 8;
453 residue
= sect_cnt
% 256;
455 for (i
= 0; i
< quotient
; i
++) {
456 LOG_DEBUG("sect num : %u buff : 0x%0lx", sect_num
,
457 (unsigned long)buff_ptr
);
458 mg_mflash_do_read_sects(buff_ptr
, sect_num
, 256);
460 buff_ptr
+= 256 * MG_MFLASH_SECTOR_SIZE
;
464 LOG_DEBUG("sect num : %u buff : %0lx", sect_num
,
465 (unsigned long)buff_ptr
);
466 mg_mflash_do_read_sects(buff_ptr
, sect_num
, residue
);
472 static int mg_mflash_do_write_sects(void *buff
, u32 sect_num
, u32 sect_cnt
)
476 target_t
*target
= mflash_bank
->target
;
480 if ( mg_dsk_io_cmd(sect_num
, sect_cnt
, mg_io_cmd_write
) != ERROR_OK
) {
481 LOG_ERROR("mg_io_cmd_write fail");
485 address
= mflash_bank
->base
+ MG_BUFFER_OFFSET
;
487 duration_start_measure(&duration
);
489 for (i
= 0; i
< sect_cnt
; i
++) {
490 ret
= mg_dsk_wait(mg_io_wait_drq
, MG_OEM_DISK_WAIT_TIME_NORMAL
);
492 LOG_ERROR("mg_io_wait_drq time out");
494 ret
= target
->type
->write_memory(target
, address
, 2, MG_MFLASH_SECTOR_SIZE
/ 2, buff_ptr
);
496 LOG_ERROR("mem write error");
497 buff_ptr
+= MG_MFLASH_SECTOR_SIZE
;
499 ret
= target_write_u8(target
, mflash_bank
->base
+ MG_REG_OFFSET
+ MG_REG_COMMAND
, mg_io_cmd_confirm_write
);
501 LOG_ERROR("mg_io_cmd_confirm_write error");
503 LOG_DEBUG("%u (0x%8.8x) sector write", sect_num
+ i
, (sect_num
+ i
) * MG_MFLASH_SECTOR_SIZE
);
505 duration_stop_measure(&duration
, NULL
);
507 if ((duration
.duration
.tv_sec
* 1000 + duration
.duration
.tv_usec
/ 1000) > 3000) {
508 LOG_INFO("wrote %u'th sectors", sect_num
+ i
);
509 duration_start_measure(&duration
);
513 ret
= mg_dsk_wait(mg_io_wait_rdy
, MG_OEM_DISK_WAIT_TIME_NORMAL
);
518 static int mg_mflash_write_sects(void *buff
, u32 sect_num
, u32 sect_cnt
)
520 u32 quotient
, residue
, i
;
523 quotient
= sect_cnt
>> 8;
524 residue
= sect_cnt
% 256;
526 for (i
= 0; i
< quotient
; i
++) {
527 LOG_DEBUG("sect num : %u buff : %0lx", sect_num
,
528 (unsigned long)buff_ptr
);
529 mg_mflash_do_write_sects(buff_ptr
, sect_num
, 256);
531 buff_ptr
+= 256 * MG_MFLASH_SECTOR_SIZE
;
535 LOG_DEBUG("sect num : %u buff : %0lx", sect_num
,
536 (unsigned long)buff_ptr
);
537 mg_mflash_do_write_sects(buff_ptr
, sect_num
, residue
);
543 static int mg_mflash_read (u32 addr
, u8
*buff
, u32 len
)
545 u8
*sect_buff
, *buff_ptr
= buff
;
546 u32 cur_addr
, next_sec_addr
, end_addr
, cnt
, sect_num
;
550 end_addr
= addr
+ len
;
552 sect_buff
= malloc(MG_MFLASH_SECTOR_SIZE
);
554 if (cur_addr
& MG_MFLASH_SECTOR_SIZE_MASK
) {
556 next_sec_addr
= (cur_addr
+ MG_MFLASH_SECTOR_SIZE
) & ~MG_MFLASH_SECTOR_SIZE_MASK
;
557 sect_num
= cur_addr
>> MG_MFLASH_SECTOR_SIZE_SHIFT
;
558 mg_mflash_read_sects(sect_buff
, sect_num
, 1);
560 if (end_addr
< next_sec_addr
) {
561 memcpy(buff_ptr
, sect_buff
+ (cur_addr
& MG_MFLASH_SECTOR_SIZE_MASK
), end_addr
- cur_addr
);
562 LOG_DEBUG("copies %u byte from sector offset 0x%8.8x", end_addr
- cur_addr
, cur_addr
);
565 memcpy(buff_ptr
, sect_buff
+ (cur_addr
& MG_MFLASH_SECTOR_SIZE_MASK
), next_sec_addr
- cur_addr
);
566 LOG_DEBUG("copies %u byte from sector offset 0x%8.8x", next_sec_addr
- cur_addr
, cur_addr
);
567 buff_ptr
+= (next_sec_addr
- cur_addr
);
568 cur_addr
= next_sec_addr
;
572 if (cur_addr
< end_addr
) {
574 sect_num
= cur_addr
>> MG_MFLASH_SECTOR_SIZE_SHIFT
;
575 next_sec_addr
= cur_addr
+ MG_MFLASH_SECTOR_SIZE
;
577 while (next_sec_addr
<= end_addr
) {
579 next_sec_addr
+= MG_MFLASH_SECTOR_SIZE
;
583 mg_mflash_read_sects(buff_ptr
, sect_num
, cnt
);
585 buff_ptr
+= cnt
* MG_MFLASH_SECTOR_SIZE
;
586 cur_addr
+= cnt
* MG_MFLASH_SECTOR_SIZE
;
588 if (cur_addr
< end_addr
) {
590 sect_num
= cur_addr
>> MG_MFLASH_SECTOR_SIZE_SHIFT
;
591 mg_mflash_read_sects(sect_buff
, sect_num
, 1);
592 memcpy(buff_ptr
, sect_buff
, end_addr
- cur_addr
);
593 LOG_DEBUG("copies %u byte", end_addr
- cur_addr
);
603 static int mg_mflash_write(u32 addr
, u8
*buff
, u32 len
)
605 u8
*sect_buff
, *buff_ptr
= buff
;
606 u32 cur_addr
, next_sec_addr
, end_addr
, cnt
, sect_num
;
610 end_addr
= addr
+ len
;
612 sect_buff
= malloc(MG_MFLASH_SECTOR_SIZE
);
614 if (cur_addr
& MG_MFLASH_SECTOR_SIZE_MASK
) {
616 next_sec_addr
= (cur_addr
+ MG_MFLASH_SECTOR_SIZE
) & ~MG_MFLASH_SECTOR_SIZE_MASK
;
617 sect_num
= cur_addr
>> MG_MFLASH_SECTOR_SIZE_SHIFT
;
618 mg_mflash_read_sects(sect_buff
, sect_num
, 1);
620 if (end_addr
< next_sec_addr
) {
621 memcpy(sect_buff
+ (cur_addr
& MG_MFLASH_SECTOR_SIZE_MASK
), buff_ptr
, end_addr
- cur_addr
);
622 LOG_DEBUG("copies %u byte to sector offset 0x%8.8x", end_addr
- cur_addr
, cur_addr
);
625 memcpy(sect_buff
+ (cur_addr
& MG_MFLASH_SECTOR_SIZE_MASK
), buff_ptr
, next_sec_addr
- cur_addr
);
626 LOG_DEBUG("copies %u byte to sector offset 0x%8.8x", next_sec_addr
- cur_addr
, cur_addr
);
627 buff_ptr
+= (next_sec_addr
- cur_addr
);
628 cur_addr
= next_sec_addr
;
631 mg_mflash_write_sects(sect_buff
, sect_num
, 1);
634 if (cur_addr
< end_addr
) {
636 sect_num
= cur_addr
>> MG_MFLASH_SECTOR_SIZE_SHIFT
;
637 next_sec_addr
= cur_addr
+ MG_MFLASH_SECTOR_SIZE
;
639 while (next_sec_addr
<= end_addr
) {
641 next_sec_addr
+= MG_MFLASH_SECTOR_SIZE
;
645 mg_mflash_write_sects(buff_ptr
, sect_num
, cnt
);
647 buff_ptr
+= cnt
* MG_MFLASH_SECTOR_SIZE
;
648 cur_addr
+= cnt
* MG_MFLASH_SECTOR_SIZE
;
650 if (cur_addr
< end_addr
) {
652 sect_num
= cur_addr
>> MG_MFLASH_SECTOR_SIZE_SHIFT
;
653 mg_mflash_read_sects(sect_buff
, sect_num
, 1);
654 memcpy(sect_buff
, buff_ptr
, end_addr
- cur_addr
);
655 LOG_DEBUG("copies %u byte", end_addr
- cur_addr
);
656 mg_mflash_write_sects(sect_buff
, sect_num
, 1);
665 static int mg_write_cmd(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
667 u32 address
, buf_cnt
;
669 /* TODO : multi-bank support, large file support */
676 return ERROR_COMMAND_SYNTAX_ERROR
;
679 address
= strtoul(args
[2], NULL
, 0);
681 if (! mflash_bank
->proved
) {
685 if (fileio_open(&fileio
, args
[1], FILEIO_READ
, FILEIO_BINARY
) != ERROR_OK
) {
689 buffer
= malloc(fileio
.size
);
691 if (fileio_read(&fileio
, fileio
.size
, buffer
, &buf_cnt
) != ERROR_OK
)
694 fileio_close(&fileio
);
698 duration_start_measure(&duration
);
700 ret
= mg_mflash_write(address
, buffer
, (u32
)fileio
.size
);
702 duration_stop_measure(&duration
, &duration_text
);
704 command_print(cmd_ctx
, "wrote %lli byte from file %s in %s (%f kB/s)",
705 fileio
.size
, args
[1], duration_text
,
706 (float)fileio
.size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
710 fileio_close(&fileio
);
717 static int mg_dump_cmd(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
719 u32 address
, size_written
, size
;
721 /* TODO : multi-bank support */
727 return ERROR_COMMAND_SYNTAX_ERROR
;
730 address
= strtoul(args
[2], NULL
, 0);
731 size
= strtoul(args
[3], NULL
, 0);
733 if (! mflash_bank
->proved
) {
737 if (fileio_open(&fileio
, args
[1], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
) {
741 buffer
= malloc(size
);
743 duration_start_measure(&duration
);
745 mg_mflash_read(address
, buffer
, size
);
747 duration_stop_measure(&duration
, &duration_text
);
749 fileio_write(&fileio
, size
, buffer
, &size_written
);
751 command_print(cmd_ctx
, "dump image (address 0x%8.8x size %u) to file %s in %s (%f kB/s)",
752 address
, size
, args
[1], duration_text
,
753 (float)size
/ 1024.0 / ((float)duration
.duration
.tv_sec
+ ((float)duration
.duration
.tv_usec
/ 1000000.0)));
757 fileio_close(&fileio
);
764 int mflash_init_drivers(struct command_context_s
*cmd_ctx
)
767 register_command(cmd_ctx
, mflash_cmd
, "probe", mg_probe_cmd
, COMMAND_EXEC
, NULL
);
768 register_command(cmd_ctx
, mflash_cmd
, "write", mg_write_cmd
, COMMAND_EXEC
,
769 "mflash write <num> <file> <address>");
770 register_command(cmd_ctx
, mflash_cmd
, "dump", mg_dump_cmd
, COMMAND_EXEC
,
771 "mflash dump <num> <file> <address> <size>");
777 static int mg_bank_cmd(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
785 return ERROR_COMMAND_SYNTAX_ERROR
;
788 if ((target
= get_target(args
[3])) == NULL
)
790 LOG_ERROR("target '%s' not defined", args
[3]);
794 mflash_bank
= calloc(sizeof(mflash_bank_t
), 1);
795 mflash_bank
->base
= strtoul(args
[1], NULL
, 0);
796 mflash_bank
->rst_pin
.num
= strtoul(args
[2], &str
, 0);
798 mflash_bank
->rst_pin
.port
[0] = (u16
)tolower(str
[0]);
800 mflash_bank
->target
= target
;
802 for (i
= 0; mflash_gpio
[i
] ; i
++) {
803 if (! strcmp(mflash_gpio
[i
]->name
, args
[0])) {
804 mflash_bank
->gpio_drv
= mflash_gpio
[i
];
808 if (! mflash_bank
->gpio_drv
) {
809 LOG_ERROR("%s is unsupported soc", args
[0]);
810 return ERROR_INVALID_ARGUMENTS
;
816 int mflash_register_commands(struct command_context_s
*cmd_ctx
)
818 mflash_cmd
= register_command(cmd_ctx
, NULL
, "mflash", NULL
, COMMAND_ANY
, NULL
);
819 register_command(cmd_ctx
, mflash_cmd
, "bank", mg_bank_cmd
, COMMAND_CONFIG
,
820 "mflash bank <soc> <base> <RST pin> <target #>");
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)