Device Manager Draft (incomplete)
"Axel Dörfler" <[email protected]> Tue, 08 Apr 2008 22:05:03 +0200 CEST
| Newsgroups | gmane.os.openbeos.kernel.devel |
|---|---|
| Message-ID | <31162913445-BeMail@zon> |
Hi there, Salvatore just bugged me into sending a first draft of the new device manager stuff. I haven't done that much yet, but it should at least give you an idea about some of the changes, and also the opportunity to comment and influence the design :-) I also had done some more on the missing pieces on a piece of paper I currently can't find again... :-} It's a bit brief, sorry for that. I've started with a test shell to be able to play with a few ideas, and see how it works out in the end. -------------8<------------- Driver API original Be API: init_hardware(); init_driver(); uninit_driver(); uninit_hardware(); publish_devices(); find_device(); Current device_manager API: supports_device(parent, noConnection); register_device(parent); init_driver(node, userCookie, *cookie); uninit_driver(cookie); device_removed(node, cookie); device_cleanup(node); get_supported_paths(busses, devices); + for busses: register_child_devices(cookie); rescan_bus(cookie); Device publishing via devfs node. New API: supports_device(parent); register_device(parent); init_driver(node); also publishes any devices/nodes with dedicated calls (ie. devfs_publish_device()) uninit_driver(node); device_removed(node); any devices and child nodes are removed automatically "device" in the API above refers to device_node - maybe rename it, ie. supports_device() to supports_device_node()? Still left out: power management, passive driver matching, identify boot driver -- Device API init_device(deviceCookie); called once before one or several open() calls uninit_device(deviceCookie); supposed to free deviceCookie, called when the last reference to the device is closed open(deviceCookie, path, open mode, *cookie); deviceCookie is an object attached to the published device close(cookie); free(cookie); read(cookie, pos, buffer, *length); write(cookie, pos, buffer, *length); ioctl(cookie, op, buffer, length); as in BeOS io(cookie, io_request); new function to deal with I/O requests directly. -- I/O Requests create_io_request(buffer, length, read/write, async, user/kernel); create_io_request_vecs(vecs, count, length, read/write, async, user/ kernel); creates the requests and handles copying of the scatter/gather data from userland prepare_io_request(request); locks the requests memory and retrieves the physical pages map_io_request(request, vecs, count); Returns the buffers of the I/O request mapped into kernel memory. prepare_io_request_dma(io request, dmaResource); Map the I/O request to match the DMA requirements of the device. If needed, create a bounce buffer to be used for DMA. get_io_request_memory_map(buffer, io request, vecs, count); Get the memory map of the DMA buffer for this I/O request. complete_io_request_dma(io request, dmaResource); Unmaps the data, copies back data from bounce buffer if necessary. complete_io_request(request); unlocks/unmaps the memory again delete_io_request(request); -- DMA Resource create_dma_resource(restrictions); Restrictions are: transfer size, address space, alignment dma_buffer_alloc(resource, size) dma_buffer_free(buffer) Allocates or frees memory in that DMA buffer. delete_dma_resource(resource); -------------8<------------- Bye, Axel. ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Register now and save $200. Hurry, offer ends at 11:59 p.m., Monday, April 7! Use priority code J8TLD2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone