Changeset f4c87aa9 in mainline
- Timestamp:
- 2011-02-16T18:45:36Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9013ad3
- Parents:
- 2e85b3c
- Location:
- uspace/drv/uhci-hcd
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-hcd/uhci.c
r2e85b3c rf4c87aa9 41 41 42 42 static int uhci_init_transfer_lists(uhci_t *instance); 43 static int uhci_init_mem_structures(uhci_t *instance); 44 static void uhci_init_hw(uhci_t *instance); 45 43 46 static int uhci_clean_finished(void *arg); 44 47 static int uhci_debug_checker(void *arg); 48 45 49 static bool allowed_usb_packet( 46 50 bool low_speed, usb_transfer_type_t, size_t size); 47 51 48 int uhci_init(uhci_t *instance, void *regs, size_t reg_size) 49 { 50 #define CHECK_RET_RETURN(message...) \ 52 #define CHECK_RET_RETURN(ret, message...) \ 51 53 if (ret != EOK) { \ 52 54 usb_log_error(message); \ … … 54 56 } else (void) 0 55 57 56 /* init address keeper(libusb) */ 57 usb_address_keeping_init(&instance->address_manager, USB11_ADDRESS_MAX); 58 usb_log_debug("Initialized address manager.\n"); 58 int uhci_init(uhci_t *instance, void *regs, size_t reg_size) 59 { 60 int ret = uhci_init_mem_structures(instance); 61 CHECK_RET_RETURN(ret, "Failed to initialize memory structures.\n"); 59 62 60 63 /* allow access to hc control registers */ 61 64 regs_t *io; 62 65 assert(reg_size >= sizeof(regs_t)); 63 intret = pio_enable(regs, reg_size, (void**)&io);64 CHECK_RET_RETURN( "Failed to gain access to registers at %p.\n", io);66 ret = pio_enable(regs, reg_size, (void**)&io); 67 CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p.\n", io); 65 68 instance->registers = io; 66 69 usb_log_debug("Device registers accessible.\n"); 67 70 71 instance->cleaner = fibril_create(uhci_clean_finished, instance); 72 fibril_add_ready(instance->cleaner); 73 74 instance->debug_checker = fibril_create(uhci_debug_checker, instance); 75 fibril_add_ready(instance->debug_checker); 76 77 uhci_init_hw(instance); 78 79 return EOK; 80 } 81 /*----------------------------------------------------------------------------*/ 82 void uhci_init_hw(uhci_t *instance) 83 { 84 const uintptr_t pa = (uintptr_t)addr_to_phys(instance->frame_list); 85 pio_write_32(&instance->registers->flbaseadd, (uint32_t)pa); 86 87 /* Start the hc with large(64B) packet FSBR */ 88 pio_write_16(&instance->registers->usbcmd, 89 UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET); 90 usb_log_debug("Started UHCI HC.\n"); 91 } 92 /*----------------------------------------------------------------------------*/ 93 int uhci_init_mem_structures(uhci_t *instance) 94 { 95 assert(instance); 68 96 /* init transfer lists */ 69 ret = uhci_init_transfer_lists(instance);70 CHECK_RET_RETURN( "Failed to initialize transfer lists.\n");97 int ret = uhci_init_transfer_lists(instance); 98 CHECK_RET_RETURN(ret, "Failed to initialize transfer lists.\n"); 71 99 usb_log_debug("Transfer lists initialized.\n"); 72 100 73 101 /* frame list initialization */ 74 102 usb_log_debug("Initializing frame list.\n"); 75 103 instance->frame_list = get_page(); 76 104 ret = instance ? EOK : ENOMEM; 77 CHECK_RET_RETURN( "Failed to get frame list page.\n");105 CHECK_RET_RETURN(ret, "Failed to get frame list page.\n"); 78 106 79 107 /* initialize all frames to point to the first queue head */ … … 86 114 } 87 115 88 const uintptr_t pa = (uintptr_t)addr_to_phys(instance->frame_list); 89 pio_write_32(&instance->registers->flbaseadd, (uint32_t)pa); 90 91 list_initialize(&instance->batch_list); 92 fibril_mutex_initialize(&instance->batch_list_mutex); 93 94 instance->cleaner = fibril_create(uhci_clean_finished, instance); 95 fibril_add_ready(instance->cleaner); 96 97 instance->debug_checker = fibril_create(uhci_debug_checker, instance); 98 fibril_add_ready(instance->debug_checker); 99 100 /* Start the hc with large(64B) packet FSBR */ 101 pio_write_16(&instance->registers->usbcmd, 102 UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET); 103 usb_log_debug("Started UHCI HC.\n"); 104 105 uint16_t cmd = pio_read_16(&instance->registers->usbcmd); 106 cmd |= UHCI_CMD_DEBUG; 107 pio_write_16(&instance->registers->usbcmd, cmd); 116 /* init address keeper(libusb) */ 117 usb_address_keeping_init(&instance->address_manager, USB11_ADDRESS_MAX); 118 usb_log_debug("Initialized address manager.\n"); 108 119 109 120 return EOK; … … 114 125 assert(instance); 115 126 116 /* initialize */127 /* initialize TODO: check errors */ 117 128 int ret; 118 129 ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL"); … … 146 157 instance->transfers[1][USB_TRANSFER_CONTROL] = 147 158 &instance->transfers_control_slow; 148 instance->transfers[0][USB_TRANSFER_ CONTROL] =149 &instance->transfers_ control_full;159 instance->transfers[0][USB_TRANSFER_BULK] = 160 &instance->transfers_bulk_full; 150 161 151 162 return EOK; -
uspace/drv/uhci-hcd/uhci.h
r2e85b3c rf4c87aa9 81 81 link_pointer_t *frame_list; 82 82 83 link_t batch_list;84 fibril_mutex_t batch_list_mutex;85 86 83 transfer_list_t transfers_bulk_full; 87 84 transfer_list_t transfers_control_full;
Note:
See TracChangeset
for help on using the changeset viewer.