Changeset 733a9a8 in mainline


Ignore:
Timestamp:
2011-02-19T19:45:18Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7e7f0f5
Parents:
e221ca0
Message:

Use hardware interrupts

Location:
uspace/drv/uhci-hcd
Files:
3 edited

Legend:

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

    re221ca0 r733a9a8  
    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>
     
    7680};
    7781/*----------------------------------------------------------------------------*/
     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/*----------------------------------------------------------------------------*/
    78103static void irq_handler(device_t *device, ipc_callid_t iid, ipc_call_t *call)
    79104{
     
    81106        uhci_t *hc = dev_to_uhci(device);
    82107        usb_log_info("LOL HARDWARE INTERRUPT: %p.\n", hc);
     108        uint16_t status = IPC_GET_ARG1(*call);
    83109        assert(hc);
    84         uhci_interrupt(hc);
     110        uhci_interrupt(hc, status);
    85111}
    86112/*----------------------------------------------------------------------------*/
     
    109135            io_reg_base, io_reg_size, irq);
    110136
    111         ret = register_interrupt_handler(device, irq, irq_handler, NULL);
     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);
    112161        usb_log_debug("Registered interrupt handler %d.\n", ret);
    113162
  • uspace/drv/uhci-hcd/uhci.c

    re221ca0 r733a9a8  
    5858int uhci_init(uhci_t *instance, void *regs, size_t reg_size)
    5959{
    60         int ret = uhci_init_mem_structures(instance);
    61         CHECK_RET_RETURN(ret, "Failed to initialize memory structures.\n");
     60        assert(reg_size >= sizeof(regs_t));
    6261
    6362        /* allow access to hc control registers */
    6463        regs_t *io;
    65         assert(reg_size >= sizeof(regs_t));
    66         ret = pio_enable(regs, reg_size, (void**)&io);
     64        int ret = pio_enable(regs, reg_size, (void**)&io);
    6765        CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p.\n", io);
    6866        instance->registers = io;
    6967        usb_log_debug("Device registers accessible.\n");
    7068
     69        ret = uhci_init_mem_structures(instance);
     70        CHECK_RET_RETURN(ret, "Failed to initialize memory structures.\n");
     71
     72        uhci_init_hw(instance);
     73
    7174        instance->cleaner = fibril_create(uhci_interrupt_emulator, instance);
    72         fibril_add_ready(instance->cleaner);
     75//      fibril_add_ready(instance->cleaner);
    7376
    7477        instance->debug_checker = fibril_create(uhci_debug_checker, instance);
    7578        fibril_add_ready(instance->debug_checker);
    7679
    77         uhci_init_hw(instance);
    78 
    7980        return EOK;
    8081}
     
    8283void uhci_init_hw(uhci_t *instance)
    8384{
     85
     86        /* set framelist pointer */
    8487        const uint32_t pa = addr_to_phys(instance->frame_list);
    8588        pio_write_32(&instance->registers->flbaseadd, pa);
    8689
    87         /* enable all interrupts */
     90        /* enable all interrupts, but resume interrupt */
    8891        pio_write_16(&instance->registers->usbintr,
    8992                  UHCI_INTR_CRC | UHCI_INTR_COMPLETE | UHCI_INTR_SHORT_PACKET);
     
    9194        /* Start the hc with large(64B) packet FSBR */
    9295        pio_write_16(&instance->registers->usbcmd,
    93             UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET);
     96            UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET | UHCI_CMD_CONFIGURE);
    9497        usb_log_debug("Started UHCI HC.\n");
    9598}
     
    189192}
    190193/*----------------------------------------------------------------------------*/
    191 void uhci_interrupt(uhci_t *instance)
    192 {
    193         assert(instance);
    194         const uint16_t sts = pio_read_16(&instance->registers->usbsts);
    195         if ((sts & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0)
     194void uhci_interrupt(uhci_t *instance, uint16_t status)
     195{
     196        assert(instance);
     197        if ((status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0)
    196198                return;
    197         usb_log_debug("UHCI interrupt: %X.\n", sts);
     199        usb_log_debug("UHCI interrupt: %X.\n", status);
    198200        transfer_list_check(&instance->transfers_interrupt);
    199201        transfer_list_check(&instance->transfers_control_slow);
    200202        transfer_list_check(&instance->transfers_control_full);
    201203        transfer_list_check(&instance->transfers_bulk_full);
    202         pio_write_16(&instance->registers->usbsts, 0xf);
    203204}
    204205/*----------------------------------------------------------------------------*/
    205206int uhci_interrupt_emulator(void* arg)
    206207{
    207         return EOK;
    208208        usb_log_debug("Started interrupt emulator.\n");
    209209        uhci_t *instance = (uhci_t*)arg;
     
    211211
    212212        while(1) {
    213                 uhci_interrupt(instance);
     213                uint16_t status = pio_read_16(&instance->registers->usbsts);
     214                uhci_interrupt(instance, status);
    214215                async_usleep(UHCI_CLEANER_TIMEOUT);
    215216        }
     
    229230
    230231                uintptr_t frame_list = pio_read_32(&instance->registers->flbaseadd);
    231                 if (frame_list != (uintptr_t)addr_to_phys(instance->frame_list)) {
     232                if (frame_list != addr_to_phys(instance->frame_list)) {
    232233                        usb_log_debug("Framelist address: %p vs. %p.\n",
    233234                                frame_list, addr_to_phys(instance->frame_list));
  • uspace/drv/uhci-hcd/uhci.h

    re221ca0 r733a9a8  
    117117int uhci_schedule(uhci_t *instance, batch_t *batch);
    118118
    119 void uhci_interrupt(uhci_t *instance);
     119void uhci_interrupt(uhci_t *instance, uint16_t status);
    120120
    121121static inline uhci_t * dev_to_uhci(device_t *dev)
Note: See TracChangeset for help on using the changeset viewer.