Subversion Repositories Kolibri OS

Rev

Rev 1616 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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