Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
- fastboot updates / fixes
  • Loading branch information
trini committed Feb 26, 2021
2 parents b839fc9 + 0a7e5e5 commit 08cca18
Show file tree
Hide file tree
Showing 21 changed files with 543 additions and 158 deletions.
3 changes: 2 additions & 1 deletion cmd/ab_select.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ static int do_ab_select(struct cmd_tbl *cmdtp, int flag, int argc,

/* Lookup the "misc" partition from argv[2] and argv[3] */
if (part_get_info_by_dev_and_name_or_num(argv[2], argv[3],
&dev_desc, &part_info) < 0) {
&dev_desc, &part_info,
false) < 0) {
return CMD_RET_FAILURE;
}

Expand Down
23 changes: 14 additions & 9 deletions common/usb_kbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,7 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum)
struct usb_interface *iface;
struct usb_endpoint_descriptor *ep;
struct usb_kbd_pdata *data;
int epNum;

if (dev->descriptor.bNumConfigurations != 1)
return 0;
Expand All @@ -458,19 +459,21 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum)
if (iface->desc.bInterfaceProtocol != USB_PROT_HID_KEYBOARD)
return 0;

if (iface->desc.bNumEndpoints != 1)
return 0;
for (epNum = 0; epNum < iface->desc.bNumEndpoints; epNum++) {
ep = &iface->ep_desc[epNum];

ep = &iface->ep_desc[0];
/* Check if endpoint is interrupt IN endpoint */
if ((ep->bmAttributes & 3) != 3)
continue;

/* Check if endpoint 1 is interrupt endpoint */
if (!(ep->bEndpointAddress & 0x80))
return 0;
if (ep->bEndpointAddress & 0x80)
break;
}

if ((ep->bmAttributes & 3) != 3)
if (epNum == iface->desc.bNumEndpoints)
return 0;

debug("USB KBD: found set protocol...\n");
debug("USB KBD: found interrupt EP: 0x%x\n", ep->bEndpointAddress);

data = malloc(sizeof(struct usb_kbd_pdata));
if (!data) {
Expand Down Expand Up @@ -498,13 +501,15 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum)
data->last_report = -1;

/* We found a USB Keyboard, install it. */
debug("USB KBD: set boot protocol\n");
usb_set_protocol(dev, iface->desc.bInterfaceNumber, 0);

debug("USB KBD: found set idle...\n");
#if !defined(CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP) && \
!defined(CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE)
debug("USB KBD: set idle interval...\n");
usb_set_idle(dev, iface->desc.bInterfaceNumber, REPEAT_RATE / 4, 0);
#else
debug("USB KBD: set idle interval=0...\n");
usb_set_idle(dev, iface->desc.bInterfaceNumber, 0, 0);
#endif

Expand Down
2 changes: 2 additions & 0 deletions configs/sandbox64_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ CONFIG_DM_DEMO=y
CONFIG_DM_DEMO_SIMPLE=y
CONFIG_DM_DEMO_SHAPE=y
CONFIG_DFU_SF=y
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
CONFIG_GPIO_HOG=y
CONFIG_DM_GPIO_LOOKUP_LABEL=y
CONFIG_PM8916_GPIO=y
Expand Down
2 changes: 2 additions & 0 deletions configs/sandbox_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ CONFIG_DFU_SF=y
CONFIG_DMA=y
CONFIG_DMA_CHANNELS=y
CONFIG_SANDBOX_DMA=y
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
CONFIG_GPIO_HOG=y
CONFIG_DM_GPIO_LOOKUP_LABEL=y
CONFIG_PM8916_GPIO=y
Expand Down
90 changes: 50 additions & 40 deletions disk/part.c
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ int part_get_info(struct blk_desc *dev_desc, int part,
}
#endif /* CONFIG_HAVE_BLOCK_DEVICE */

return -1;
return -ENOENT;
}

