37
37
#include <stdint.h>
38
38
#include <malloc.h>
40
#include "mem_access.h"
42
#define HCCA_INT_EP_COUNT 32
40
44
/** Host controller communication area.
41
45
* Shared memory used for communication between the controller and the driver.
43
47
typedef struct hcca {
48
/** Interrupt endpoints */
49
uint32_t int_ep[HCCA_INT_EP_COUNT];
45
51
uint16_t frame_number;
53
/** Pointer to the last completed TD. (useless) */
47
54
uint32_t done_head;
55
/** Padding to make the size 256B */
48
56
uint32_t reserved[30];
51
static inline void * hcca_get(void)
59
/** Allocate properly aligned structure.
61
* The returned structure is zeroed upon allocation.
63
* @return Usable HCCA memory structure.
65
static inline hcca_t * hcca_get(void)
53
67
assert(sizeof(hcca_t) == 256);
54
return memalign(256, sizeof(hcca_t));
68
hcca_t *hcca = memalign(256, sizeof(hcca_t));
70
bzero(hcca, sizeof(hcca_t));
74
/** Set HCCA interrupt endpoint pointer table entry.
75
* @param hcca HCCA memory structure.
76
* @param index table index.
77
* @param pa Physical address.
79
static inline void hcca_set_int_ep(hcca_t *hcca, unsigned index, uintptr_t pa)
82
assert(index < HCCA_INT_EP_COUNT);
83
OHCI_MEM32_WR(hcca->int_ep[index], pa);