Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/usbinfo/main.c

    rc377bc50 reb48f61  
    2727 */
    2828
    29 /** @addtogroup usb
     29/** @addtogroup usbinfo
    3030 * @{
    3131 */
    3232/**
    3333 * @file
    34  * @brief USB querying.
     34 * USB querying.
    3535 */
    3636
     
    4343#include <devman.h>
    4444#include <devmap.h>
    45 #include <usb/usbdrv.h>
    4645#include "usbinfo.h"
    4746
     
    7776}
    7877
    79 static int set_new_host_controller(int *phone, const char *path)
     78static int get_host_controller_handle(const char *path,
     79    devman_handle_t *hc_handle)
    8080{
    8181        int rc;
    82         int tmp_phone;
    8382
    84         if (path[0] != '/') {
    85                 int hc_class_index = (int) strtol(path, NULL, 10);
    86                 char *dev_path;
    87                 rc = asprintf(&dev_path, "class/usbhc\\%d", hc_class_index);
    88                 if (rc < 0) {
    89                         internal_error(rc);
    90                         return rc;
    91                 }
    92                 devmap_handle_t handle;
    93                 rc = devmap_device_get_handle(dev_path, &handle, 0);
    94                 if (rc < 0) {
    95                         fprintf(stderr,
    96                             NAME ": failed getting handle of `devman://%s'.\n",
    97                             dev_path);
    98                         free(dev_path);
    99                         return rc;
    100                 }
    101                 tmp_phone = devmap_device_connect(handle, 0);
    102                 if (tmp_phone < 0) {
    103                         fprintf(stderr,
    104                             NAME ": could not connect to `%s'.\n",
    105                             dev_path);
    106                         free(dev_path);
    107                         return tmp_phone;
    108                 }
    109                 free(dev_path);
    110         } else {
    111                 devman_handle_t handle;
    112                 rc = devman_device_get_handle(path, &handle, 0);
    113                 if (rc != EOK) {
    114                         fprintf(stderr,
    115                             NAME ": failed getting handle of `devmap::/%s'.\n",
    116                             path);
    117                         return rc;
    118                 }
    119                 tmp_phone = devman_device_connect(handle, 0);
    120                 if (tmp_phone < 0) {
    121                         fprintf(stderr,
    122                             NAME ": could not connect to `%s'.\n",
    123                             path);
    124                         return tmp_phone;
    125                 }
     83        if (str_cmp(path, "uhci") == 0) {
     84                path = "/hw/pci0/00:01.2/uhci";
    12685        }
    12786
    128         *phone = tmp_phone;
     87        devman_handle_t handle;
     88        rc = devman_device_get_handle(path, &handle, 0);
     89        if (rc != EOK) {
     90                fprintf(stderr,
     91                    NAME ": failed getting handle of `devman::/%s'.\n",
     92                    path);
     93                return rc;
     94        }
     95        *hc_handle = handle;
    12996
    13097        return EOK;
    13198}
    13299
    133 static int connect_with_address(int hc_phone, const char *str_address)
     100static int get_device_address(const char *str_address, usb_address_t *address)
    134101{
    135         usb_address_t address = (usb_address_t) strtol(str_address, NULL, 0);
    136         if ((address < 0) || (address >= USB11_ADDRESS_MAX)) {
     102        usb_address_t addr = (usb_address_t) strtol(str_address, NULL, 0);
     103        if ((addr < 0) || (addr >= USB11_ADDRESS_MAX)) {
    137104                fprintf(stderr, NAME ": USB address out of range.\n");
    138105                return ERANGE;
    139106        }
    140107
    141         if (hc_phone < 0) {
    142                 fprintf(stderr, NAME ": no active host controller.\n");
    143                 return ENOENT;
    144         }
    145 
    146         return dump_device(hc_phone, address);
     108        *address = addr;
     109        return EOK;
    147110}
    148111
     
    150113int main(int argc, char *argv[])
    151114{
    152         int hc_phone = -1;
     115        devman_handle_t hc_handle = (devman_handle_t) -1;
     116        usb_address_t device_address = (usb_address_t) -1;
    153117
    154118        if (argc <= 1) {
     
    175139                        case 'a':
    176140                        case ACTION_DEVICE_ADDRESS: {
    177                                 int rc = connect_with_address(hc_phone, optarg);
     141                                int rc = get_device_address(optarg,
     142                                    &device_address);
    178143                                if (rc != EOK) {
    179144                                        return rc;
     
    184149                        case 't':
    185150                        case ACTION_HOST_CONTROLLER: {
    186                                 int rc = set_new_host_controller(&hc_phone,
    187                                     optarg);
     151                                int rc = get_host_controller_handle(optarg,
     152                                   &hc_handle);
    188153                                if (rc != EOK) {
    189154                                        return rc;
     
    202167        } while (i != -1);
    203168
     169        if ((hc_handle == (devman_handle_t) -1)
     170            || (device_address == (usb_address_t) -1)) {
     171                fprintf(stderr, NAME ": no target specified.\n");
     172                return EINVAL;
     173        }
     174
     175        dump_device(hc_handle, device_address);
     176
    204177        return 0;
    205178}
Note: See TracChangeset for help on using the changeset viewer.