int part_get_info_whole_disk(struct blk_desc *dev_desc,
Expand Down Expand Up @@ -417,7 +417,7 @@ int blk_get_device_by_str(const char *ifname, const char *dev_hwpart_str,
*dev_desc = get_dev_hwpart(ifname, dev, hwpart);
if (!(*dev_desc) || ((*dev_desc)->type == DEV_TYPE_UNKNOWN)) {
debug("** Bad device %s %s **\n", ifname, dev_hwpart_str);
dev = -ENOENT;
dev = -ENODEV;
goto cleanup;
}

Expand All @@ -441,7 +441,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
struct blk_desc **dev_desc,
struct disk_partition *info, int allow_whole_dev)
{
int ret = -1;
int ret;
const char *part_str;
char *dup_str = NULL;
const char *dev_str;
Expand Down Expand Up @@ -483,7 +483,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
if (0 == strcmp(ifname, "ubi")) {
if (!ubifs_is_mounted()) {
printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
return -1;
return -EINVAL;
}

*dev_desc = NULL;
Expand All @@ -505,6 +505,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
/* If still no dev_part_str, it's an error */
if (!dev_part_str) {
printf("** No device specified **\n");
ret = -ENODEV;
goto cleanup;
}

Expand All @@ -521,8 +522,10 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,

/* Look up the device */
dev = blk_get_device_by_str(ifname, dev_str, dev_desc);
if (dev < 0)
if (dev < 0) {
ret = dev;
goto cleanup;
}

/* Convert partition ID string to number */
if (!part_str || !*part_str) {
Expand All @@ -539,6 +542,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
if (*ep || (part == 0 && !allow_whole_dev)) {
printf("** Bad partition specification %s %s **\n",
ifname, dev_part_str);
ret = -ENOENT;
goto cleanup;
}
}
Expand All @@ -552,6 +556,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
if (!(*dev_desc)->lba) {
printf("** Bad device size - %s %s **\n", ifname,
dev_str);
ret = -EINVAL;
goto cleanup;
}

Expand All @@ -563,6 +568,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
if ((part > 0) || (!allow_whole_dev)) {
printf("** No partition table - %s %s **\n", ifname,
dev_str);
ret = -EPROTONOSUPPORT;
goto cleanup;
}

Expand Down Expand Up @@ -631,15 +637,14 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
*info = tmpinfo;
} else {
printf("** No valid partitions found **\n");
ret = -1;
goto cleanup;
}
}
if (strncmp((char *)info->type, BOOT_PART_TYPE, sizeof(info->type)) != 0) {
printf("** Invalid partition type \"%.32s\""
" (expect \"" BOOT_PART_TYPE "\")\n",
info->type);
ret = -1;
ret = -EINVAL;
goto cleanup;
}

Expand Down Expand Up @@ -675,7 +680,7 @@ int part_get_info_by_name_type(struct blk_desc *dev_desc, const char *name,
}
}

return -1;
return -ENOENT;
}

