1 /*****************************************************/
2 /*** Module : USB PDI ***/
3 /*** Author : Roman Bartosinski (C) 28.04.2002 ***/
4 /*** Modify : 08.08.2002, 16.04.2003 ***/
5 /*****************************************************/
7 #include <system_def.h>
9 #include <usb/lpcusb.h>
12 int usb_lpc_connect( usb_device_t *udev) {
13 lpc_write_cmd_data(USB_CMD_SET_DEV_STAT,USB_DAT_WR_BYTE(USBC_DEV_CON));
18 int usb_lpc_disconnect( usb_device_t *udev) {
19 lpc_write_cmd_data(USB_CMD_SET_DEV_STAT,USB_DAT_WR_BYTE(0));
23 /* acknowledge control transfer */
24 void usb_lpc_ack_setup( usb_device_t *udev) {
25 lpc_usb_write_endpoint(0x80|0x00, NULL, 0);
28 /* stall endpoint X */
29 void usb_lpc_stall( usb_ep_t *ep) {
31 lpc_write_cmd_data(USB_CMD_SEL_EP_CLRI(lpc_ep2addr(ep->epnum)),USB_DAT_WR_BYTE(USBC_EP_STAT_ST));
33 lpc_write_cmd_data(USB_CMD_SEL_EP_CLRI(lpc_ep2addr(0x80|ep->epnum)),USB_DAT_WR_BYTE(USBC_EP_STAT_ST));
34 lpc_write_cmd_data(USB_CMD_SEL_EP_CLRI(lpc_ep2addr(ep->epnum)),USB_DAT_WR_BYTE(USBC_EP_STAT_ST));
39 * usb_lpc_check events
40 * function reads interrupt register and sets event flags
41 * function returns 1 if there is some new event.
42 * function returns 0 if there isn't new event but all is OK
43 * function returns -1 if there is any error
45 int usb_lpc_check_events( usb_device_t *udev)
47 unsigned int disr,val,last_int;
52 /* Device Status Interrupt (Reset, Connect change, Suspend/Resume) */
53 if (disr & USBDevInt_DEV_STAT) {
54 USBDevIntClr = USBDevInt_DEV_STAT;
55 disr&=~USBDevInt_DEV_STAT;
56 lpc_write_cmd(USB_CMD_GET_DEV_STAT);
57 val=lpc_read_cmd_data(USB_DAT_GET_DEV_STAT);
58 if (val & USBC_DEV_RST) { /* Reset */
60 udev->flags |= USB_FLAG_BUS_RESET;
63 if (val & USBC_DEV_SUS_CH) { /* Suspend/Resume */
64 if (val & USBC_DEV_SUS) { /* Suspend */
65 udev->flags |= USB_FLAG_SUSPEND;
73 /* Endpoint's Slow Interrupt */
74 if (disr & USBDevInt_EP_SLOW) {
75 USBDevIntClr = USBDevInt_EP_SLOW;
76 disr&=~USBDevInt_EP_SLOW;
78 last_int = USBEpIntSt;
81 if (last_int & (1 << 0)) {
82 last_int &= ~(1 << 0);
84 lpc_wait4devint(USBDevInt_CDFULL);
87 if (val & USBC_EP_SEL_STP)
88 udev->flags |= USB_FLAG_SETUP;
90 udev->flags |= USB_FLAG_EVENT_RX0;
95 if (last_int & (1 << 1)) {
96 last_int &= ~(1 << 1);
98 lpc_wait4devint(USBDevInt_CDFULL);
100 udev->flags |= USB_FLAG_EVENT_TX0;
105 for( i=0; i<udev->cntep; i++) {
106 if ( last_int & (udev->ep+i)->event_mask) {
107 last_int &= ~((udev->ep+i)->event_mask);
108 USBEpIntClr = (udev->ep+i)->event_mask;
109 lpc_wait4devint(USBDevInt_CDFULL);
111 udev->ep_events |= 1<<i;
116 while (last_int) { /* Endpoint Interrupt Status */
117 for (n = 0; n < USB_EP_NUM; n++) { /* Check All Endpoints */
118 if (last_int & (1 << n)) {
119 last_int &= ~(1 << n);
120 USBEpIntClr = 1 << n;
123 lpc_wait4devint(USBDevInt_CDFULL);
125 lpc_usb_setstallEP(m);
135 int usb_lpc_read_endpoint( usb_ep_t *ep, void *ptr, int size)
137 return lpc_usb_read_endpoint(ep->epnum, ptr, size);
140 int usb_lpc_write_endpoint( usb_ep_t *ep, const void *ptr, int size)
142 return lpc_usb_write_endpoint(0x80|ep->epnum, ptr, size);
146 /* init usb structures and chip */
147 int usb_lpc_init( usb_device_t *udev) {
149 udev->connect = usb_lpc_connect;
150 udev->disconnect = usb_lpc_disconnect;
151 udev->ack_setup = usb_lpc_ack_setup;
152 udev->ack_control_setup = NULL;
153 udev->stall = usb_lpc_stall;
154 udev->check_events = usb_lpc_check_events;
155 udev->read_endpoint = usb_lpc_read_endpoint;
156 udev->write_endpoint = usb_lpc_write_endpoint;
158 udev->ep0.max_packet_size = USB_MAX_PACKET0;