Root/target/linux/lantiq/files/drivers/usb/ifxhcd/ifxusb_cif.h

1/*****************************************************************************
2 ** FILE NAME : ifxusb_cif.h
3 ** PROJECT : IFX USB sub-system V3
4 ** MODULES : IFX USB sub-system Host and Device driver
5 ** SRC VERSION : 1.0
6 ** DATE : 1/Jan/2009
7 ** AUTHOR : Chen, Howard
8 ** DESCRIPTION : The Core Interface provides basic services for accessing and
9 ** managing the IFX USB hardware. These services are used by both the
10 ** Host Controller Driver and the Peripheral Controller Driver.
11 ** FUNCTIONS :
12 ** COMPILER : gcc
13 ** REFERENCE : IFX hardware ref handbook for each plateforms
14 ** COPYRIGHT :
15 ** Version Control Section **
16 ** $Author$
17 ** $Date$
18 ** $Revisions$
19 ** $Log$ Revision history
20*****************************************************************************/
21
22/*!
23 \defgroup IFXUSB_DRIVER_V3 IFX USB SS Project
24 \brief IFX USB subsystem V3.x
25 */
26
27/*!
28 \defgroup IFXUSB_CIF Core Interface APIs
29 \ingroup IFXUSB_DRIVER_V3
30 \brief The Core Interface provides basic services for accessing and
31        managing the IFXUSB hardware. These services are used by both the
32        Host Controller Driver and the Peripheral Controller Driver.
33 */
34
35
36/*!
37 \file ifxusb_cif.h
38 \ingroup IFXUSB_DRIVER_V3
39 \brief This file contains the interface to the IFX USB Core.
40 */
41
42#if !defined(__IFXUSB_CIF_H__)
43#define __IFXUSB_CIF_H__
44
45#include <linux/workqueue.h>
46
47#include <linux/version.h>
48#include <asm/param.h>
49
50#include "ifxusb_plat.h"
51#include "ifxusb_regs.h"
52
53#ifdef __DEBUG__
54    #include "linux/timer.h"
55#endif
56
57///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
58
59#define IFXUSB_PARAM_SPEED_HIGH 0
60#define IFXUSB_PARAM_SPEED_FULL 1
61
62#define IFXUSB_EP_SPEED_LOW 0
63#define IFXUSB_EP_SPEED_FULL 1
64#define IFXUSB_EP_SPEED_HIGH 2
65
66#define IFXUSB_EP_TYPE_CTRL 0
67#define IFXUSB_EP_TYPE_ISOC 1
68#define IFXUSB_EP_TYPE_BULK 2
69#define IFXUSB_EP_TYPE_INTR 3
70
71#define IFXUSB_HC_PID_DATA0 0
72#define IFXUSB_HC_PID_DATA2 1
73#define IFXUSB_HC_PID_DATA1 2
74#define IFXUSB_HC_PID_MDATA 3
75#define IFXUSB_HC_PID_SETUP 3
76
77
78/*!
79 \addtogroup IFXUSB_CIF
80 */
81/*@{*/
82
83/*!
84 \struct ifxusb_params
85 \brief IFXUSB Parameters structure.
86       This structure is used for both importing from insmod stage and run-time storage.
87       These parameters define how the IFXUSB controller should be configured.
88 */
89typedef struct ifxusb_params
90{
91    int32_t dma_burst_size; /*!< The DMA Burst size (applicable only for Internal DMA
92                                  Mode). 0(for single), 1(incr), 4(incr4), 8(incr8) 16(incr16)
93                              */
94                             /* Translate this to GAHBCFG values */
95    int32_t speed; /*!< Specifies the maximum speed of operation in host and device mode.
96                                  The actual speed depends on the speed of the attached device and
97                                  the value of phy_type. The actual speed depends on the speed of the
98                                  attached device.
99                                  0 - High Speed (default)
100                                  1 - Full Speed
101                              */
102
103    int32_t data_fifo_size; /*!< Total number of dwords in the data FIFO memory. This
104                                   memory includes the Rx FIFO, non-periodic Tx FIFO, and periodic
105                                   Tx FIFOs.
106                                   32 to 32768
107                               */
108    #ifdef __IS_DEVICE__
109        int32_t rx_fifo_size; /*!< Number of dwords in the Rx FIFO in device mode.
110                                   16 to 32768
111                               */
112
113
114        int32_t tx_fifo_size[MAX_EPS_CHANNELS]; /*!< Number of dwords in each of the Tx FIFOs in device mode.
115                                                     4 to 768
116                                                 */
117        #ifdef __DED_FIFO__
118            int32_t thr_ctl; /*!< Threshold control on/off */
119            int32_t tx_thr_length; /*!< Threshold length for Tx */
120            int32_t rx_thr_length; /*!< Threshold length for Rx*/
121        #endif
122    #else //__IS_HOST__
123        int32_t host_channels; /*!< The number of host channel registers to use.
124                                         1 to 16
125                                     */
126
127        int32_t rx_fifo_size; /*!< Number of dwords in the Rx FIFO in host mode.
128                                        16 to 32768
129                                     */
130
131        int32_t nperio_tx_fifo_size;/*!< Number of dwords in the non-periodic Tx FIFO in host mode.
132                                         16 to 32768
133                                     */
134
135        int32_t perio_tx_fifo_size; /*!< Number of dwords in the host periodic Tx FIFO.
136                                         16 to 32768
137                                     */
138    #endif //__IS_HOST__
139
140    int32_t max_transfer_size; /*!< The maximum transfer size supported in bytes.
141                                         2047 to 65,535
142                                     */
143
144    int32_t max_packet_count; /*!< The maximum number of packets in a transfer.
145                                         15 to 511 (default 511)
146                                     */
147    int32_t phy_utmi_width; /*!< Specifies the UTMI+ Data Width.
148                                         8 or 16 bits (default 16)
149                                     */
150
151    int32_t turn_around_time_hs; /*!< Specifies the Turn-Around time at HS*/
152    int32_t turn_around_time_fs; /*!< Specifies the Turn-Around time at FS*/
153
154    int32_t timeout_cal_hs; /*!< Specifies the Timeout_Calibration at HS*/
155    int32_t timeout_cal_fs; /*!< Specifies the Timeout_Calibration at FS*/
156} ifxusb_params_t;
157
158///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
159///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
160
161/*!
162 \struct ifxusb_core_if
163 \brief The ifx_core_if structure contains information needed to manage
164       the IFX USB controller acting in either host or device mode. It
165       represents the programming view of the controller as a whole.
166 */
167typedef struct ifxusb_core_if
168{
169    ifxusb_params_t params; /*!< Run-time Parameters */
170
171    uint8_t core_no; /*!< core number (used as id when multi-core case */
172    char *core_name; /*!< core name used for registration and informative purpose*/
173    int irq; /*!< irq number this core is hooked */
174
175    /*****************************************************************
176     * Structures and pointers to physical register interface.
177     *****************************************************************/
178    /** Core Global registers starting at offset 000h. */
179    ifxusb_core_global_regs_t *core_global_regs; /*!< pointer to Core Global Registers, offset at 000h */
180
181    /** Host-specific registers */
182    #ifdef __IS_HOST__
183        /** Host Global Registers starting at offset 400h.*/
184        ifxusb_host_global_regs_t *host_global_regs; /*!< pointer to Host Global Registers, offset at 400h */
185            #define IFXUSB_HOST_GLOBAL_REG_OFFSET 0x400
186        /** Host Port 0 Control and Status Register */
187        volatile uint32_t *hprt0; /*!< pointer to HPRT0 Registers, offset at 440h */
188            #define IFXUSB_HOST_PORT_REGS_OFFSET 0x440
189        /** Host Channel Specific Registers at offsets 500h-5FCh. */
190        ifxusb_hc_regs_t *hc_regs[MAX_EPS_CHANNELS]; /*!< pointer to Host-Channel n Registers, offset at 500h */
191            #define IFXUSB_HOST_CHAN_REGS_OFFSET 0x500
192            #define IFXUSB_CHAN_REGS_OFFSET 0x20
193    #endif
194
195    /** Device-specific registers */
196    #ifdef __IS_DEVICE__
197        /** Device Global Registers starting at offset 800h */
198        ifxusb_device_global_regs_t *dev_global_regs; /*!< pointer to Device Global Registers, offset at 800h */
199            #define IFXUSB_DEV_GLOBAL_REG_OFFSET 0x800
200
201        /** Device Logical IN Endpoint-Specific Registers 900h-AFCh */
202        ifxusb_dev_in_ep_regs_t *in_ep_regs[MAX_EPS_CHANNELS]; /*!< pointer to Device IN-EP Registers, offset at 900h */
203            #define IFXUSB_DEV_IN_EP_REG_OFFSET 0x900
204            #define IFXUSB_EP_REG_OFFSET 0x20
205        /** Device Logical OUT Endpoint-Specific Registers B00h-CFCh */
206        ifxusb_dev_out_ep_regs_t *out_ep_regs[MAX_EPS_CHANNELS];/*!< pointer to Device OUT-EP Registers, offset at 900h */
207            #define IFXUSB_DEV_OUT_EP_REG_OFFSET 0xB00
208    #endif
209
210    /** Power and Clock Gating Control Register */
211    volatile uint32_t *pcgcctl; /*!< pointer to Power and Clock Gating Control Registers, offset at E00h */
212        #define IFXUSB_PCGCCTL_OFFSET 0xE00
213
214    /** Push/pop addresses for endpoints or host channels.*/
215    uint32_t *data_fifo[MAX_EPS_CHANNELS]; /*!< pointer to FIFO access windows, offset at 1000h */
216        #define IFXUSB_DATA_FIFO_OFFSET 0x1000
217        #define IFXUSB_DATA_FIFO_SIZE 0x1000
218
219    uint32_t *data_fifo_dbg; /*!< pointer to FIFO debug windows, offset at 1000h */
220
221    /** Hardware Configuration -- stored here for convenience.*/
222    hwcfg1_data_t hwcfg1; /*!< preserved Hardware Configuration 1 */
223    hwcfg2_data_t hwcfg2; /*!< preserved Hardware Configuration 2 */
224    hwcfg3_data_t hwcfg3; /*!< preserved Hardware Configuration 3 */
225    hwcfg4_data_t hwcfg4; /*!< preserved Hardware Configuration 3 */
226    uint32_t snpsid; /*!< preserved SNPSID */
227
228    /*****************************************************************
229     * Run-time informations.
230     *****************************************************************/
231    /* Set to 1 if the core PHY interface bits in USBCFG have been initialized. */
232    uint8_t phy_init_done; /*!< indicated PHY is initialized. */
233
234    #ifdef __IS_HOST__
235        uint8_t queuing_high_bandwidth; /*!< Host mode, Queueing High Bandwidth. */
236    #endif
237} ifxusb_core_if_t;
238
239/*@}*//*IFXUSB_CIF*/
240
241
242/*!
243 \fn void *ifxusb_alloc_buf(size_t size, int clear)
244 \brief This function is called to allocate buffer of specified size.
245        The allocated buffer is mapped into DMA accessable address.
246 \param size Size in BYTE to be allocated
247 \param clear 0: don't do clear after buffer allocated, other: do clear to zero
248 \return 0/NULL: Fail; uncached pointer of allocated buffer
249 \ingroup IFXUSB_CIF
250 */
251extern void *ifxusb_alloc_buf(size_t size, int clear);
252
253/*!
254 \fn void ifxusb_free_buf(void *vaddr)
255 \brief This function is called to free allocated buffer.
256 \param vaddr the uncached pointer of the buffer
257 \ingroup IFXUSB_CIF
258 */
259extern void ifxusb_free_buf(void *vaddr);
260
261/*!
262 \fn int ifxusb_core_if_init(ifxusb_core_if_t *_core_if,
263                        int _irq,
264                        uint32_t _reg_base_addr,
265                        uint32_t _fifo_base_addr,
266                        uint32_t _fifo_dbg_addr)
267 \brief This function is called to initialize the IFXUSB CSR data
268        structures. The register addresses in the device and host
269        structures are initialized from the base address supplied by the
270        caller. The calling function must make the OS calls to get the
271        base address of the IFXUSB controller registers.
272 \param _core_if Pointer of core_if structure
273 \param _irq irq number
274 \param _reg_base_addr Base address of IFXUSB core registers
275 \param _fifo_base_addr Fifo base address
276 \param _fifo_dbg_addr Fifo debug address
277 \return 0: success;
278 \ingroup IFXUSB_CIF
279 */
280extern int ifxusb_core_if_init(ifxusb_core_if_t *_core_if,
281                        int _irq,
282                        uint32_t _reg_base_addr,
283                        uint32_t _fifo_base_addr,
284                        uint32_t _fifo_dbg_addr);
285
286
287/*!
288 \fn void ifxusb_core_if_remove(ifxusb_core_if_t *_core_if)
289 \brief This function free the mapped address in the IFXUSB CSR data structures.
290 \param _core_if Pointer of core_if structure
291 \ingroup IFXUSB_CIF
292 */
293extern void ifxusb_core_if_remove(ifxusb_core_if_t *_core_if);
294
295/*!
296 \fn void ifxusb_enable_global_interrupts( ifxusb_core_if_t *_core_if )
297 \brief This function enbles the controller's Global Interrupt in the AHB Config register.
298 \param _core_if Pointer of core_if structure
299 */
300extern void ifxusb_enable_global_interrupts( ifxusb_core_if_t *_core_if );
301
302/*!
303 \fn void ifxusb_disable_global_interrupts( ifxusb_core_if_t *_core_if )
304 \brief This function disables the controller's Global Interrupt in the AHB Config register.
305 \param _core_if Pointer of core_if structure
306 \ingroup IFXUSB_CIF
307 */
308extern void ifxusb_disable_global_interrupts( ifxusb_core_if_t *_core_if );
309
310/*!
311 \fn void ifxusb_flush_tx_fifo( ifxusb_core_if_t *_core_if, const int _num )
312 \brief Flush a Tx FIFO.
313 \param _core_if Pointer of core_if structure
314 \param _num Tx FIFO to flush. ( 0x10 for ALL TX FIFO )
315 \ingroup IFXUSB_CIF
316 */
317extern void ifxusb_flush_tx_fifo( ifxusb_core_if_t *_core_if, const int _num );
318
319/*!
320 \fn void ifxusb_flush_rx_fifo( ifxusb_core_if_t *_core_if )
321 \brief Flush Rx FIFO.
322 \param _core_if Pointer of core_if structure
323 \ingroup IFXUSB_CIF
324 */
325extern void ifxusb_flush_rx_fifo( ifxusb_core_if_t *_core_if );
326
327/*!
328 \fn void ifxusb_flush_both_fifo( ifxusb_core_if_t *_core_if )
329 \brief Flush ALL Rx and Tx FIFO.
330 \param _core_if Pointer of core_if structure
331 \ingroup IFXUSB_CIF
332 */
333extern void ifxusb_flush_both_fifo( ifxusb_core_if_t *_core_if );
334
335
336/*!
337 \fn int ifxusb_core_soft_reset(ifxusb_core_if_t *_core_if)
338 \brief Do core a soft reset of the core. Be careful with this because it
339        resets all the internal state machines of the core.
340 \param _core_if Pointer of core_if structure
341 \ingroup IFXUSB_CIF
342 */
343extern int ifxusb_core_soft_reset(ifxusb_core_if_t *_core_if);
344
345
346/*!
347 \brief Turn on the USB Core Power
348 \param _core_if Pointer of core_if structure
349 \ingroup IFXUSB_CIF
350*/
351extern void ifxusb_power_on (ifxusb_core_if_t *_core_if);
352
353/*!
354 \fn void ifxusb_power_off (ifxusb_core_if_t *_core_if)
355 \brief Turn off the USB Core Power
356 \param _core_if Pointer of core_if structure
357 \ingroup IFXUSB_CIF
358*/
359extern void ifxusb_power_off (ifxusb_core_if_t *_core_if);
360
361/*!
362 \fn void ifxusb_phy_power_on (ifxusb_core_if_t *_core_if)
363 \brief Turn on the USB PHY Power
364 \param _core_if Pointer of core_if structure
365 \ingroup IFXUSB_CIF
366*/
367extern void ifxusb_phy_power_on (ifxusb_core_if_t *_core_if);
368
369/*!
370 \fn void ifxusb_phy_power_off (ifxusb_core_if_t *_core_if)
371 \brief Turn off the USB PHY Power
372 \param _core_if Pointer of core_if structure
373 \ingroup IFXUSB_CIF
374*/
375extern void ifxusb_phy_power_off (ifxusb_core_if_t *_core_if);
376
377/*!
378 \fn void ifxusb_hard_reset(ifxusb_core_if_t *_core_if)
379 \brief Reset on the USB Core RCU
380 \param _core_if Pointer of core_if structure
381 \ingroup IFXUSB_CIF
382 */
383extern void ifxusb_hard_reset(ifxusb_core_if_t *_core_if);
384
385///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
386
387
388#ifdef __IS_HOST__
389    /*!
390     \fn void ifxusb_host_core_init(ifxusb_core_if_t *_core_if, ifxusb_params_t *_params)
391     \brief This function initializes the IFXUSB controller registers for Host mode.
392            This function flushes the Tx and Rx FIFOs and it flushes any entries in the
393            request queues.
394     \param _core_if Pointer of core_if structure
395     \param _params parameters to be set
396     \ingroup IFXUSB_CIF
397     */
398    extern void ifxusb_host_core_init(ifxusb_core_if_t *_core_if, ifxusb_params_t *_params);
399
400    /*!
401     \fn void ifxusb_host_enable_interrupts(ifxusb_core_if_t *_core_if)
402     \brief This function enables the Host mode interrupts.
403     \param _core_if Pointer of core_if structure
404     \ingroup IFXUSB_CIF
405     */
406    extern void ifxusb_host_enable_interrupts(ifxusb_core_if_t *_core_if);
407
408    /*!
409     \fn void ifxusb_host_disable_interrupts(ifxusb_core_if_t *_core_if)
410     \brief This function disables the Host mode interrupts.
411     \param _core_if Pointer of core_if structure
412     \ingroup IFXUSB_CIF
413     */
414    extern void ifxusb_host_disable_interrupts(ifxusb_core_if_t *_core_if);
415
416    #if defined(__IS_TWINPASS__)
417        extern void ifxusb_enable_afe_oc(void);
418    #endif
419
420    /*!
421     \fn void ifxusb_vbus_init(ifxusb_core_if_t *_core_if)
422     \brief This function init the VBUS control.
423     \param _core_if Pointer of core_if structure
424     \ingroup IFXUSB_CIF
425     */
426    extern void ifxusb_vbus_init(ifxusb_core_if_t *_core_if);
427
428    /*!
429     \fn void ifxusb_vbus_free(ifxusb_core_if_t *_core_if)
430     \brief This function free the VBUS control.
431     \param _core_if Pointer of core_if structure
432     \ingroup IFXUSB_CIF
433     */
434    extern void ifxusb_vbus_free(ifxusb_core_if_t *_core_if);
435
436    /*!
437     \fn void ifxusb_vbus_on(ifxusb_core_if_t *_core_if)
438     \brief Turn on the USB 5V VBus Power
439     \param _core_if Pointer of core_if structure
440     \ingroup IFXUSB_CIF
441     */
442    extern void ifxusb_vbus_on(ifxusb_core_if_t *_core_if);
443
444    /*!
445     \fn void ifxusb_vbus_off(ifxusb_core_if_t *_core_if)
446     \brief Turn off the USB 5V VBus Power
447     \param _core_if Pointer of core_if structure
448     \ingroup IFXUSB_CIF
449     */
450    extern void ifxusb_vbus_off(ifxusb_core_if_t *_core_if);
451
452    /*!
453     \fn int ifxusb_vbus(ifxusb_core_if_t *_core_if)
454     \brief Read Current VBus status
455     \param _core_if Pointer of core_if structure
456     \ingroup IFXUSB_CIF
457     */
458    extern int ifxusb_vbus(ifxusb_core_if_t *_core_if);
459
460    #if defined(__DO_OC_INT__) && defined(__DO_OC_INT_ENABLE__)
461        /*!
462         \fn void ifxusb_oc_int_on(void)
463         \brief Turn on the OC interrupt
464         \ingroup IFXUSB_CIF
465         */
466        extern void ifxusb_oc_int_on(void);
467
468        /*!
469         \fn void ifxusb_oc_int_off(void)
470         \brief Turn off the OC interrupt
471         \ingroup IFXUSB_CIF
472         */
473        extern void ifxusb_oc_int_off(void);
474    #endif //defined(__DO_OC_INT__) && defined(__DO_OC_INT_ENABLE__)
475#endif
476
477///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
478
479
480#ifdef __IS_DEVICE__
481    /*!
482     \fn void ifxusb_dev_enable_interrupts(ifxusb_core_if_t *_core_if)
483     \brief This function enables the Device mode interrupts.
484     \param _core_if Pointer of core_if structure
485     \ingroup IFXUSB_CIF
486     */
487    extern void ifxusb_dev_enable_interrupts(ifxusb_core_if_t *_core_if);
488
489    /*!
490     \fn uint32_t ifxusb_dev_get_frame_number(ifxusb_core_if_t *_core_if)
491     \brief Gets the current USB frame number. This is the frame number from the last SOF packet.
492     \param _core_if Pointer of core_if structure
493     \ingroup IFXUSB_CIF
494     */
495    extern uint32_t ifxusb_dev_get_frame_number(ifxusb_core_if_t *_core_if);
496
497    /*!
498     \fn void ifxusb_dev_ep_set_stall(ifxusb_core_if_t *_core_if, uint8_t _epno, uint8_t _is_in)
499     \brief Set the EP STALL.
500     \param _core_if Pointer of core_if structure
501     \param _epno EP number
502     \param _is_in 1: is IN transfer
503     \ingroup IFXUSB_CIF
504     */
505    extern void ifxusb_dev_ep_set_stall(ifxusb_core_if_t *_core_if, uint8_t _epno, uint8_t _is_in);
506
507    /*!
508     \fn void ifxusb_dev_ep_clear_stall(ifxusb_core_if_t *_core_if, uint8_t _epno, uint8_t _ep_type, uint8_t _is_in)
509     \brief Set the EP STALL.
510     \param _core_if Pointer of core_if structure
511     \param _epno EP number
512     \param _ep_type EP Type
513     \ingroup IFXUSB_CIF
514     */
515    extern void ifxusb_dev_ep_clear_stall(ifxusb_core_if_t *_core_if, uint8_t _epno, uint8_t _ep_type, uint8_t _is_in);
516
517    /*!
518     \fn void ifxusb_dev_core_init(ifxusb_core_if_t *_core_if, ifxusb_params_t *_params)
519     \brief This function initializes the IFXUSB controller registers for Device mode.
520             This function flushes the Tx and Rx FIFOs and it flushes any entries in the
521             request queues.
522             This function validate the imported parameters and store the result in the CIF structure.
523                 After
524     \param _core_if Pointer of core_if structure
525     \param _params structure of inported parameters
526     \ingroup IFXUSB_CIF
527     */
528    extern void ifxusb_dev_core_init(ifxusb_core_if_t *_core_if, ifxusb_params_t *_params);
529#endif
530
531///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
532
533#if defined(__GADGET_LED__) || defined(__HOST_LED__)
534    /*!
535     \fn void ifxusb_led_init(ifxusb_core_if_t *_core_if)
536     \brief This function init the LED control.
537     \param _core_if Pointer of core_if structure
538     \ingroup IFXUSB_CIF
539     */
540    extern void ifxusb_led_init(ifxusb_core_if_t *_core_if);
541
542    /*!
543     \fn void ifxusb_led_free(ifxusb_core_if_t *_core_if)
544     \brief This function free the LED control.
545     \param _core_if Pointer of core_if structure
546     \ingroup IFXUSB_CIF
547     */
548    extern void ifxusb_led_free(ifxusb_core_if_t *_core_if);
549
550    /*!
551     \fn void ifxusb_led(ifxusb_core_if_t *_core_if)
552     \brief This function trigger the LED access.
553     \param _core_if Pointer of core_if structure
554     \ingroup IFXUSB_CIF
555     */
556    extern void ifxusb_led(ifxusb_core_if_t *_core_if);
557#endif
558
559///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
560
561/* internal routines for debugging */
562extern void ifxusb_dump_msg(const u8 *buf, unsigned int length);
563extern void ifxusb_dump_spram(ifxusb_core_if_t *_core_if);
564extern void ifxusb_dump_registers(ifxusb_core_if_t *_core_if);
565extern void ifxusb_clean_spram(ifxusb_core_if_t *_core_if,uint32_t dwords);
566
567///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
568
569static inline uint32_t ifxusb_read_core_intr(ifxusb_core_if_t *_core_if)
570{
571    return (ifxusb_rreg(&_core_if->core_global_regs->gintsts) &
572            (ifxusb_rreg(&_core_if->core_global_regs->gintmsk)
573#ifdef __USE_TIMER_4_SOF__
574             | IFXUSB_SOF_INTR_MASK
575#endif
576            ));
577}
578
579static inline uint32_t ifxusb_read_otg_intr (ifxusb_core_if_t *_core_if)
580{
581    return (ifxusb_rreg (&_core_if->core_global_regs->gotgint));
582}
583
584static inline uint32_t ifxusb_mode(ifxusb_core_if_t *_core_if)
585{
586    return (ifxusb_rreg( &_core_if->core_global_regs->gintsts ) & 0x1);
587}
588static inline uint8_t ifxusb_is_device_mode(ifxusb_core_if_t *_core_if)
589{
590    return (ifxusb_mode(_core_if) != 1);
591}
592static inline uint8_t ifxusb_is_host_mode(ifxusb_core_if_t *_core_if)
593{
594    return (ifxusb_mode(_core_if) == 1);
595}
596
597///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
598
599#ifdef __IS_HOST__
600    static inline uint32_t ifxusb_read_hprt0(ifxusb_core_if_t *_core_if)
601    {
602        hprt0_data_t hprt0;
603        hprt0.d32 = ifxusb_rreg(_core_if->hprt0);
604        hprt0.b.prtena = 0;
605        hprt0.b.prtconndet = 0;
606        hprt0.b.prtenchng = 0;
607        hprt0.b.prtovrcurrchng = 0;
608        return hprt0.d32;
609    }
610
611    static inline uint32_t ifxusb_read_host_all_channels_intr (ifxusb_core_if_t *_core_if)
612    {
613        return (ifxusb_rreg (&_core_if->host_global_regs->haint));
614    }
615
616    static inline uint32_t ifxusb_read_host_channel_intr (ifxusb_core_if_t *_core_if, int hc_num)
617    {
618        return (ifxusb_rreg (&_core_if->hc_regs[hc_num]->hcint));
619    }
620#endif
621
622#ifdef __IS_DEVICE__
623    static inline uint32_t ifxusb_read_dev_all_in_ep_intr(ifxusb_core_if_t *_core_if)
624    {
625        uint32_t v;
626        v = ifxusb_rreg(&_core_if->dev_global_regs->daint) &
627            ifxusb_rreg(&_core_if->dev_global_regs->daintmsk);
628        return (v & 0xffff);
629    }
630
631    static inline uint32_t ifxusb_read_dev_all_out_ep_intr(ifxusb_core_if_t *_core_if)
632    {
633        uint32_t v;
634        v = ifxusb_rreg(&_core_if->dev_global_regs->daint) &
635            ifxusb_rreg(&_core_if->dev_global_regs->daintmsk);
636        return ((v & 0xffff0000) >> 16);
637    }
638
639    static inline uint32_t ifxusb_read_dev_in_ep_intr(ifxusb_core_if_t *_core_if, int _ep_num)
640    {
641        uint32_t v;
642        v = ifxusb_rreg(&_core_if->in_ep_regs[_ep_num]->diepint) &
643            ifxusb_rreg(&_core_if->dev_global_regs->diepmsk);
644        return v;
645    }
646
647    static inline uint32_t ifxusb_read_dev_out_ep_intr(ifxusb_core_if_t *_core_if, int _ep_num)
648    {
649        uint32_t v;
650        v = ifxusb_rreg(&_core_if->out_ep_regs[_ep_num]->doepint) &
651            ifxusb_rreg(&_core_if->dev_global_regs->doepmsk);
652        return v;
653    }
654
655#endif
656
657extern void ifxusb_attr_create (void *_dev);
658
659extern void ifxusb_attr_remove (void *_dev);
660
661///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
662
663#endif // !defined(__IFXUSB_CIF_H__)
664
665
666

Archive Download this file



interactive