2 * USB support based on Linux kernel source
4 * 2003-06-21 Georg Acher (georg@acher.org)
8 * 1) Forget all device interrupts, scheduling, semaphores, threads etc.
9 * 1a) Forget all DMA and PCI helper functions
10 * 2) Forget usbdevfs, procfs and ioctls
11 * 3) Emulate OHCI interrupts and root hub timer by polling
12 * 4) Emulate hub kernel thread by polling
13 * 5) Emulate synchronous USB-messages (usb_*_msg) with busy waiting
16 * 6) Remove code bloat
20 #include "../usb_wrapper.h"
24 static struct pci_dev
*pci_probe_dev
;
25 extern int (*thread_handler
)(void*);
26 extern void* thread_parm
;
28 struct my_irqs reg_irqs
[MAX_IRQS
];
34 struct timer_list
*main_timer_list
[MAX_TIMERS
];
35 struct dummy_process act_cur
={0};
36 struct dummy_process
*my_current
;
38 int (*thread_handler
)(void*);
42 static struct device_driver
*m_drivers
[MAX_DRVS
];
45 /*------------------------------------------------------------------------*/
47 * Helper functions for top-level system
49 /*------------------------------------------------------------------------*/
50 void init_wrapper(struct pci_dev
*probe_dev
)
53 for(n
=0;n
<MAX_TIMERS
;n
++)
55 main_timer_list
[n
]=NULL
;
61 pci_probe_dev
=probe_dev
;
63 for(n
=0;n
<MAX_IRQS
;n
++)
65 reg_irqs
[n
].handler
=NULL
;
70 for(n
=0;n
<MAX_DRVS
;n
++)
73 /*------------------------------------------------------------------------*/
74 void handle_irqs(int irq
)
77 printk("handle irqs\n");
78 for(n
=0;n
<MAX_IRQS
;n
++)
80 if (reg_irqs
[n
].handler
&& (irq
==reg_irqs
[n
].irq
|| irq
==-1))
81 reg_irqs
[n
].handler(reg_irqs
[n
].irq
,reg_irqs
[n
].data
,NULL
);
84 /*------------------------------------------------------------------------*/
85 void inc_jiffies(int n
)
89 /*------------------------------------------------------------------------*/
90 void do_all_timers(void)
93 for(n
=0;n
<MAX_TIMERS
;n
++)
95 if (main_timer_list
[n
] &&
96 main_timer_list
[n
]->function
&& main_timer_list
[n
]->expires
)
98 void (*function
)(unsigned long)=main_timer_list
[n
]->function
;
99 unsigned long data
=main_timer_list
[n
]->data
;
100 main_timer_list
[n
]->expires
=0;
102 main_timer_list
[n
]=NULL
; // remove timer
103 printk("do timer %i fn %p\n",n
,function
);
109 /*------------------------------------------------------------------------*/
110 // Purpose: Remember thread procedure and data in global var
111 // ReactOS Purpose: Create real kernel thread
112 int my_kernel_thread(int STDCALL (*handler
)(void*), void* parm
, int flags
)
115 //thread_handler=handler;
117 //return 42; // PID :-)
119 ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL
);
121 PsCreateSystemThread(&hThread
,
126 (PKSTART_ROUTINE
)handler
,
129 return (int)hThread
; // FIXME: Correct?
133 int my_kill_proc(int pid
, int signal
, int unk
)
137 // TODO: Implement actual process killing
139 hThread
= (HANDLE
)pid
;
145 /*------------------------------------------------------------------------*/
147 * As simple as possible, but as complete as necessary ...
149 /*------------------------------------------------------------------------*/
152 /* calls probe function for hotplug (which does device matching), this is the
153 only link between usbcore and the registered device drivers! */
154 int my_device_add(struct device
*dev
)
157 printk("drv_num %i %p %p\n",drvs_num
,m_drivers
[0]->probe
,m_drivers
[1]->probe
);
161 if (dev
->driver
->probe
)
162 return dev
->driver
->probe(dev
);
166 for(n
=0;n
<drvs_num
;n
++)
168 if (m_drivers
[n
]->probe
)
170 dev
->driver
=m_drivers
[n
];
171 printk("probe%i %p ",n
,m_drivers
[n
]->probe
);
173 if (m_drivers
[n
]->probe(dev
) == 0)
185 /*------------------------------------------------------------------------*/
186 int my_driver_register(struct device_driver
*driver
)
189 if (drvs_num
<MAX_DRVS
)
191 printk("driver_register %i: %p %p",drvs_num
,driver
,driver
->probe
);
193 m_drivers
[drvs_num
++]=driver
;
198 /*------------------------------------------------------------------------*/
199 int my_device_unregister(struct device
*dev
)
201 if (dev
->driver
&& dev
->driver
->remove
)
202 dev
->driver
->remove(dev
);
206 /*------------------------------------------------------------------------*/
207 struct device
*my_get_device(struct device
*dev
)
211 /*------------------------------------------------------------------------*/
212 void my_device_initialize(struct device
*dev
)
215 /*------------------------------------------------------------------------*/
216 void my_wake_up(PKEVENT evnt
)
220 KeSetEvent(evnt
, 0, FALSE
); // Signal event
222 /*------------------------------------------------------------------------*/
223 void my_init_waitqueue_head(PKEVENT evnt
)
225 // this is used only in core/message.c, and it isn't needed there
226 //KeInitializeEvent(evnt, NotificationEvent, TRUE); // signalled state
228 /*------------------------------------------------------------------------*/
229 /* wait until woken up (only one wait allowed!) */
230 int my_schedule_timeout(int x
)
234 printk("schedule_timeout %i\n",x
);
250 printk("schedule DONE!!!!!!\n");
254 /*------------------------------------------------------------------------*/
255 void my_wait_for_completion(struct completion
*x
)
258 printk("wait for completion\n");
260 while(!x
->done
&& (n
>0))
270 printk("wait for completion done %i\n",x
->done
);
273 /*------------------------------------------------------------------------*/
274 void my_interruptible_sleep_on(PKEVENT evnt
)
276 KeWaitForSingleObject(evnt
, Executive
, KernelMode
, FALSE
, NULL
);
277 KeClearEvent(evnt
); // reset to not-signalled
279 /*------------------------------------------------------------------------*/
280 // Helper for pci_module_init
281 /*------------------------------------------------------------------------*/
282 int my_pci_module_init(struct pci_driver
*x
)
284 struct pci_dev
*dev
=pci_probe_dev
;
285 const struct pci_device_id
*id
=NULL
;
288 DPRINT1("PCI device not set!\n");
294 /*------------------------------------------------------------------------*/
295 struct pci_dev
*my_pci_find_slot(int a
,int b
)
299 /*------------------------------------------------------------------------*/
300 int my_pci_write_config_word(struct pci_dev
*dev
, int where
, u16 val
)
302 //dev->bus, dev->devfn, where, val
303 OHCI_DEVICE_EXTENSION
*dev_ext
= (OHCI_DEVICE_EXTENSION
*)dev
->dev_ext
;
305 //FIXME: Is returning this value correct?
306 //FIXME: Mixing pci_dev and win structs isn't a good thing at all
307 return HalSetBusDataByOffset(PCIConfiguration
, dev
->bus
->number
, dev_ext
->SystemIoSlotNumber
, &val
, where
, sizeof(val
));
309 /*------------------------------------------------------------------------*/
310 int my_request_irq(unsigned int irq
,
311 int (*handler
)(int,void *, struct pt_regs
*),
312 unsigned long mode
, const char *desc
, void *data
)
314 if (num_irqs
<MAX_IRQS
)
316 reg_irqs
[num_irqs
].handler
=handler
;
317 reg_irqs
[num_irqs
].irq
=irq
;
318 reg_irqs
[num_irqs
].data
=data
;
324 /*------------------------------------------------------------------------*/
325 int my_free_irq(int irq
, void* p
)
330 /*------------------------------------------------------------------------*/
332 /*------------------------------------------------------------------------*/
333 kmem_cache_t
*my_kmem_cache_create(const char *tag
, size_t alloc_size
,
334 size_t offset
, unsigned long flags
,
338 //TODO: Take in account ctor and dtor - callbacks for alloc/free, flags and offset
339 //FIXME: We assume this cache is always NPaged
340 PNPAGED_LOOKASIDE_LIST Lookaside
;
341 ULONG Tag
=0x11223344; //FIXME: Make this from tag
343 Lookaside
= ExAllocatePool(NonPagedPool
, sizeof(NPAGED_LOOKASIDE_LIST
));
345 ExInitializeNPagedLookasideList(
354 return (kmem_cache_t
*)Lookaside
;
356 /*------------------------------------------------------------------------*/
357 BOOLEAN
my_kmem_cache_destroy(kmem_cache_t
*co
)
359 ExDeleteNPagedLookasideList((PNPAGED_LOOKASIDE_LIST
)co
);
364 /*------------------------------------------------------------------------*/
365 void *my_kmem_cache_alloc(kmem_cache_t
*co
, int flags
)
367 return ExAllocateFromNPagedLookasideList((PNPAGED_LOOKASIDE_LIST
)co
);
369 /*------------------------------------------------------------------------*/
370 void my_kmem_cache_free(kmem_cache_t
*co
, void *ptr
)
372 ExFreeToNPagedLookasideList((PNPAGED_LOOKASIDE_LIST
)co
, ptr
);
374 /*------------------------------------------------------------------------*/
376 /*------------------------------------------------------------------------*/
377 void *my_dma_pool_alloc(struct dma_pool
*pool
, int gfp_flags
, dma_addr_t
*dma_handle
)
379 // HalAllocCommonBuffer
380 // But ideally IoGetDmaAdapter