test fork
Dependencies: SPI_TFTx2 SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2 mbed
Fork of CANary_9341 by
USBHostLite/usbhost_lpc17xx.h@187:447874df5cbe, 2014-05-12 (annotated)
- Committer:
- TickTock
- Date:
- Mon May 12 11:32:13 2014 +0000
- Revision:
- 187:447874df5cbe
- Parent:
- 146:88f7bda79d8e
Added SPI_TFTx2 library. Breaks compilation although not directly referenced.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TickTock | 146:88f7bda79d8e | 1 | /* |
TickTock | 146:88f7bda79d8e | 2 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 3 | * NXP USB Host Stack |
TickTock | 146:88f7bda79d8e | 4 | * |
TickTock | 146:88f7bda79d8e | 5 | * (c) Copyright 2008, NXP SemiConductors |
TickTock | 146:88f7bda79d8e | 6 | * (c) Copyright 2008, OnChip Technologies LLC |
TickTock | 146:88f7bda79d8e | 7 | * All Rights Reserved |
TickTock | 146:88f7bda79d8e | 8 | * |
TickTock | 146:88f7bda79d8e | 9 | * www.nxp.com |
TickTock | 146:88f7bda79d8e | 10 | * www.onchiptech.com |
TickTock | 146:88f7bda79d8e | 11 | * |
TickTock | 146:88f7bda79d8e | 12 | * File : usbhost_lpc17xx.h |
TickTock | 146:88f7bda79d8e | 13 | * Programmer(s) : Ravikanth.P |
TickTock | 146:88f7bda79d8e | 14 | * Version : |
TickTock | 146:88f7bda79d8e | 15 | * |
TickTock | 146:88f7bda79d8e | 16 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 17 | */ |
TickTock | 146:88f7bda79d8e | 18 | |
TickTock | 146:88f7bda79d8e | 19 | #ifndef USBHOST_LPC17xx_H |
TickTock | 146:88f7bda79d8e | 20 | #define USBHOST_LPC17xx_H |
TickTock | 146:88f7bda79d8e | 21 | |
TickTock | 146:88f7bda79d8e | 22 | /* |
TickTock | 146:88f7bda79d8e | 23 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 24 | * INCLUDE HEADER FILES |
TickTock | 146:88f7bda79d8e | 25 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 26 | */ |
TickTock | 146:88f7bda79d8e | 27 | |
TickTock | 146:88f7bda79d8e | 28 | #include "usbhost_inc.h" |
TickTock | 146:88f7bda79d8e | 29 | |
TickTock | 146:88f7bda79d8e | 30 | /* |
TickTock | 146:88f7bda79d8e | 31 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 32 | * PRINT CONFIGURATION |
TickTock | 146:88f7bda79d8e | 33 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 34 | */ |
TickTock | 146:88f7bda79d8e | 35 | |
TickTock | 146:88f7bda79d8e | 36 | #define PRINT_ENABLE 0 |
TickTock | 146:88f7bda79d8e | 37 | |
TickTock | 146:88f7bda79d8e | 38 | #if PRINT_ENABLE |
TickTock | 146:88f7bda79d8e | 39 | #define PRINT_Log(...) printf(__VA_ARGS__) |
TickTock | 146:88f7bda79d8e | 40 | #define PRINT_Err(rc) printf("ERROR: In %s at Line %u - rc = %d\n", __FUNCTION__, __LINE__, rc) |
TickTock | 146:88f7bda79d8e | 41 | |
TickTock | 146:88f7bda79d8e | 42 | #else |
TickTock | 146:88f7bda79d8e | 43 | #define PRINT_Log(...) do {} while(0) |
TickTock | 146:88f7bda79d8e | 44 | #define PRINT_Err(rc) do {} while(0) |
TickTock | 146:88f7bda79d8e | 45 | |
TickTock | 146:88f7bda79d8e | 46 | #endif |
TickTock | 146:88f7bda79d8e | 47 | |
TickTock | 146:88f7bda79d8e | 48 | /* |
TickTock | 146:88f7bda79d8e | 49 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 50 | * GENERAL DEFINITIONS |
TickTock | 146:88f7bda79d8e | 51 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 52 | */ |
TickTock | 146:88f7bda79d8e | 53 | |
TickTock | 146:88f7bda79d8e | 54 | #define DESC_LENGTH(x) x[0] |
TickTock | 146:88f7bda79d8e | 55 | #define DESC_TYPE(x) x[1] |
TickTock | 146:88f7bda79d8e | 56 | |
TickTock | 146:88f7bda79d8e | 57 | |
TickTock | 146:88f7bda79d8e | 58 | #define HOST_GET_DESCRIPTOR(descType, descIndex, data, length) \ |
TickTock | 146:88f7bda79d8e | 59 | Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR, \ |
TickTock | 146:88f7bda79d8e | 60 | (descType << 8)|(descIndex), 0, length, data) |
TickTock | 146:88f7bda79d8e | 61 | |
TickTock | 146:88f7bda79d8e | 62 | #define HOST_SET_ADDRESS(new_addr) \ |
TickTock | 146:88f7bda79d8e | 63 | Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_ADDRESS, \ |
TickTock | 146:88f7bda79d8e | 64 | new_addr, 0, 0, NULL) |
TickTock | 146:88f7bda79d8e | 65 | |
TickTock | 146:88f7bda79d8e | 66 | #define USBH_SET_CONFIGURATION(configNum) \ |
TickTock | 146:88f7bda79d8e | 67 | Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_CONFIGURATION, \ |
TickTock | 146:88f7bda79d8e | 68 | configNum, 0, 0, NULL) |
TickTock | 146:88f7bda79d8e | 69 | |
TickTock | 146:88f7bda79d8e | 70 | #define USBH_SET_INTERFACE(ifNum, altNum) \ |
TickTock | 146:88f7bda79d8e | 71 | Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_INTERFACE, SET_INTERFACE, \ |
TickTock | 146:88f7bda79d8e | 72 | altNum, ifNum, 0, NULL) |
TickTock | 146:88f7bda79d8e | 73 | |
TickTock | 146:88f7bda79d8e | 74 | /* |
TickTock | 146:88f7bda79d8e | 75 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 76 | * OHCI OPERATIONAL REGISTER FIELD DEFINITIONS |
TickTock | 146:88f7bda79d8e | 77 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 78 | */ |
TickTock | 146:88f7bda79d8e | 79 | |
TickTock | 146:88f7bda79d8e | 80 | /* ------------------ HcControl Register --------------------- */ |
TickTock | 146:88f7bda79d8e | 81 | #define OR_CONTROL_CLE 0x00000010 |
TickTock | 146:88f7bda79d8e | 82 | #define OR_CONTROL_BLE 0x00000020 |
TickTock | 146:88f7bda79d8e | 83 | #define OR_CONTROL_HCFS 0x000000C0 |
TickTock | 146:88f7bda79d8e | 84 | #define OR_CONTROL_HC_OPER 0x00000080 |
TickTock | 146:88f7bda79d8e | 85 | /* ----------------- HcCommandStatus Register ----------------- */ |
TickTock | 146:88f7bda79d8e | 86 | #define OR_CMD_STATUS_HCR 0x00000001 |
TickTock | 146:88f7bda79d8e | 87 | #define OR_CMD_STATUS_CLF 0x00000002 |
TickTock | 146:88f7bda79d8e | 88 | #define OR_CMD_STATUS_BLF 0x00000004 |
TickTock | 146:88f7bda79d8e | 89 | /* --------------- HcInterruptStatus Register ----------------- */ |
TickTock | 146:88f7bda79d8e | 90 | #define OR_INTR_STATUS_WDH 0x00000002 |
TickTock | 146:88f7bda79d8e | 91 | #define OR_INTR_STATUS_RHSC 0x00000040 |
TickTock | 146:88f7bda79d8e | 92 | /* --------------- HcInterruptEnable Register ----------------- */ |
TickTock | 146:88f7bda79d8e | 93 | #define OR_INTR_ENABLE_WDH 0x00000002 |
TickTock | 146:88f7bda79d8e | 94 | #define OR_INTR_ENABLE_RHSC 0x00000040 |
TickTock | 146:88f7bda79d8e | 95 | #define OR_INTR_ENABLE_MIE 0x80000000 |
TickTock | 146:88f7bda79d8e | 96 | /* ---------------- HcRhDescriptorA Register ------------------ */ |
TickTock | 146:88f7bda79d8e | 97 | #define OR_RH_STATUS_LPSC 0x00010000 |
TickTock | 146:88f7bda79d8e | 98 | #define OR_RH_STATUS_DRWE 0x00008000 |
TickTock | 146:88f7bda79d8e | 99 | /* -------------- HcRhPortStatus[1:NDP] Register -------------- */ |
TickTock | 146:88f7bda79d8e | 100 | #define OR_RH_PORT_CCS 0x00000001 |
TickTock | 146:88f7bda79d8e | 101 | #define OR_RH_PORT_PRS 0x00000010 |
TickTock | 146:88f7bda79d8e | 102 | #define OR_RH_PORT_CSC 0x00010000 |
TickTock | 146:88f7bda79d8e | 103 | #define OR_RH_PORT_PRSC 0x00100000 |
TickTock | 146:88f7bda79d8e | 104 | |
TickTock | 146:88f7bda79d8e | 105 | |
TickTock | 146:88f7bda79d8e | 106 | /* |
TickTock | 146:88f7bda79d8e | 107 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 108 | * FRAME INTERVAL |
TickTock | 146:88f7bda79d8e | 109 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 110 | */ |
TickTock | 146:88f7bda79d8e | 111 | |
TickTock | 146:88f7bda79d8e | 112 | #define FI 0x2EDF /* 12000 bits per frame (-1) */ |
TickTock | 146:88f7bda79d8e | 113 | #define DEFAULT_FMINTERVAL ((((6 * (FI - 210)) / 7) << 16) | FI) |
TickTock | 146:88f7bda79d8e | 114 | |
TickTock | 146:88f7bda79d8e | 115 | /* |
TickTock | 146:88f7bda79d8e | 116 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 117 | * TRANSFER DESCRIPTOR CONTROL FIELDS |
TickTock | 146:88f7bda79d8e | 118 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 119 | */ |
TickTock | 146:88f7bda79d8e | 120 | |
TickTock | 146:88f7bda79d8e | 121 | #define TD_ROUNDING (USB_INT32U) (0x00040000) /* Buffer Rounding */ |
TickTock | 146:88f7bda79d8e | 122 | #define TD_SETUP (USB_INT32U)(0) /* Direction of Setup Packet */ |
TickTock | 146:88f7bda79d8e | 123 | #define TD_IN (USB_INT32U)(0x00100000) /* Direction In */ |
TickTock | 146:88f7bda79d8e | 124 | #define TD_OUT (USB_INT32U)(0x00080000) /* Direction Out */ |
TickTock | 146:88f7bda79d8e | 125 | #define TD_DELAY_INT(x) (USB_INT32U)((x) << 21) /* Delay Interrupt */ |
TickTock | 146:88f7bda79d8e | 126 | #define TD_TOGGLE_0 (USB_INT32U)(0x02000000) /* Toggle 0 */ |
TickTock | 146:88f7bda79d8e | 127 | #define TD_TOGGLE_1 (USB_INT32U)(0x03000000) /* Toggle 1 */ |
TickTock | 146:88f7bda79d8e | 128 | #define TD_CC (USB_INT32U)(0xF0000000) /* Completion Code */ |
TickTock | 146:88f7bda79d8e | 129 | |
TickTock | 146:88f7bda79d8e | 130 | /* |
TickTock | 146:88f7bda79d8e | 131 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 132 | * USB STANDARD REQUEST DEFINITIONS |
TickTock | 146:88f7bda79d8e | 133 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 134 | */ |
TickTock | 146:88f7bda79d8e | 135 | |
TickTock | 146:88f7bda79d8e | 136 | #define USB_DESCRIPTOR_TYPE_DEVICE 1 |
TickTock | 146:88f7bda79d8e | 137 | #define USB_DESCRIPTOR_TYPE_CONFIGURATION 2 |
TickTock | 146:88f7bda79d8e | 138 | #define USB_DESCRIPTOR_TYPE_INTERFACE 4 |
TickTock | 146:88f7bda79d8e | 139 | #define USB_DESCRIPTOR_TYPE_ENDPOINT 5 |
TickTock | 146:88f7bda79d8e | 140 | /* ----------- Control RequestType Fields ----------- */ |
TickTock | 146:88f7bda79d8e | 141 | #define USB_DEVICE_TO_HOST 0x80 |
TickTock | 146:88f7bda79d8e | 142 | #define USB_HOST_TO_DEVICE 0x00 |
TickTock | 146:88f7bda79d8e | 143 | #define USB_REQUEST_TYPE_CLASS 0x20 |
TickTock | 146:88f7bda79d8e | 144 | #define USB_RECIPIENT_DEVICE 0x00 |
TickTock | 146:88f7bda79d8e | 145 | #define USB_RECIPIENT_INTERFACE 0x01 |
TickTock | 146:88f7bda79d8e | 146 | /* -------------- USB Standard Requests -------------- */ |
TickTock | 146:88f7bda79d8e | 147 | #define SET_ADDRESS 5 |
TickTock | 146:88f7bda79d8e | 148 | #define GET_DESCRIPTOR 6 |
TickTock | 146:88f7bda79d8e | 149 | #define SET_CONFIGURATION 9 |
TickTock | 146:88f7bda79d8e | 150 | #define SET_INTERFACE 11 |
TickTock | 146:88f7bda79d8e | 151 | |
TickTock | 146:88f7bda79d8e | 152 | /* |
TickTock | 146:88f7bda79d8e | 153 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 154 | * TYPE DEFINITIONS |
TickTock | 146:88f7bda79d8e | 155 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 156 | */ |
TickTock | 146:88f7bda79d8e | 157 | |
TickTock | 146:88f7bda79d8e | 158 | typedef struct hcEd { /* ----------- HostController EndPoint Descriptor ------------- */ |
TickTock | 146:88f7bda79d8e | 159 | volatile USB_INT32U Control; /* Endpoint descriptor control */ |
TickTock | 146:88f7bda79d8e | 160 | volatile USB_INT32U TailTd; /* Physical address of tail in Transfer descriptor list */ |
TickTock | 146:88f7bda79d8e | 161 | volatile USB_INT32U HeadTd; /* Physcial address of head in Transfer descriptor list */ |
TickTock | 146:88f7bda79d8e | 162 | volatile USB_INT32U Next; /* Physical address of next Endpoint descriptor */ |
TickTock | 146:88f7bda79d8e | 163 | } HCED; |
TickTock | 146:88f7bda79d8e | 164 | |
TickTock | 146:88f7bda79d8e | 165 | typedef struct hcTd { /* ------------ HostController Transfer Descriptor ------------ */ |
TickTock | 146:88f7bda79d8e | 166 | volatile USB_INT32U Control; /* Transfer descriptor control */ |
TickTock | 146:88f7bda79d8e | 167 | volatile USB_INT32U CurrBufPtr; /* Physical address of current buffer pointer */ |
TickTock | 146:88f7bda79d8e | 168 | volatile USB_INT32U Next; /* Physical pointer to next Transfer Descriptor */ |
TickTock | 146:88f7bda79d8e | 169 | volatile USB_INT32U BufEnd; /* Physical address of end of buffer */ |
TickTock | 146:88f7bda79d8e | 170 | } HCTD; |
TickTock | 146:88f7bda79d8e | 171 | |
TickTock | 146:88f7bda79d8e | 172 | typedef struct hcca { /* ----------- Host Controller Communication Area ------------ */ |
TickTock | 146:88f7bda79d8e | 173 | volatile USB_INT32U IntTable[32]; /* Interrupt Table */ |
TickTock | 146:88f7bda79d8e | 174 | volatile USB_INT32U FrameNumber; /* Frame Number */ |
TickTock | 146:88f7bda79d8e | 175 | volatile USB_INT32U DoneHead; /* Done Head */ |
TickTock | 146:88f7bda79d8e | 176 | volatile USB_INT08U Reserved[116]; /* Reserved for future use */ |
TickTock | 146:88f7bda79d8e | 177 | volatile USB_INT08U Unknown[4]; /* Unused */ |
TickTock | 146:88f7bda79d8e | 178 | } HCCA; |
TickTock | 146:88f7bda79d8e | 179 | |
TickTock | 146:88f7bda79d8e | 180 | /* |
TickTock | 146:88f7bda79d8e | 181 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 182 | * EXTERN DECLARATIONS |
TickTock | 146:88f7bda79d8e | 183 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 184 | */ |
TickTock | 146:88f7bda79d8e | 185 | |
TickTock | 146:88f7bda79d8e | 186 | extern volatile HCED *EDBulkIn; /* BulkIn endpoint descriptor structure */ |
TickTock | 146:88f7bda79d8e | 187 | extern volatile HCED *EDBulkOut; /* BulkOut endpoint descriptor structure */ |
TickTock | 146:88f7bda79d8e | 188 | extern volatile HCTD *TDHead; /* Head transfer descriptor structure */ |
TickTock | 146:88f7bda79d8e | 189 | extern volatile HCTD *TDTail; /* Tail transfer descriptor structure */ |
TickTock | 146:88f7bda79d8e | 190 | extern volatile USB_INT08U *TDBuffer; /* Current Buffer Pointer of transfer descriptor */ |
TickTock | 146:88f7bda79d8e | 191 | |
TickTock | 146:88f7bda79d8e | 192 | /* |
TickTock | 146:88f7bda79d8e | 193 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 194 | * FUNCTION PROTOTYPES |
TickTock | 146:88f7bda79d8e | 195 | ************************************************************************************************************** |
TickTock | 146:88f7bda79d8e | 196 | */ |
TickTock | 146:88f7bda79d8e | 197 | |
TickTock | 146:88f7bda79d8e | 198 | void Host_Init (void); |
TickTock | 146:88f7bda79d8e | 199 | |
TickTock | 146:88f7bda79d8e | 200 | extern "C" void USB_IRQHandler(void) __irq; |
TickTock | 146:88f7bda79d8e | 201 | |
TickTock | 146:88f7bda79d8e | 202 | USB_INT32S Host_EnumDev (void); |
TickTock | 146:88f7bda79d8e | 203 | |
TickTock | 146:88f7bda79d8e | 204 | USB_INT32S Host_ProcessTD(volatile HCED *ed, |
TickTock | 146:88f7bda79d8e | 205 | volatile USB_INT32U token, |
TickTock | 146:88f7bda79d8e | 206 | volatile USB_INT08U *buffer, |
TickTock | 146:88f7bda79d8e | 207 | USB_INT32U buffer_len); |
TickTock | 146:88f7bda79d8e | 208 | |
TickTock | 146:88f7bda79d8e | 209 | void Host_DelayUS ( USB_INT32U delay); |
TickTock | 146:88f7bda79d8e | 210 | void Host_DelayMS ( USB_INT32U delay); |
TickTock | 146:88f7bda79d8e | 211 | |
TickTock | 146:88f7bda79d8e | 212 | |
TickTock | 146:88f7bda79d8e | 213 | void Host_TDInit (volatile HCTD *td); |
TickTock | 146:88f7bda79d8e | 214 | void Host_EDInit (volatile HCED *ed); |
TickTock | 146:88f7bda79d8e | 215 | void Host_HCCAInit (volatile HCCA *hcca); |
TickTock | 146:88f7bda79d8e | 216 | |
TickTock | 146:88f7bda79d8e | 217 | USB_INT32S Host_CtrlRecv ( USB_INT08U bm_request_type, |
TickTock | 146:88f7bda79d8e | 218 | USB_INT08U b_request, |
TickTock | 146:88f7bda79d8e | 219 | USB_INT16U w_value, |
TickTock | 146:88f7bda79d8e | 220 | USB_INT16U w_index, |
TickTock | 146:88f7bda79d8e | 221 | USB_INT16U w_length, |
TickTock | 146:88f7bda79d8e | 222 | volatile USB_INT08U *buffer); |
TickTock | 146:88f7bda79d8e | 223 | |
TickTock | 146:88f7bda79d8e | 224 | USB_INT32S Host_CtrlSend ( USB_INT08U bm_request_type, |
TickTock | 146:88f7bda79d8e | 225 | USB_INT08U b_request, |
TickTock | 146:88f7bda79d8e | 226 | USB_INT16U w_value, |
TickTock | 146:88f7bda79d8e | 227 | USB_INT16U w_index, |
TickTock | 146:88f7bda79d8e | 228 | USB_INT16U w_length, |
TickTock | 146:88f7bda79d8e | 229 | volatile USB_INT08U *buffer); |
TickTock | 146:88f7bda79d8e | 230 | |
TickTock | 146:88f7bda79d8e | 231 | void Host_FillSetup( USB_INT08U bm_request_type, |
TickTock | 146:88f7bda79d8e | 232 | USB_INT08U b_request, |
TickTock | 146:88f7bda79d8e | 233 | USB_INT16U w_value, |
TickTock | 146:88f7bda79d8e | 234 | USB_INT16U w_index, |
TickTock | 146:88f7bda79d8e | 235 | USB_INT16U w_length); |
TickTock | 146:88f7bda79d8e | 236 | |
TickTock | 146:88f7bda79d8e | 237 | |
TickTock | 146:88f7bda79d8e | 238 | void Host_WDHWait (void); |
TickTock | 146:88f7bda79d8e | 239 | |
TickTock | 146:88f7bda79d8e | 240 | |
TickTock | 146:88f7bda79d8e | 241 | USB_INT32U ReadLE32U (volatile USB_INT08U *pmem); |
TickTock | 146:88f7bda79d8e | 242 | void WriteLE32U (volatile USB_INT08U *pmem, |
TickTock | 146:88f7bda79d8e | 243 | USB_INT32U val); |
TickTock | 146:88f7bda79d8e | 244 | USB_INT16U ReadLE16U (volatile USB_INT08U *pmem); |
TickTock | 146:88f7bda79d8e | 245 | void WriteLE16U (volatile USB_INT08U *pmem, |
TickTock | 146:88f7bda79d8e | 246 | USB_INT16U val); |
TickTock | 146:88f7bda79d8e | 247 | USB_INT32U ReadBE32U (volatile USB_INT08U *pmem); |
TickTock | 146:88f7bda79d8e | 248 | void WriteBE32U (volatile USB_INT08U *pmem, |
TickTock | 146:88f7bda79d8e | 249 | USB_INT32U val); |
TickTock | 146:88f7bda79d8e | 250 | USB_INT16U ReadBE16U (volatile USB_INT08U *pmem); |
TickTock | 146:88f7bda79d8e | 251 | void WriteBE16U (volatile USB_INT08U *pmem, |
TickTock | 146:88f7bda79d8e | 252 | USB_INT16U val); |
TickTock | 146:88f7bda79d8e | 253 | |
TickTock | 146:88f7bda79d8e | 254 | #endif |