Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci-hcd/main.c

    re0df6c2 r7e7f0f5  
    3434#include <driver.h>
    3535#include <usb_iface.h>
     36#include <ipc/irc.h>
     37#include <ipc/ns.h>
     38#include <ipc/services.h>
     39#include <sysinfo.h>
    3640
    3741#include <errno.h>
     
    4650#define NAME "uhci-hcd"
    4751
     52static int uhci_add_device(device_t *device);
     53static int usb_iface_get_hc_handle(device_t *dev, devman_handle_t *handle);
     54/*----------------------------------------------------------------------------*/
    4855static int usb_iface_get_hc_handle(device_t *dev, devman_handle_t *handle)
    4956{
     
    5461        return EOK;
    5562}
    56 
     63/*----------------------------------------------------------------------------*/
    5764static usb_iface_t hc_usb_iface = {
    5865        .get_hc_handle = usb_iface_get_hc_handle
    5966};
    60 
     67/*----------------------------------------------------------------------------*/
    6168static device_ops_t uhci_ops = {
    6269        .interfaces[USB_DEV_IFACE] = &hc_usb_iface,
    6370        .interfaces[USBHC_DEV_IFACE] = &uhci_iface
    6471};
    65 
     72/*----------------------------------------------------------------------------*/
     73static driver_ops_t uhci_driver_ops = {
     74        .add_device = uhci_add_device,
     75};
     76/*----------------------------------------------------------------------------*/
     77static driver_t uhci_driver = {
     78        .name = NAME,
     79        .driver_ops = &uhci_driver_ops
     80};
     81/*----------------------------------------------------------------------------*/
     82static irq_cmd_t uhci_cmds[] = {
     83        {
     84                .cmd = CMD_PIO_READ_16,
     85                .addr = (void*)0xc022,
     86                .dstarg = 1
     87        },
     88        {
     89                .cmd = CMD_PIO_WRITE_16,
     90                .addr = (void*)0xc022,
     91                .value = 0x1f
     92        },
     93        {
     94                .cmd = CMD_ACCEPT
     95        }
     96};
     97/*----------------------------------------------------------------------------*/
     98static irq_code_t uhci_code = {
     99        sizeof(uhci_cmds) / sizeof(irq_cmd_t),
     100        uhci_cmds
     101};
     102/*----------------------------------------------------------------------------*/
     103static void irq_handler(device_t *device, ipc_callid_t iid, ipc_call_t *call)
     104{
     105        assert(device);
     106        uhci_t *hc = dev_to_uhci(device);
     107        usb_log_info("LOL HARDWARE INTERRUPT: %p.\n", hc);
     108        uint16_t status = IPC_GET_ARG1(*call);
     109        assert(hc);
     110        uhci_interrupt(hc, status);
     111}
     112/*----------------------------------------------------------------------------*/
    66113static int uhci_add_device(device_t *device)
    67114{
     
    75122        int irq;
    76123
    77         int rc = pci_get_my_registers(device,
    78             &io_reg_base, &io_reg_size, &irq);
    79 
    80         if (rc != EOK) {
    81                 usb_log_error("Failed(%d) to get I/O registers addresses for device:.\n",
    82                     rc, device->handle);
    83                 return rc;
     124        int ret =
     125            pci_get_my_registers(device, &io_reg_base, &io_reg_size, &irq);
     126
     127        if (ret != EOK) {
     128                usb_log_error(
     129                    "Failed(%d) to get I/O registers addresses for device:.\n",
     130                    ret, device->handle);
     131                return ret;
    84132        }
    85133
     
    87135            io_reg_base, io_reg_size, irq);
    88136
     137
     138  sysarg_t apic;
     139  sysarg_t i8259;
     140        int irc_phone = -1;
     141        int irc_service = 0;
     142
     143  if ((sysinfo_get_value("apic", &apic) == EOK) && (apic)) {
     144    irc_service = SERVICE_APIC;
     145                usb_log_debug("SERVICE_APIC\n");
     146        } else if ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259)) {
     147    irc_service = SERVICE_I8259;
     148                usb_log_debug("SERVICE_I8259\n");
     149        }
     150
     151  if (irc_service) {
     152    while (irc_phone < 0)
     153      irc_phone = service_connect_blocking(irc_service, 0, 0);
     154  }
     155        usb_log_debug("Interrupt conttroller phone: %d\n", irc_phone);
     156
     157        async_msg_1(irc_phone, IRC_ENABLE_INTERRUPT, irq);
     158        async_hangup(irc_phone);
     159
     160        ret = register_interrupt_handler(device, irq, irq_handler, &uhci_code);
     161        usb_log_debug("Registered interrupt handler %d.\n", ret);
     162
    89163        uhci_t *uhci_hc = malloc(sizeof(uhci_t));
    90164        if (!uhci_hc) {
    91                 usb_log_error("Failed to allocaete memory for uhci hcd driver.\n");
     165                usb_log_error("Failed to allocate memory for uhci hcd driver.\n");
    92166                return ENOMEM;
    93167        }
    94168
    95         int ret = uhci_init(uhci_hc, (void*)io_reg_base, io_reg_size);
     169        ret = uhci_init(uhci_hc, (void*)io_reg_base, io_reg_size);
    96170        if (ret != EOK) {
    97171                usb_log_error("Failed to init uhci-hcd.\n");
     
    100174        device_t *rh;
    101175        ret = setup_root_hub(&rh, device);
    102 
    103176        if (ret != EOK) {
    104177                usb_log_error("Failed to setup uhci root hub.\n");
     
    118191        return EOK;
    119192}
    120 
    121 static driver_ops_t uhci_driver_ops = {
    122         .add_device = uhci_add_device,
    123 };
    124 
    125 static driver_t uhci_driver = {
    126         .name = NAME,
    127         .driver_ops = &uhci_driver_ops
    128 };
    129 
     193/*----------------------------------------------------------------------------*/
    130194int main(int argc, char *argv[])
    131195{
    132         /*
    133          * Do some global initializations.
    134          */
    135         sleep(5);
    136         usb_log_enable(USB_LOG_LEVEL_INFO, NAME);
     196        sleep(3);
     197        usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
    137198
    138199        return driver_main(&uhci_driver);
Note: See TracChangeset for help on using the changeset viewer.