aura  0.1
 All Data Structures Functions Variables Modules Pages
main.c
1 #include <arch/antares.h>
2 #include <avr/boot.h>
3 #include <avr/io.h>
4 #include <string.h>
5 #include <avr/interrupt.h>
6 #include <util/delay.h>
7 #include <generated/usbconfig.h>
8 #include <arch/vusb/usbportability.h>
9 #include <arch/vusb/usbdrv.h>
10 #include <lib/urpc.h>
11 
12 URPC_METHOD(setLed,
13  URPC_U8,
14  URPC_U8)
15 {
16 
17 };
18 
19 URPC_METHOD(getButton,
20  URPC_U8,
21  URPC_NONE)
22 {
23 
24 };
25 
26 enum usb_requests {
27  RQ_GET_DEV_INFO,
28  RQ_GET_OBJ_INFO,
29  RQ_GET_EVENT,
30  RQ_PUT_CALL
31 };
32 
33 struct usb_interrupt_packet {
34  uint8_t pending_evts;
35 } __attribute__((packed));
36 
37 #define usbdev_is_be(pck) (pck & (1<<0))
38 
39 struct usb_info_packet {
40  uint8_t flags;
41  uint16_t num_objs;
42  uint16_t io_buf_size;
43 } __attribute__((packed));
44 
45 
46 int put_object(unsigned char *dest, int dlen, const void *name, const void* afmt, const void* rfmt)
47 {
48  int tocopy;
49  int ret=0;
50 
51  tocopy = min_t(int, dlen, strlen(name) + 1);
52  memcpy(dest, name, tocopy);
53  dest+=tocopy;
54  ret +=tocopy;
55 
56  tocopy = min_t(int, dlen, strlen(afmt) + 1);
57  memcpy(dest, afmt, tocopy);
58  dest+=tocopy;
59  ret +=tocopy;
60 
61  tocopy = min_t(int, dlen, strlen(rfmt) + 1);
62  memcpy(dest, rfmt, tocopy);
63  dest+=tocopy;
64  ret +=tocopy;
65  return ret+1;
66 }
67 
68 unsigned char iobuf[512];
69 unsigned char *bpos;
70 int rq_len;
71 static uint8_t num_evt_pending=0;
72 
73 uchar usbFunctionSetup(uchar data[8])
74 {
75  usbRequest_t *rq = (void *)data;
76  struct urpc_object **reg;
77  int ocount = urpc_get_registry(&reg);
78 
79  usbMsgPtr = iobuf;
80  switch(rq->bRequest)
81  {
82  case RQ_GET_DEV_INFO: {
83  struct usb_info_packet *p = (struct usb_info_packet *) iobuf;
84  p->flags = 0;
85  p->num_objs = ocount;
86  p->io_buf_size = 512;
87  usbMsgPtr = iobuf;
88  return sizeof(*p);
89  break;
90  };
91  case RQ_GET_OBJ_INFO:
92  {
93  struct urpc_object *o;
94  if (rq->wIndex.word >= ocount)
95  return;
96  o = reg[rq->wIndex.word];
97 
98  iobuf[0]=urpc_object_is_method(o) ? 1 : 0; /*isMethod ? */
99  return put_object(iobuf+1, 512, o->name, o->arg, o->ret);
100  }
101  case RQ_GET_EVENT:
102  {
103  if (!num_evt_pending)
104  return 0;
105  uint16_t *id = iobuf;
106  uint8_t *ret = &iobuf[2];
107  *id=0;
108  *ret=7;
109  PORTC^=(1<<2);
110  num_evt_pending--;
111  return 3;
112  break;
113  }
114  case RQ_PUT_CALL:
115  rq_len = rq->wLength;
116  bpos=iobuf;
117  return USB_NO_MSG;
118  break;
119  }
120  return 0;
121 }
122 
123 uchar usbFunctionWrite(uchar *data, uchar len)
124 {
125  rq_len -= len;
126  if (!rq_len)
127  return 1;
128  else
129  return 0;
130 }
131 
132 inline void usbReconnect()
133 {
134  DDRD=0xff;
135  _delay_ms(250);
136  DDRD=0;
137 }
138 
139 ANTARES_INIT_LOW(io_init)
140 {
141  DDRC=1<<2;
142  PORTC=0xff;
143  usbReconnect();
144 }
145 
146 ANTARES_INIT_HIGH(uinit)
147 {
148  usbInit();
149 }
150 
151 
152 ANTARES_APP(usb_app)
153 {
154  usbPoll();
155  if(usbInterruptIsReady()){
156  usbSetInterrupt(&num_evt_pending, 1);
157  }
158 
159 }
void __attribute__((noreturn)) aura_panic(struct aura_node *node)
Definition: panic.c:33