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 
11 enum usb_requests {
12  RQ_GET_DEV_INFO,
13  RQ_GET_OBJ_INFO,
14  RQ_GET_EVENT,
15  RQ_PUT_CALL
16 };
17 
18 struct usb_interrupt_packet {
19  uint8_t pending_evts;
20 } __attribute__((packed));
21 
22 #define usbdev_is_be(pck) (pck & (1<<0))
23 
24 struct usb_info_packet {
25  uint8_t flags;
26  uint16_t num_objs;
27  uint16_t io_buf_size;
28 } __attribute__((packed));
29 
30 
31 int put_object(unsigned char *dest, int dlen, const void *name, const void* afmt, const void* rfmt)
32 {
33  int tocopy;
34  int ret=0;
35 
36  tocopy = min_t(int, dlen, strlen(name) + 1);
37  memcpy(dest, name, tocopy);
38  dest+=tocopy;
39  ret +=tocopy;
40 
41  tocopy = min_t(int, dlen, strlen(afmt) + 1);
42  memcpy(dest, afmt, tocopy);
43  dest+=tocopy;
44  ret +=tocopy;
45 
46  tocopy = min_t(int, dlen, strlen(rfmt) + 1);
47  memcpy(dest, rfmt, tocopy);
48  dest+=tocopy;
49  ret +=tocopy;
50  return ret+1;
51 }
52 
53 unsigned char iobuf[512];
54 static uint8_t num_evt_pending=0;
55 
56 uchar usbFunctionSetup(uchar data[8])
57 {
58  usbRequest_t *rq = (void *)data;
59  usbMsgPtr = iobuf;
60  switch(rq->bRequest)
61  {
62  case RQ_GET_DEV_INFO: {
63  struct usb_info_packet *p = (struct usb_info_packet *) iobuf;
64  p->flags = 0;
65  p->num_objs = 3;
66  p->io_buf_size = 512;
67  usbMsgPtr = iobuf;
68  return sizeof(*p);
69  break;
70  };
71  case RQ_GET_OBJ_INFO:
72  iobuf[0]=1; /*isMethod ? */
73  if (rq->wIndex.word == 0)
74  return put_object(iobuf+1, 512, "turnTheLedOn", "1", "1");
75  else if (rq->wIndex.word == 1)
76  return put_object(iobuf+1, 512, "turnTheLedOff", "", "1");
77  else {
78  iobuf[0] = 0x0;
79  return put_object(iobuf+1, 512, "buttonPressed", "", "1");
80  }
81  break;
82  case RQ_GET_EVENT:
83  {
84  if (!num_evt_pending)
85  return 0;
86  uint16_t *id = iobuf;
87  uint8_t *ret = &iobuf[2];
88  num_evt_pending--;
89  if (num_evt_pending)
90  *id=0;
91  else
92  *id=2;
93  *ret=7;
94 
95  PORTC^=(1<<2);
96 
97  return 3;
98  break;
99  }
100  case RQ_PUT_CALL:
101  num_evt_pending=2;
102  return USB_NO_MSG;
103  break;
104  }
105  return 0;
106 }
107 
108 uchar usbFunctionWrite(uchar *data, uchar len)
109 {
110 
111 }
112 
113 inline void usbReconnect()
114 {
115  DDRD=0xff;
116  _delay_ms(250);
117  DDRD=0;
118 }
119 
120 ANTARES_INIT_LOW(io_init)
121 {
122  DDRC=1<<2;
123  PORTC=0xff;
124  usbReconnect();
125 }
126 
127 ANTARES_INIT_HIGH(uinit)
128 {
129  usbInit();
130 }
131 
132 
133 ANTARES_APP(usb_app)
134 {
135  usbPoll();
136  if(usbInterruptIsReady()){
137  usbSetInterrupt(&num_evt_pending, 1);
138  }
139 
140 }
void __attribute__((noreturn)) aura_panic(struct aura_node *node)
Definition: panic.c:33