Subversion Repositories Kolibri OS

Rev

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