Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
scorpio
u-boot
Commits
81b196be
Commit
81b196be
authored
11 years ago
by
Tom Rini
Browse files
Options
Download
Plain Diff
Merge branch 'master' of
git://git.denx.de/u-boot-usb
parents
659c89da
7d0b605a
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
103 additions
and
33 deletions
+103
-33
README
README
+10
-0
drivers/dfu/dfu.c
drivers/dfu/dfu.c
+22
-20
drivers/dfu/dfu_mmc.c
drivers/dfu/dfu_mmc.c
+24
-7
drivers/usb/gadget/f_dfu.c
drivers/usb/gadget/f_dfu.c
+42
-6
include/configs/siemens-am33x-common.h
include/configs/siemens-am33x-common.h
+1
-0
include/dfu.h
include/dfu.h
+4
-0
No files found.
README
View file @
81b196be
...
...
@@ -1525,6 +1525,16 @@ The following options need to be configured:
this to the maximum filesize (in bytes) for the buffer.
Default is 4 MiB if undefined.
DFU_DEFAULT_POLL_TIMEOUT
Poll timeout [ms], is the timeout a device can send to the
host. The host must wait for this timeout before sending
a subsequent DFU_GET_STATUS request to the device.
DFU_MANIFEST_POLL_TIMEOUT
Poll timeout [ms], which the device sends to the host when
entering dfuMANIFEST state. Host waits this timeout, before
sending again an USB request to the device.
- Journaling Flash filesystem support:
CONFIG_JFFS2_NAND, CONFIG_JFFS2_NAND_OFF, CONFIG_JFFS2_NAND_SIZE,
CONFIG_JFFS2_NAND_DEV
...
...
This diff is collapsed.
Click to expand it.
drivers/dfu/dfu.c
View file @
81b196be
...
...
@@ -126,6 +126,28 @@ static int dfu_write_buffer_drain(struct dfu_entity *dfu)
return
ret
;
}
int
dfu_flush
(
struct
dfu_entity
*
dfu
,
void
*
buf
,
int
size
,
int
blk_seq_num
)
{
int
ret
=
0
;
if
(
dfu
->
flush_medium
)
ret
=
dfu
->
flush_medium
(
dfu
);
printf
(
"
\n
DFU complete CRC32: 0x%08x
\n
"
,
dfu
->
crc
);
/* clear everything */
dfu_free_buf
();
dfu
->
crc
=
0
;
dfu
->
offset
=
0
;
dfu
->
i_blk_seq_num
=
0
;
dfu
->
i_buf_start
=
dfu_buf
;
dfu
->
i_buf_end
=
dfu_buf
;
dfu
->
i_buf
=
dfu
->
i_buf_start
;
dfu
->
inited
=
0
;
return
ret
;
}
int
dfu_write
(
struct
dfu_entity
*
dfu
,
void
*
buf
,
int
size
,
int
blk_seq_num
)
{
int
ret
=
0
;
...
...
@@ -196,26 +218,6 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
ret
=
tret
;
}
/* end? */
if
(
size
==
0
)
{
/* Now try and flush to the medium if needed. */
if
(
dfu
->
flush_medium
)
ret
=
dfu
->
flush_medium
(
dfu
);
printf
(
"
\n
DFU complete CRC32: 0x%08x
\n
"
,
dfu
->
crc
);
/* clear everything */
dfu_free_buf
();
dfu
->
crc
=
0
;
dfu
->
offset
=
0
;
dfu
->
i_blk_seq_num
=
0
;
dfu
->
i_buf_start
=
dfu_buf
;
dfu
->
i_buf_end
=
dfu_buf
;
dfu
->
i_buf
=
dfu
->
i_buf_start
;
dfu
->
inited
=
0
;
}
return
ret
=
0
?
size
:
ret
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/dfu/dfu_mmc.c
View file @
81b196be
...
...
@@ -12,6 +12,7 @@
#include <errno.h>
#include <div64.h>
#include <dfu.h>
#include <mmc.h>
static
unsigned
char
__aligned
(
CONFIG_SYS_CACHELINE_SIZE
)
dfu_file_buf
[
CONFIG_SYS_DFU_MAX_FILE_SIZE
];
...
...
@@ -20,8 +21,8 @@ static long dfu_file_buf_len;
static
int
mmc_block_op
(
enum
dfu_op
op
,
struct
dfu_entity
*
dfu
,
u64
offset
,
void
*
buf
,
long
*
len
)
{
char
cmd_buf
[
DFU_CMD_BUF_SIZE
]
;
u32
blk_start
,
blk_count
;
struct
mmc
*
mmc
=
find_mmc_device
(
dfu
->
dev_num
)
;
u32
blk_start
,
blk_count
,
n
=
0
;
/*
* We must ensure that we work in lba_blk_size chunks, so ALIGN
...
...
@@ -38,12 +39,28 @@ static int mmc_block_op(enum dfu_op op, struct dfu_entity *dfu,
return
-
EINVAL
;
}
sprintf
(
cmd_buf
,
"mmc %s %p %x %x"
,
op
==
DFU_OP_READ
?
"read"
:
"write"
,
buf
,
blk_start
,
blk_count
);
debug
(
"%s: %s dev: %d start: %d cnt: %d buf: 0x%p
\n
"
,
__func__
,
op
==
DFU_OP_READ
?
"MMC READ"
:
"MMC WRITE"
,
dfu
->
dev_num
,
blk_start
,
blk_count
,
buf
);
switch
(
op
)
{
case
DFU_OP_READ
:
n
=
mmc
->
block_dev
.
block_read
(
dfu
->
dev_num
,
blk_start
,
blk_count
,
buf
);
break
;
case
DFU_OP_WRITE
:
n
=
mmc
->
block_dev
.
block_write
(
dfu
->
dev_num
,
blk_start
,
blk_count
,
buf
);
break
;
default:
error
(
"Operation not supported
\n
"
);
}
debug
(
"%s: %s 0x%p
\n
"
,
__func__
,
cmd_buf
,
cmd_buf
);
return
run_command
(
cmd_buf
,
0
);
if
(
n
!=
blk_count
)
{
error
(
"MMC operation failed"
);
return
-
EIO
;
}
return
0
;
}
static
int
mmc_file_buffer
(
struct
dfu_entity
*
dfu
,
void
*
buf
,
long
*
len
)
...
...
This diff is collapsed.
Click to expand it.
drivers/usb/gadget/f_dfu.c
View file @
81b196be
...
...
@@ -164,9 +164,14 @@ static void dnload_request_complete(struct usb_ep *ep, struct usb_request *req)
dfu_write
(
dfu_get_entity
(
f_dfu
->
altsetting
),
req
->
buf
,
req
->
length
,
f_dfu
->
blk_seq_num
);
}
if
(
req
->
length
==
0
)
puts
(
"DOWNLOAD ... OK
\n
Ctrl+C to exit ...
\n
"
);
static
void
dnload_request_flush
(
struct
usb_ep
*
ep
,
struct
usb_request
*
req
)
{
struct
f_dfu
*
f_dfu
=
req
->
context
;
dfu_flush
(
dfu_get_entity
(
f_dfu
->
altsetting
),
req
->
buf
,
req
->
length
,
f_dfu
->
blk_seq_num
);
}
static
void
handle_getstatus
(
struct
usb_request
*
req
)
...
...
@@ -174,19 +179,22 @@ static void handle_getstatus(struct usb_request *req)
struct
dfu_status
*
dstat
=
(
struct
dfu_status
*
)
req
->
buf
;
struct
f_dfu
*
f_dfu
=
req
->
context
;
dfu_set_poll_timeout
(
dstat
,
0
);
switch
(
f_dfu
->
dfu_state
)
{
case
DFU_STATE_dfuDNLOAD_SYNC
:
case
DFU_STATE_dfuDNBUSY
:
f_dfu
->
dfu_state
=
DFU_STATE_dfuDNLOAD_IDLE
;
break
;
case
DFU_STATE_dfuMANIFEST_SYNC
:
f_dfu
->
dfu_state
=
DFU_STATE_dfuMANIFEST
;
break
;
case
DFU_STATE_dfuMANIFEST
:
dfu_set_poll_timeout
(
dstat
,
DFU_MANIFEST_POLL_TIMEOUT
);
default:
break
;
}
dfu_set_poll_timeout
(
dstat
,
0
);
if
(
f_dfu
->
poll_timeout
)
if
(
!
(
f_dfu
->
blk_seq_num
%
(
dfu_get_buf_size
()
/
DFU_USB_BUFSIZ
)))
...
...
@@ -446,10 +454,11 @@ static int state_dfu_manifest_sync(struct f_dfu *f_dfu,
switch
(
ctrl
->
bRequest
)
{
case
USB_REQ_DFU_GETSTATUS
:
/* We're MainfestationTolerant */
f_dfu
->
dfu_state
=
DFU_STATE_dfu
IDLE
;
f_dfu
->
dfu_state
=
DFU_STATE_dfu
MANIFEST
;
handle_getstatus
(
req
);
f_dfu
->
blk_seq_num
=
0
;
value
=
RET_STAT_LEN
;
req
->
complete
=
dnload_request_flush
;
break
;
case
USB_REQ_DFU_GETSTATE
:
handle_getstate
(
req
);
...
...
@@ -463,6 +472,33 @@ static int state_dfu_manifest_sync(struct f_dfu *f_dfu,
return
value
;
}
static
int
state_dfu_manifest
(
struct
f_dfu
*
f_dfu
,
const
struct
usb_ctrlrequest
*
ctrl
,
struct
usb_gadget
*
gadget
,
struct
usb_request
*
req
)
{
int
value
=
0
;
switch
(
ctrl
->
bRequest
)
{
case
USB_REQ_DFU_GETSTATUS
:
/* We're MainfestationTolerant */
f_dfu
->
dfu_state
=
DFU_STATE_dfuIDLE
;
handle_getstatus
(
req
);
f_dfu
->
blk_seq_num
=
0
;
value
=
RET_STAT_LEN
;
puts
(
"DOWNLOAD ... OK
\n
Ctrl+C to exit ...
\n
"
);
break
;
case
USB_REQ_DFU_GETSTATE
:
handle_getstate
(
req
);
break
;
default:
f_dfu
->
dfu_state
=
DFU_STATE_dfuERROR
;
value
=
RET_STALL
;
break
;
}
return
value
;
}
static
int
state_dfu_upload_idle
(
struct
f_dfu
*
f_dfu
,
const
struct
usb_ctrlrequest
*
ctrl
,
struct
usb_gadget
*
gadget
,
...
...
@@ -539,7 +575,7 @@ static dfu_state_fn dfu_state[] = {
state_dfu_dnbusy
,
/* DFU_STATE_dfuDNBUSY */
state_dfu_dnload_idle
,
/* DFU_STATE_dfuDNLOAD_IDLE */
state_dfu_manifest_sync
,
/* DFU_STATE_dfuMANIFEST_SYNC */
NULL
,
/* DFU_STATE_dfuMANIFEST */
state_dfu_manifest
,
/* DFU_STATE_dfuMANIFEST */
NULL
,
/* DFU_STATE_dfuMANIFEST_WAIT_RST */
state_dfu_upload_idle
,
/* DFU_STATE_dfuUPLOAD_IDLE */
state_dfu_error
/* DFU_STATE_dfuERROR */
...
...
This diff is collapsed.
Click to expand it.
include/configs/siemens-am33x-common.h
View file @
81b196be
...
...
@@ -265,6 +265,7 @@
#define CONFIG_DFU_NAND
#define CONFIG_CMD_DFU
#define CONFIG_SYS_DFU_DATA_BUF_SIZE (1 << 20)
#define DFU_MANIFEST_POLL_TIMEOUT 25000
#endif
/* CONFIG_SPL_BUILD */
...
...
This diff is collapsed.
Click to expand it.
include/dfu.h
View file @
81b196be
...
...
@@ -80,6 +80,9 @@ static inline unsigned int get_mmc_blk_size(int dev)
#ifndef DFU_DEFAULT_POLL_TIMEOUT
#define DFU_DEFAULT_POLL_TIMEOUT 0
#endif
#ifndef DFU_MANIFEST_POLL_TIMEOUT
#define DFU_MANIFEST_POLL_TIMEOUT DFU_DEFAULT_POLL_TIMEOUT
#endif
struct
dfu_entity
{
char
name
[
DFU_NAME_SIZE
];
...
...
@@ -138,6 +141,7 @@ unsigned long dfu_get_buf_size(void);
int
dfu_read
(
struct
dfu_entity
*
de
,
void
*
buf
,
int
size
,
int
blk_seq_num
);
int
dfu_write
(
struct
dfu_entity
*
de
,
void
*
buf
,
int
size
,
int
blk_seq_num
);
int
dfu_flush
(
struct
dfu_entity
*
de
,
void
*
buf
,
int
size
,
int
blk_seq_num
);
/* Device specific */
#ifdef CONFIG_DFU_MMC
extern
int
dfu_fill_entity_mmc
(
struct
dfu_entity
*
dfu
,
char
*
s
);
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment