Subversion Repositories Kolibri OS

Rev

Rev 1616 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1029 serge 1
 
2
 
1616 serge 3
#include 
1600 serge 4
#include 
5
#include 
1616 serge 6
#include 
1875 serge 7
#include "usb.h"
1600 serge 8
1029 serge 9
int __stdcall srv_usb(ioctl_t *io);
10
 
11
bool init_hc(hc_t *hc);
12
 
1600 serge 13
static slab_t   qh_slab;
1029 serge 14
 
15
LIST_HEAD( hc_list );
16
 
1600 serge 17
LIST_HEAD( rq_list );
18
19
u32_t drvEntry(int action, char *cmdline)
1029 serge 20
 
1600 serge 21
    u32_t   retval;
1029 serge 22
    hc_t   *hc;
23
    udev_t *dev;
24
25
    int     i;
26
 
27
    if(action != 1)
28
 
29
30
    if(!dbg_open("/rd/1/drivers/usb.log"))
31
 
32
        printf("Can't open /rd/1/drivers/usb.log\nExit\n");
33
        return 0;
34
    }
35
36
    if( !FindUSBControllers() ) {
37
 
1600 serge 38
        return 0;
1029 serge 39
    };
40
41
    hcd_buffer_create();
42
 
1875 serge 43
    qh_slab.available = 256;
1029 serge 44
 
1875 serge 45
    qh_slab.nextavail = (addr_t)qh_slab.start;
46
    qh_slab.dma       = GetPgAddr(qh_slab.start);
47
48
    qh_t    *p;
1029 serge 49
 
1875 serge 50
51
    for (i = 0, p = (qh_t*)qh_slab.start, dma = qh_slab.dma;
1029 serge 52
 
1875 serge 53
    {
54
       p->qlink  = (addr_t)(p+1);
55
       p->qelem  = 1;
56
       p->dma    = dma;
57
       p->r1     = 0;
58
    };
59
60
    hc = (hc_t*)hc_list.next;
61
 
1029 serge 62
    while( &hc->list != &hc_list)
63
 
1600 serge 64
        hc_t *tmp = hc;
1029 serge 65
        hc = (hc_t*)hc->list.next;
1616 serge 66
1600 serge 67
        if( !init_hc(tmp))
1029 serge 68
 
1616 serge 69
    };
70
71
    dbgprintf("\n");
72
 
1029 serge 73
    dev = (udev_t*)newdev_list.next;
74
 
75
    {
1600 serge 76
        udev_t *tmp = dev;
1029 serge 77
        dev = (udev_t*)dev->list.next;
78
1600 serge 79
        if(tmp->id != 0)
1029 serge 80
 
81
    }
82
83
    while(1)
84
 
85
        udev_t    *dev;
86
        request_t *rq;
87
        kevent_t    event;
88
        u32_t       handle;
1613 serge 89
90
        event.code    = 0;
1029 serge 91
 
1613 serge 92
93
        handle = GetEvent(&event);
1029 serge 94
 
1613 serge 95
//        dbgprintf("event handle 0x%0x code 0x%0x\n",
1029 serge 96
 
1613 serge 97
98
        if(event.code != 0xFF000001)
1029 serge 99
 
1613 serge 100
101
        rq = (request_t*)event.data[0];
1605 serge 102
 
1613 serge 103
//        dbgprintf("rq = 0x%0x\n", rq);
1029 serge 104
 
1613 serge 105
        rq->handler(rq->dev, rq);
1029 serge 106
 
1613 serge 107
1029 serge 108
    retval = RegService("USB", srv_usb);
109
 
110
111
    return retval;
112
 
113
114
115
 
116
 
117
#define SRV_GETVERSION  0
118
 
119
120
 
121
 
122
  u32_t *inp;
123
  u32_t *outp;
124
125
  inp = io->input;
126
 
127
128
  switch(io->io_code)
129
 
130
    case SRV_GETVERSION:
131
      if(io->out_size==4)
132
      {
133
        *outp = API_VERSION;
134
        return 0;
135
      }
136
      break;
137
138
139
 
140
 
141
  };
142
  return ERR_PARAM;
143
}
144
145
146
 
147
 
148
    if( qh_slab.available )
149
    {
150
        qh_t *qh;
151
152
        qh_slab.available--;
153
 
154
        qh_slab.nextavail = qh->qlink;
155
        return qh;
156
     }
157
     return NULL;
158
};
159
160
static void  free_qh(qh_t *qh)
161
 
162
     qh->qlink = qh_slab.nextavail;
163
     qh_slab.nextavail = (addr_t)qh;
164
     qh_slab.available++;
165
};
166
167
168
 
169
 
170
#include "hcd.inc"
171
#include "hid.inc"
172