int part_get_info_by_name(struct blk_desc *dev_desc, const char *name,
Expand All @@ -688,12 +693,13 @@ int part_get_info_by_name(struct blk_desc *dev_desc, const char *name,
* Get partition info from device number and partition name.
*
* Parse a device number and partition name string in the form of
* "device_num#partition_name", for example "0#misc". If the partition
* is found, sets dev_desc and part_info accordingly with the information
* of the partition with the given partition_name.
* "devicenum.hwpartnum#partition_name", for example "0.1#misc". devicenum and
* hwpartnum are both optional, defaulting to 0. If the partition is found,
* sets dev_desc and part_info accordingly with the information of the
* partition with the given partition_name.
*
* @param[in] dev_iface Device interface
* @param[in] dev_part_str Input string argument, like "0#misc"
* @param[in] dev_part_str Input string argument, like "0.1#misc"
* @param[out] dev_desc Place to store the device description pointer
* @param[out] part_info Place to store the partition information
* @return 0 on success, or a negative on error
Expand All @@ -703,53 +709,57 @@ static int part_get_info_by_dev_and_name(const char *dev_iface,
struct blk_desc **dev_desc,
struct disk_partition *part_info)
{
char *ep;
const char *part_str;
int dev_num;
char *dup_str = NULL;
const char *dev_str, *part_str;
int ret;

/* Separate device and partition name specification */
part_str = strchr(dev_part_str, '#');
if (!part_str || part_str == dev_part_str)
return -EINVAL;

dev_num = simple_strtoul(dev_part_str, &ep, 16);
if (ep != part_str) {
/* Not all the first part before the # was parsed. */
if (part_str) {
dup_str = strdup(dev_part_str);
dup_str[part_str - dev_part_str] = 0;
dev_str = dup_str;
part_str++;
} else {
return -EINVAL;
}
part_str++;

*dev_desc = blk_get_dev(dev_iface, dev_num);
if (!*dev_desc) {
printf("Could not find %s %d\n", dev_iface, dev_num);
return -EINVAL;
}
if (part_get_info_by_name(*dev_desc, part_str, part_info) < 0) {
ret = blk_get_device_by_str(dev_iface, dev_str, dev_desc);
if (ret)
goto cleanup;

ret = part_get_info_by_name(*dev_desc, part_str, part_info);
if (ret < 0)
printf("Could not find \"%s\" partition\n", part_str);
return -EINVAL;
}
return 0;

cleanup:
free(dup_str);
return ret;
}

int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
const char *dev_part_str,
struct blk_desc **dev_desc,
struct disk_partition *part_info)
struct disk_partition *part_info,
int allow_whole_dev)
{
int ret;

/* Split the part_name if passed as "$dev_num#part_name". */
if (!part_get_info_by_dev_and_name(dev_iface, dev_part_str,
dev_desc, part_info))
return 0;
ret = part_get_info_by_dev_and_name(dev_iface, dev_part_str,
dev_desc, part_info);
if (ret >= 0)
return ret;
/*
* Couldn't lookup by name, try looking up the partition description
* directly.
*/
if (blk_get_device_part_str(dev_iface, dev_part_str,
dev_desc, part_info, 1) < 0) {
ret = blk_get_device_part_str(dev_iface, dev_part_str,
dev_desc, part_info, allow_whole_dev);
if (ret < 0)
printf("Couldn't find partition %s %s\n",
dev_iface, dev_part_str);
return -EINVAL;
}
return 0;
return ret;
}

void part_set_generic_name(const struct blk_desc *dev_desc,
Expand Down
5 changes: 5 additions & 0 deletions doc/android/fastboot-protocol.rst
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,11 @@ Command Reference
"powerdown" Power off the device.
"ucmd" execute any bootloader command and wait until it
finishs.
"acmd" execute any bootloader command, do not wait.
Client Variables
----------------

Expand Down
6 changes: 6 additions & 0 deletions doc/android/fastboot.rst
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ The current implementation supports the following standard commands:
- ``reboot``
- ``reboot-bootloader``
- ``set_active`` (only a stub implementation which always succeeds)
- ``ucmd`` (if enabled)
- ``acmd`` (if enabled)

The following OEM commands are supported (if enabled):

Expand Down Expand Up @@ -154,6 +156,10 @@ The device index starts from ``a`` and refers to the interface (e.g. USB
controller, SD/MMC controller) or disk index. The partition index starts
from ``1`` and describes the partition number on the particular device.

Alternatively, partition types may be specified using :ref:`U-Boot's partition
syntax <partitions>`. This allows specifying partitions like ``0.1``,
``0#boot``, or ``:3``. The interface is always ``mmc``.

Writing Partition Table
-----------------------

Expand Down
4 changes: 2 additions & 2 deletions doc/board/sipeed/maix.rst
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ SPI Flash
"""""""""

To load an image off of SPI flash, first set up a partition as described in
:ref:`partitions`. Then, use ``mtd`` to load that partition
:ref:`k210_partitions`. Then, use ``mtd`` to load that partition

.. code-block:: none
Expand Down Expand Up @@ -401,7 +401,7 @@ Sipeed MAIX boards typically provide around 16 MiB of SPI NOR flash. U-Boot is
stored in the first 1 MiB or so of this flash. U-Boot's environment is stored at
the end of flash.

.. _partitions:
.. _k210_partitions:

Partitions
""""""""""
Expand Down
1 change: 1 addition & 0 deletions doc/usage/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Use U-Boot

fdt_overlays
netconsole
partitions

Shell commands
--------------
Expand Down
Loading

0 comments on commit 08cca18

Please sign in to comment.