* modification, are permitted provided that the following conditions
* are met:
*
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of the FH Augsburg nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the FH Augsburg nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
*/
void usb_init()
{
- core.drivers = list_create();
- core.devices = list_create();
- core.nextaddress = 1;
- hcdi_init();
+ core.drivers = list_create();
+ core.devices = list_create();
+ core.nextaddress = 1;
+ hcdi_init();
}
/**
*/
u8 usb_next_address()
{
- u8 addr = core.nextaddress;
- core.nextaddress++;
- return addr;
+ u8 addr = core.nextaddress;
+ core.nextaddress++;
+ return addr;
}
*/
void usb_periodic()
{
- // call ever registered driver
- usb_driver *drv;
- element *iterator = core.drivers->head;
- while (iterator != NULL) {
- drv = (usb_driver *) iterator->data;
- drv->check();
- iterator = iterator->next;
- }
+ // call ever registered driver
+ usb_driver *drv;
+ element *iterator = core.drivers->head;
+ while (iterator != NULL) {
+ drv = (usb_driver *) iterator->data;
+ drv->check();
+ iterator = iterator->next;
+ }
}
*/
usb_device *usb_add_device()
{
- usb_device *dev = (usb_device *) malloc(sizeof(usb_device));
- dev->address = 0;
- dev->bMaxPacketSize0 = 8; /* send at first time only 8 bytes */
-
- dev->epSize[0] = 64;
- dev->epSize[1] = 64;
- dev->epSize[2] = 64;
-
- dev->epTogl[0] = 0;
- dev->epTogl[1] = 0;
- dev->epTogl[2] = 0;
-
- char buf[64];
- u8 devdescr_size;
- u8 address = usb_next_address();
-
- /* ask first 8 bytes of device descriptor with this special
- * GET Descriptor Request, when device address = 0
- */
- usb_control_msg(dev, 0x80, GET_DESCRIPTOR, 1, 0, 64, buf, 8, 0);
-
- dev->bMaxPacketSize0 = (u8) buf[7] ? (u8) buf[7] : 1; //dirty? /* setup real ep0 fifo size */
- devdescr_size = (u8) buf[0]; /* save real length of device descriptor */
-
- /* define new adress */
- usb_control_msg(dev, 0x00, SET_ADDRESS, address << 8, 0, 0, buf, 8, 0);
- dev->address = address;
-
- /* get complete device descriptor */
- usb_control_msg(dev, 0x80, GET_DESCRIPTOR, 1, 0, devdescr_size, buf, 8,
- 0);
-
- /* save only really neccessary values for this small usbstack */
- dev->bDeviceClass = (u8) buf[4];
- dev->bDeviceSubClass = (u8) buf[5];
- dev->bDeviceProtocoll = (u8) buf[6];
- dev->idVendor = (u16) (buf[9] << 8) | (buf[8]);
- dev->idProduct = (u16) (buf[11] << 8) | (buf[10]);
- dev->bcdDevice = (u16) (buf[13] << 8) | (buf[12]);
+ usb_device *dev = (usb_device *) malloc(sizeof(usb_device));
+ dev->address = 0;
+ dev->bMaxPacketSize0 = 8; /* send at first time only 8 bytes */
+
+ dev->epSize[0] = 64;
+ dev->epSize[1] = 64;
+ dev->epSize[2] = 64;
+
+ dev->epTogl[0] = 0;
+ dev->epTogl[1] = 0;
+ dev->epTogl[2] = 0;
+
+ char buf[64];
+ u8 devdescr_size;
+ u8 address = usb_next_address();
+
+ /* ask first 8 bytes of device descriptor with this special
+ * GET Descriptor Request, when device address = 0
+ */
+ usb_control_msg(dev, 0x80, GET_DESCRIPTOR, 1, 0, 64, buf, 8, 0);
+
+ dev->bMaxPacketSize0 = (u8) buf[7] ? (u8) buf[7] : 1; //dirty? /* setup real ep0 fifo size */
+ devdescr_size = (u8) buf[0]; /* save real length of device descriptor */
+
+ /* define new adress */
+ usb_control_msg(dev, 0x00, SET_ADDRESS, address << 8, 0, 0, buf, 8, 0);
+ dev->address = address;
+
+ /* get complete device descriptor */
+ usb_control_msg(dev, 0x80, GET_DESCRIPTOR, 1, 0, devdescr_size, buf, 8,
+ 0);
+
+ /* save only really neccessary values for this small usbstack */
+ dev->bDeviceClass = (u8) buf[4];
+ dev->bDeviceSubClass = (u8) buf[5];
+ dev->bDeviceProtocoll = (u8) buf[6];
+ dev->idVendor = (u16) (buf[9] << 8) | (buf[8]);
+ dev->idProduct = (u16) (buf[11] << 8) | (buf[10]);
+ dev->bcdDevice = (u16) (buf[13] << 8) | (buf[12]);
printf( "bDeviceClass 0x%02X\n"
"bDeviceSubClass 0x%02X\n"
dev->bDeviceSubClass, dev->bDeviceProtocoll,
dev->idVendor, dev->idProduct, dev->bcdDevice);
/* for lewurms keyboard it should be:
- * bDeviceClass 0
- * bDeviceSubClass 0
- * bDeviceClass 0
- * idVendor 0x049f
- * idProduct 0x000e
- * bcdDevice 1.00
+ * bDeviceClass 0
+ * bDeviceSubClass 0
+ * bDeviceClass 0
+ * idVendor 0x049f
+ * idProduct 0x000e
+ * bcdDevice 1.00
*/
- // string descriptoren werden nicht im arbeitsspeicher gehalten -> on demand mit
- // entprechenden funktionen
- // hier muss man noch mehr abholen, konfigurationene, interfaces und endpunkte
+ // string descriptoren werden nicht im arbeitsspeicher gehalten -> on demand mit
+ // entprechenden funktionen
+ // hier muss man noch mehr abholen, konfigurationene, interfaces und endpunkte
- /* add device to device list */
- element *tmp = (element *) malloc(sizeof(element));
- tmp->data = (void *) dev;
- list_add_tail(core.devices, tmp);
+ /* add device to device list */
+ element *tmp = (element *) malloc(sizeof(element));
+ tmp->data = (void *) dev;
+ list_add_tail(core.devices, tmp);
- usb_probe_driver();
+ usb_probe_driver();
- return dev;
+ return dev;
}
/**
*/
u8 usb_remove_device(usb_device * dev)
{
- // FIXME!!!! dieser quatsch ist nur temporaer
- free(core.devices->head);
- free(core.devices);
- core.devices = list_create();
- return 1;
+ // FIXME!!!! dieser quatsch ist nur temporaer
+ free(core.devices->head);
+ free(core.devices);
+ core.devices = list_create();
+ return 1;
}
/**
*/
u8 usb_register_driver(usb_driver * dev)
{
- /* add driver to driver list */
- element *tmp = (element *) malloc(sizeof(element));
- tmp->data = (void *) dev;
- tmp->next = NULL;
- list_add_tail(core.drivers, tmp);
+ /* add driver to driver list */
+ element *tmp = (element *) malloc(sizeof(element));
+ tmp->data = (void *) dev;
+ tmp->next = NULL;
+ list_add_tail(core.drivers, tmp);
- /**
- * first check to find a suitable device
- * (root hub drivers need this call here)
- */
- dev->probe();
+ /**
+ * first check to find a suitable device
+ * (root hub drivers need this call here)
+ */
+ dev->probe();
- return 1;
+ return 1;
}
/**
* Call every probe function from every registered
* driver, to check if there is a valid driver
- * for the new device.
+ * for the new device.
*/
void usb_probe_driver()
{
- // call ever registered driver
- usb_driver *drv;
- element *iterator = core.drivers->head;
- while (iterator != NULL) {
- drv = (usb_driver *) iterator->data;
- drv->probe();
- iterator = iterator->next;
- }
+ // call ever registered driver
+ usb_driver *drv;
+ element *iterator = core.drivers->head;
+ while (iterator != NULL) {
+ drv = (usb_driver *) iterator->data;
+ drv->probe();
+ iterator = iterator->next;
+ }
}
/**
*/
usb_irp *usb_get_irp()
{
- return 0;
+ return 0;
}
/**
u8 usb_remove_irp(usb_irp * irp)
{
- return 1;
+ return 1;
}
/**
*/
u16 usb_submit_irp(usb_irp *irp)
{
- usb_transfer_descriptor *td;
- u8 runloop = 1;
- u16 restlength = irp->len;
- char *td_buf_ptr = irp->buffer;
-
- //u8 togl=irp->dev->epTogl[(irp->endpoint & 0x7F)];
- u8 togl = irp->dev->epTogl[(irp->endpoint & 0x7F)];
- //u8 togl=0;
-
- switch (irp->type) {
- case USB_CTRL:
-
- /* alle requests mit dem gleichen algorithmus zerteilen
- * das einzige ist der spezielle get_Device_descriptor request
- * bei dem eine laenge von 64 angegeben ist.
- * wenn man an adresse 0 einen get_device_desciptor schickt
- * dann reichen die ersten 8 byte.
- */
-
- /***************** Setup Stage ***********************/
- td = usb_create_transfer_descriptor(irp);
- td->pid = USB_PID_SETUP;
- td->buffer = irp->buffer;
- td->actlen = 8; /* control message are always 8 bytes */
-
- togl = 0;
- td->togl = togl; /* start with data0 */
- if (togl == 0)
- togl = 1;
- else
- togl = 0;
- /**** send token ****/
- hcdi_enqueue(td);
-
- /***************** Data Stage ***********************/
- /**
- * You can see at bit 7 of bmRequestType if this stage is used,
- * default requests are always 8 byte greate, from
- * host to device. Stage 3 is only neccessary if the request
- * expected datas from the device.
- * bit7 - 1 = from device to host -> yes we need data stage
- * bit7 - 0 = from host to device -> no send zero packet
- *
- * nach einem setup token kann nur ein IN token in stage 3 folgen
- * nie aber ein OUT. Ein Zero OUT wird nur als Bestaetigung benoetigt.
- *
- *
- * bit7 = 1
- * Device to Host
- * - es kommen noch Daten mit PID_IN an
- * - host beendet mit PID_OUT DATA1 Zero
- * bit7 - 0
- * Host zu Device (wie set address)
- * - device sendet ein PID_IN DATA1 Zero Packet als bestaetigung
- */
- usb_device_request *setup = (usb_device_request *) irp->buffer;
- u8 bmRequestType = setup->bmRequestType;
-
- if (bmRequestType & 0x80) { /* check bit 7 of bmRequestType */
-
- /* schleife die die tds generiert */
- while (runloop) {
- td = usb_create_transfer_descriptor(irp);
- td->actlen = irp->epsize;
- /* stop loop if all bytes are send */
- if (restlength <= irp->epsize) {
- runloop = 0;
- td->actlen = restlength;
- }
-
- td->buffer = td_buf_ptr;
- /* move pointer for next packet */
- td_buf_ptr = td_buf_ptr + irp->epsize;
-
- td->pid = USB_PID_IN;
- td->togl = togl;
- if (togl == 0)
- togl = 1;
- else
- togl = 0;
-
- /* wenn device descriptor von adresse 0 angefragt wird werden nur
- * die ersten 8 byte abgefragt
- */
- if (setup->bRequest == GET_DESCRIPTOR && (setup->wValue >> 8) == 1
- && td->devaddress == 0) {
- runloop = 0; /* stop loop */
- }
-
- /**** send token ****/
- hcdi_enqueue(td);
-
- /* pruefe ob noch weitere Pakete vom Device abgeholt werden muessen */
- restlength = restlength - irp->epsize;
- }
- }
-
-
- /***************** Status Stage ***********************/
- /* Zero packet for end */
- td = usb_create_transfer_descriptor(irp);
- td->togl = 1; /* zero data packet = always DATA1 packet */
- td->actlen = 0;
- td->buffer = NULL;
-
- /**
- * bit7 = 1, host beendet mit PID_OUT DATA1 Zero
- * bit7 = 0, device sendet ein PID_IN DATA1 Zero Packet als bestaetigung
- */
- if (bmRequestType & 0x80) { /* check bit 7 of bmRequestType */
- td->pid = USB_PID_OUT;
- } else {
- td->pid = USB_PID_IN;
- }
- /**** send token ****/
- hcdi_enqueue(td);
- free(td);
-
-
- break;
- case USB_BULK:
-
- core.stdout("bulk\r\n");
- //u8 runloop=1;
- //u16 restlength = irp->len;
- //char * td_buf_ptr=irp->buffer;
-
- /* schleife die die tds generiert */
- while (runloop) {
-
- td = usb_create_transfer_descriptor(irp);
- td->endpoint = td->endpoint & 0x7F; /* clear direction bit */
-
- /* max packet size for given endpoint */
- td->actlen = irp->epsize;
-
- /* Generate In Packet */
- if (irp->endpoint & 0x80)
- td->pid = USB_PID_IN;
- else
- /* Generate Out Packet */
- td->pid = USB_PID_OUT;
-
- /* stop loop if all bytes are send */
- if (restlength <= irp->epsize) {
- runloop = 0;
- td->actlen = restlength;
- }
-
- td->buffer = td_buf_ptr;
- /* move pointer for next packet */
- td_buf_ptr = td_buf_ptr + irp->epsize;
-
- td->togl = togl;
- if (togl == 0)
- togl = 1;
- else
- togl = 0;
- /**** send token ****/
- hcdi_enqueue(td);
- free(td);
- }
- /* next togl */
- //if(td->pid == USB_PID_OUT) {
- //if(togl==0) togl=1; else togl=0;
- //}
- irp->dev->epTogl[(irp->endpoint & 0x7F)] = togl;
-
- break;
- }
-
- return 1;
+ usb_transfer_descriptor *td;
+ u8 runloop = 1;
+ u16 restlength = irp->len;
+ char *td_buf_ptr = irp->buffer;
+
+ //u8 togl=irp->dev->epTogl[(irp->endpoint & 0x7F)];
+ u8 togl = irp->dev->epTogl[(irp->endpoint & 0x7F)];
+ //u8 togl=0;
+
+ switch (irp->type) {
+ case USB_CTRL:
+
+ /* alle requests mit dem gleichen algorithmus zerteilen
+ * das einzige ist der spezielle get_Device_descriptor request
+ * bei dem eine laenge von 64 angegeben ist.
+ * wenn man an adresse 0 einen get_device_desciptor schickt
+ * dann reichen die ersten 8 byte.
+ */
+
+ /***************** Setup Stage ***********************/
+ td = usb_create_transfer_descriptor(irp);
+ td->pid = USB_PID_SETUP;
+ td->buffer = irp->buffer;
+ td->actlen = 8; /* control message are always 8 bytes */
+
+ togl = 0;
+ td->togl = togl; /* start with data0 */
+ if (togl == 0)
+ togl = 1;
+ else
+ togl = 0;
+ /**** send token ****/
+ hcdi_enqueue(td);
+
+ /***************** Data Stage ***********************/
+ /**
+ * You can see at bit 7 of bmRequestType if this stage is used,
+ * default requests are always 8 byte greate, from
+ * host to device. Stage 3 is only neccessary if the request
+ * expected datas from the device.
+ * bit7 - 1 = from device to host -> yes we need data stage
+ * bit7 - 0 = from host to device -> no send zero packet
+ *
+ * nach einem setup token kann nur ein IN token in stage 3 folgen
+ * nie aber ein OUT. Ein Zero OUT wird nur als Bestaetigung benoetigt.
+ *
+ *
+ * bit7 = 1
+ * Device to Host
+ * - es kommen noch Daten mit PID_IN an
+ * - host beendet mit PID_OUT DATA1 Zero
+ * bit7 - 0
+ * Host zu Device (wie set address)
+ * - device sendet ein PID_IN DATA1 Zero Packet als bestaetigung
+ */
+ usb_device_request *setup = (usb_device_request *) irp->buffer;
+ u8 bmRequestType = setup->bmRequestType;
+
+ if (bmRequestType & 0x80) { /* check bit 7 of bmRequestType */
+
+ /* schleife die die tds generiert */
+ while (runloop) {
+ td = usb_create_transfer_descriptor(irp);
+ td->actlen = irp->epsize;
+ /* stop loop if all bytes are send */
+ if (restlength <= irp->epsize) {
+ runloop = 0;
+ td->actlen = restlength;
+ }
+
+ td->buffer = td_buf_ptr;
+ /* move pointer for next packet */
+ td_buf_ptr = td_buf_ptr + irp->epsize;
+
+ td->pid = USB_PID_IN;
+ td->togl = togl;
+ if (togl == 0)
+ togl = 1;
+ else
+ togl = 0;
+
+ /* wenn device descriptor von adresse 0 angefragt wird werden nur
+ * die ersten 8 byte abgefragt
+ */
+ if (setup->bRequest == GET_DESCRIPTOR && (setup->wValue >> 8) == 1
+ && td->devaddress == 0) {
+ runloop = 0; /* stop loop */
+ }
+
+ /**** send token ****/
+ hcdi_enqueue(td);
+
+ /* pruefe ob noch weitere Pakete vom Device abgeholt werden muessen */
+ restlength = restlength - irp->epsize;
+ }
+ }
+
+
+ /***************** Status Stage ***********************/
+ /* Zero packet for end */
+ td = usb_create_transfer_descriptor(irp);
+ td->togl = 1; /* zero data packet = always DATA1 packet */
+ td->actlen = 0;
+ td->buffer = NULL;
+
+ /**
+ * bit7 = 1, host beendet mit PID_OUT DATA1 Zero
+ * bit7 = 0, device sendet ein PID_IN DATA1 Zero Packet als bestaetigung
+ */
+ if (bmRequestType & 0x80) { /* check bit 7 of bmRequestType */
+ td->pid = USB_PID_OUT;
+ } else {
+ td->pid = USB_PID_IN;
+ }
+ /**** send token ****/
+ hcdi_enqueue(td);
+ free(td);
+
+
+ break;
+ case USB_BULK:
+
+ core.stdout("bulk\r\n");
+ //u8 runloop=1;
+ //u16 restlength = irp->len;
+ //char * td_buf_ptr=irp->buffer;
+
+ /* schleife die die tds generiert */
+ while (runloop) {
+
+ td = usb_create_transfer_descriptor(irp);
+ td->endpoint = td->endpoint & 0x7F; /* clear direction bit */
+
+ /* max packet size for given endpoint */
+ td->actlen = irp->epsize;
+
+ /* Generate In Packet */
+ if (irp->endpoint & 0x80)
+ td->pid = USB_PID_IN;
+ else
+ /* Generate Out Packet */
+ td->pid = USB_PID_OUT;
+
+ /* stop loop if all bytes are send */
+ if (restlength <= irp->epsize) {
+ runloop = 0;
+ td->actlen = restlength;
+ }
+
+ td->buffer = td_buf_ptr;
+ /* move pointer for next packet */
+ td_buf_ptr = td_buf_ptr + irp->epsize;
+
+ td->togl = togl;
+ if (togl == 0)
+ togl = 1;
+ else
+ togl = 0;
+ /**** send token ****/
+ hcdi_enqueue(td);
+ free(td);
+ }
+ /* next togl */
+ //if(td->pid == USB_PID_OUT) {
+ //if(togl==0) togl=1; else togl=0;
+ //}
+ irp->dev->epTogl[(irp->endpoint & 0x7F)] = togl;
+
+ break;
+ }
+
+ return 1;
}
*/
usb_transfer_descriptor *usb_create_transfer_descriptor(usb_irp * irp)
{
- usb_transfer_descriptor *td =
- (usb_transfer_descriptor *) malloc(sizeof(usb_transfer_descriptor));
+ usb_transfer_descriptor *td =
+ (usb_transfer_descriptor *) malloc(sizeof(usb_transfer_descriptor));
- td->devaddress = irp->dev->address;
- td->endpoint = irp->endpoint;
- td->iso = 0;
- td->state = USB_TRANSFER_DESCR_NONE;
+ td->devaddress = irp->dev->address;
+ td->endpoint = irp->endpoint;
+ td->iso = 0;
+ td->state = USB_TRANSFER_DESCR_NONE;
- return td;
+ return td;
}
* modification, are permitted provided that the following conditions
* are met:
*
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of the FH Augsburg nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the FH Augsburg nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
typedef struct usb_device_t usb_device;
struct usb_device_t {
- u8 address;
- u8 fullspeed;
- u8 bMaxPacketSize0;
- u8 bDeviceClass;
- u8 bDeviceSubClass;
- u8 bDeviceProtocoll;
- u32 idVendor;
- u32 idProduct;
- u32 bcdDevice;
- u8 bNumConfigurations;
-
- u8 epSize[16];
- u8 epTogl[16];
-
- usb_device *next;
+ u8 address;
+ u8 fullspeed;
+ u8 bMaxPacketSize0;
+ u8 bDeviceClass;
+ u8 bDeviceSubClass;
+ u8 bDeviceProtocoll;
+ u32 idVendor;
+ u32 idProduct;
+ u32 bcdDevice;
+ u8 bNumConfigurations;
+
+ u8 epSize[16];
+ u8 epTogl[16];
+
+ usb_device *next;
};
typedef struct usb_endpoint_t usb_endpoint;
struct usb_endpoint_t {
- u8 type;
- u8 size;
- u8 togl;
- usb_endpoint *next;
+ u8 type;
+ u8 size;
+ u8 togl;
+ usb_endpoint *next;
};
typedef struct usb_transfer_descriptor_ep_t usb_transfer_descriptor_ep;
struct usb_transfer_descriptor_ep_t {
- usb_transfer_descriptor_ep *next;
- u8 device_address;
- u8 endpoint;
- struct usb_transfer_descriptor_t *start;
+ usb_transfer_descriptor_ep *next;
+ u8 device_address;
+ u8 endpoint;
+ struct usb_transfer_descriptor_t *start;
};
/**
*/
typedef struct usb_driver_t usb_driver;
struct usb_driver_t {
- char* name;
- void (*probe)(void);
- void (*check)(void);
- void * data;
- usb_driver *next;
+ char* name;
+ void (*probe)(void);
+ void (*check)(void);
+ void * data;
+ usb_driver *next;
};
typedef struct usb_irp_t usb_irp;
struct usb_irp_t {
- //u8 devaddress;
- usb_device * dev;
- u8 endpoint; /* ep -> bit 7 is for direction 1=from dev to host */
- u8 epsize;
- u8 type; /* control, interrupt, bulk or isochron */
+ //u8 devaddress;
+ usb_device * dev;
+ u8 endpoint; /* ep -> bit 7 is for direction 1=from dev to host */
+ u8 epsize;
+ u8 type; /* control, interrupt, bulk or isochron */
- char * buffer;
- u16 len;
+ char * buffer;
+ u16 len;
- //list * td_list;
- u16 timeout;
+ //list * td_list;
+ u16 timeout;
};
*/
typedef struct usb_transfer_descriptor_t usb_transfer_descriptor;
struct usb_transfer_descriptor_t {
- u8 devaddress;
- u8 endpoint;
-
- // TODO: zusammenfassen!
- u8 pid;
- u8 iso;
- u8 togl;
-
- char * buffer;
- u16 actlen;
-
- u8 state;
- usb_transfer_descriptor *next;
+ u8 devaddress;
+ u8 endpoint;
+
+ // TODO: zusammenfassen!
+ u8 pid;
+ u8 iso;
+ u8 togl;
+
+ char * buffer;
+ u16 actlen;
+
+ u8 state;
+ usb_transfer_descriptor *next;
};
//typedef struct usb_core_t usb_core;
struct usb_core_t {
- u8 nextaddress;
- void (*stdout)(char * arg);
- // driver list
- list * drivers;
- list * devices;
+ u8 nextaddress;
+ void (*stdout)(char * arg);
+ // driver list
+ list * drivers;
+ list * devices;
} core;
void usb_init();
usb_transfer_descriptor * usb_create_transfer_descriptor(usb_irp *irp);
-#define USB_IRP_WAITING 1
+#define USB_IRP_WAITING 1
#define USB_TRANSFER_DESCR_NONE 1
*/
usb_device * usb_open(u32 vendor_id, u32 product_id)
{
- usb_device* dev;
- element * iterator = core.devices->head;
- while(iterator != NULL) {
- dev = (usb_device*)iterator->data;
-
- if(dev->idVendor==vendor_id&&dev->idProduct==product_id)
- return dev;
-
- iterator=iterator->next;
- }
-
- return NULL;
+ usb_device* dev;
+ element * iterator = core.devices->head;
+ while(iterator != NULL) {
+ dev = (usb_device*)iterator->data;
+
+ if(dev->idVendor==vendor_id&&dev->idProduct==product_id)
+ return dev;
+
+ iterator=iterator->next;
+ }
+
+ return NULL;
}
*/
usb_device * usb_open_class(u8 class)
{
- usb_device* dev;
- element * iterator = core.devices->head;
- while(iterator != NULL) {
- dev = (usb_device*)iterator->data;
-
- if(dev->bDeviceClass==class)
- return dev;
-
- iterator=iterator->next;
- }
- return NULL;
+ usb_device* dev;
+ element * iterator = core.devices->head;
+ while(iterator != NULL) {
+ dev = (usb_device*)iterator->data;
+
+ if(dev->bDeviceClass==class)
+ return dev;
+
+ iterator=iterator->next;
+ }
+ return NULL;
}
/**
u8 usb_close(usb_device *dev)
{
- return 0;
+ return 0;
}
u8 usb_get_device_descriptor(usb_device *dev, char *buf,u8 size)
{
- return 0;
+ return 0;
}
u8 usb_set_address(usb_device *dev, u8 address)
{
- return 0;
+ return 0;
}
u8 usb_set_configuration(usb_device *dev, u8 configuration)
{
- return 0;
+ return 0;
}
u8 usb_set_altinterface(usb_device *dev, u8 alternate)
{
- return 0;
+ return 0;
}
u8 usb_reset(usb_device *dev)
{
- return 0;
+ return 0;
}
*/
u8 usb_control_msg(usb_device *dev, u8 requesttype, u8 request, u16 value, u16 index, u16 length,char *buf, u16 size, u16 timeout)
{
- usb_irp *irp = (usb_irp*)malloc(sizeof(usb_irp));
- irp->dev = dev;
- //irp->devaddress = dev->address;
- irp->endpoint = 0;
-
- irp->epsize = dev->bMaxPacketSize0;
- irp->type = USB_CTRL;
-
- buf[0]=(char)requesttype;
- buf[1]=(char)request;
- buf[2]=(char)(value >> 8);
- buf[3]=(char)(value);
- buf[4]=(char)(index >> 8);
- buf[5]=(char)(index);
- // lenght buf are the only where the order is inverted
- buf[6]=(char)(length);
- buf[7]=(char)(length >> 8);
-
- irp->buffer = buf;
- irp->len = length;
- irp->timeout = timeout;
-
- usb_submit_irp(irp);
- free(irp);
-
- return 0;
+ usb_irp *irp = (usb_irp*)malloc(sizeof(usb_irp));
+ irp->dev = dev;
+ //irp->devaddress = dev->address;
+ irp->endpoint = 0;
+
+ irp->epsize = dev->bMaxPacketSize0;
+ irp->type = USB_CTRL;
+
+ buf[0]=(char)requesttype;
+ buf[1]=(char)request;
+ buf[2]=(char)(value >> 8);
+ buf[3]=(char)(value);
+ buf[4]=(char)(index >> 8);
+ buf[5]=(char)(index);
+ // lenght buf are the only where the order is inverted
+ buf[6]=(char)(length);
+ buf[7]=(char)(length >> 8);
+
+ irp->buffer = buf;
+ irp->len = length;
+ irp->timeout = timeout;
+
+ usb_submit_irp(irp);
+ free(irp);
+
+ return 0;
}
u8 usb_get_string(usb_device *dev, u8 index, u8 langid, char *buf, u8 buflen)
{
- return 0;
+ return 0;
}
u8 usb_get_string_simple(usb_device *dev, u8 index, char *buf, u8 buflen)
{
- return 0;
+ return 0;
}
u8 usb_get_descriptor(usb_device *dev, unsigned char type, unsigned char index, void *buf, u8 size)
{
- return 0;
+ return 0;
}
*/
u8 usb_bulk_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
{
- usb_irp * irp = (usb_irp*)malloc(sizeof(usb_irp));
- irp->dev = dev;
- //irp->devaddress = dev->address;
-
- irp->endpoint = ep;
- irp->epsize = dev->epSize[ep]; // ermitteln
- irp->type = USB_BULK;
-
- irp->buffer = buf;
- irp->len = size;
- irp->timeout = timeout;
-
- usb_submit_irp(irp);
- free(irp);
-
- return 0;
+ usb_irp * irp = (usb_irp*)malloc(sizeof(usb_irp));
+ irp->dev = dev;
+ //irp->devaddress = dev->address;
+
+ irp->endpoint = ep;
+ irp->epsize = dev->epSize[ep]; // ermitteln
+ irp->type = USB_BULK;
+
+ irp->buffer = buf;
+ irp->len = size;
+ irp->timeout = timeout;
+
+ usb_submit_irp(irp);
+ free(irp);
+
+ return 0;
}
/**
*/
u8 usb_bulk_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
{
- usb_irp * irp = (usb_irp*)malloc(sizeof(usb_irp));
- //irp->devaddress = dev->address;
- irp->dev = dev;
-
- irp->endpoint = ep | 0x80; // from device to host
- irp->epsize = dev->epSize[ep]; // ermitteln
- irp->type = USB_BULK;
-
- irp->buffer = buf;
- irp->len = size;
- irp->timeout = timeout;
-
- usb_submit_irp(irp);
- free(irp);
-
- return 0;
+ usb_irp * irp = (usb_irp*)malloc(sizeof(usb_irp));
+ //irp->devaddress = dev->address;
+ irp->dev = dev;
+
+ irp->endpoint = ep | 0x80; // from device to host
+ irp->epsize = dev->epSize[ep]; // ermitteln
+ irp->type = USB_BULK;
+
+ irp->buffer = buf;
+ irp->len = size;
+ irp->timeout = timeout;
+
+ usb_submit_irp(irp);
+ free(irp);
+
+ return 0;
}
u8 usb_interrupt_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
{
- return 0;
+ return 0;
}
/**
u8 usb_interrupt_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
{
- return 0;
+ return 0;
}
u8 usb_isochron_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
{
- return 0;
+ return 0;
}
/**
{
- return 0;
+ return 0;
}
usb_driver hub = {
- .name = "hub",
- .probe = usb_hub_probe,
- .check = usb_hub_check,
- .data = NULL
+ .name = "hub",
+ .probe = usb_hub_probe,
+ .check = usb_hub_check,
+ .data = NULL
};
void usb_hub_init()
{
- usb_register_driver(&hub);
+ usb_register_driver(&hub);
}
void usb_hub_probe()
{
- // schaue ob aktuell enumeriertes geraet ein hub ist
- #if DEBUG
- core.stdout("Probe: Hub\r\n");
- #endif
- wait_ms(1000);
-
- usb_device * dev;
- dev = usb_open_class(HUB_CLASSCODE);
- if(dev != NULL){
- hub.data = (void*)dev; /* save handle */
- #if DEBUG
- core.stdout("Hub: Found Hub Device\r\n");
- #endif
-
- /* install int in EP */
-
- }
+ // schaue ob aktuell enumeriertes geraet ein hub ist
+ #if DEBUG
+ core.stdout("Probe: Hub\r\n");
+ #endif
+ wait_ms(1000);
+
+ usb_device * dev;
+ dev = usb_open_class(HUB_CLASSCODE);
+ if(dev != NULL){
+ hub.data = (void*)dev; /* save handle */
+ #if DEBUG
+ core.stdout("Hub: Found Hub Device\r\n");
+ #endif
+
+ /* install int in EP */
+
+ }
void usb_hub_check()
{
- // usb_read_interrupt(handle,1,buf);
- // ah neue geraet gefunden
- // mit request den port geziel reseten, damit device adresse 0 hat
- // enumeration start
- // usb_add_device()
- //
- //
- // ah geraet entfernt
- // usb_remove_device(h1);
+ // usb_read_interrupt(handle,1,buf);
+ // ah neue geraet gefunden
+ // mit request den port geziel reseten, damit device adresse 0 hat
+ // enumeration start
+ // usb_add_device()
+ //
+ //
+ // ah geraet entfernt
+ // usb_remove_device(h1);
}
u8 usb_hub_get_hub_descriptor(usb_device *dev, char * buf)
{
- return 0;
+ return 0;
}
u8 usb_hub_get_hub_status(usb_device *dev, char *buf)
{
- return 0;
+ return 0;
}
{
- return 0;
+ return 0;
}
u8 usb_hub_clear_port_feature(usb_device *dev)
{
- return 0;
+ return 0;
}
u8 usb_hub_set_port_feature(usb_device *dev, u8 value)
{
- return 0;
+ return 0;
}
u8 usb_hub_clear_hub_feature(usb_device *dev)
{
- return 0;
+ return 0;
}
u8 usb_hub_set_hub_feature(usb_device *dev)
{
- return 0;
+ return 0;
}
u8 usb_hub_set_hub_descriptor(usb_device *dev)
{
- return 0;
+ return 0;
}
u8 massstorage_in_use;
usb_driver storage = {
- .name = "storage",
- .probe = usb_storage_probe,
- .check = usb_storage_check,
- .data = NULL
+ .name = "storage",
+ .probe = usb_storage_probe,
+ .check = usb_storage_check,
+ .data = NULL
};
void usb_storage_init()
{
- massstorage_in_use = 0;
- usb_register_driver(&storage);
+ massstorage_in_use = 0;
+ usb_register_driver(&storage);
}
void usb_storage_probe()
{
- // schaue ob aktuell enumeriertes geraet ein storage ist
- #if DEBUG
- core.stdout("Probe: Storage\r\n");
- #endif
+ // schaue ob aktuell enumeriertes geraet ein storage ist
+ #if DEBUG
+ core.stdout("Probe: Storage\r\n");
+ #endif
- /* read interface descriptor for class code */
- char buf[32];
-
- usb_device* dev;
- element * iterator = core.devices->head;
-
- while(iterator != NULL) {
- dev = (usb_device*)iterator->data;
-
- /* get interface descriptor */
- usb_control_msg(dev, 0x80, GET_DESCRIPTOR,2, 0, 32,buf, 8, 0);
-
- if(buf[14]==MASS_STORAGE_CLASSCODE){
- massstorage[massstorage_in_use] = dev;
- massstorage_in_use++;
- #if DEBUG
- core.stdout("Storage: Found Storage Device\r\n");
- #endif
-
- /* here is only my lib driver test */
- usb_storage_open(0);
- usb_storage_inquiry(0);
- usb_storage_read_capacity(0);
-
- //char * buf = (char*)malloc(512);
- //free(buf);
- //char buf[512];
- //usb_storage_read_sector(0,1,buf);
-
- /* end of driver test */
- }
-
- iterator=iterator->next;
- }
+ /* read interface descriptor for class code */
+ char buf[32];
+
+ usb_device* dev;
+ element * iterator = core.devices->head;
+
+ while(iterator != NULL) {
+ dev = (usb_device*)iterator->data;
+
+ /* get interface descriptor */
+ usb_control_msg(dev, 0x80, GET_DESCRIPTOR,2, 0, 32,buf, 8, 0);
+
+ if(buf[14]==MASS_STORAGE_CLASSCODE){
+ massstorage[massstorage_in_use] = dev;
+ massstorage_in_use++;
+ #if DEBUG
+ core.stdout("Storage: Found Storage Device\r\n");
+ #endif
+
+ /* here is only my lib driver test */
+ usb_storage_open(0);
+ usb_storage_inquiry(0);
+ usb_storage_read_capacity(0);
+
+ //char * buf = (char*)malloc(512);
+ //free(buf);
+ //char buf[512];
+ //usb_storage_read_sector(0,1,buf);
+
+ /* end of driver test */
+ }
+
+ iterator=iterator->next;
+ }
}
void usb_storage_check()
{
- // wird periodisch augerufen
- // da ein mass storage aber keinen interrupt oder isochronen endpunkt
- // hat passiert hier nichts
+ // wird periodisch augerufen
+ // da ein mass storage aber keinen interrupt oder isochronen endpunkt
+ // hat passiert hier nichts
}
*/
u8 usb_storage_open(u8 device)
{
- /* set configuration */
- char tmp[8];
- usb_control_msg(massstorage[device], 0x00,SET_CONFIGURATION,0x0100, 0, 0,tmp, 8, 0);
+ /* set configuration */
+ char tmp[8];
+ usb_control_msg(massstorage[device], 0x00,SET_CONFIGURATION,0x0100, 0, 0,tmp, 8, 0);
- /* class request */
- usb_control_msg(massstorage[device], 0xA1,0xFE,0, 0, 1,tmp, 8, 0);
+ /* class request */
+ usb_control_msg(massstorage[device], 0xA1,0xFE,0, 0, 1,tmp, 8, 0);
- /* wait until the stick is complete ready */
- wait_ms(10);
-
- //FIXME and all other return values!!!
- return 1;
+ /* wait until the stick is complete ready */
+ wait_ms(10);
+
+ //FIXME and all other return values!!!
+ return 1;
}
u8 usb_storage_inquiry(u8 device)
{
- /* send cwb "usbc" */
-
- usb_storage_cbw *cbw = (usb_storage_cbw*)malloc(sizeof(usb_storage_cbw));
- cbw->dCBWSignature= 0x43425355;
- cbw->dCBWTag=0x826A6008;
- cbw->dCBWDataTransferLength=0x00000024;
- cbw->bCWDFlags=0x80;
- cbw->bCBWLun=0x00;
- cbw->bCBWCBLength=0x01;
+ /* send cwb "usbc" */
+
+ usb_storage_cbw *cbw = (usb_storage_cbw*)malloc(sizeof(usb_storage_cbw));
+ cbw->dCBWSignature= 0x43425355;
+ cbw->dCBWTag=0x826A6008;
+ cbw->dCBWDataTransferLength=0x00000024;
+ cbw->bCWDFlags=0x80;
+ cbw->bCBWLun=0x00;
+ cbw->bCBWCBLength=0x01;
- u8 i;
- for(i=0;i<16;i++)
- cbw->CBWCB[i]=0x00;
+ u8 i;
+ for(i=0;i<16;i++)
+ cbw->CBWCB[i]=0x00;
- cbw->CBWCB[0]=0x12; // 0x12 = INQUIRY
+ cbw->CBWCB[0]=0x12; // 0x12 = INQUIRY
- usb_bulk_write(massstorage[device], 2, (char*)cbw, 31, 0);
- usb_bulk_read(massstorage[device], 1, (char*)cbw, 36, 0);
- usb_bulk_read(massstorage[device], 1, (char*)cbw, 13, 0);
+ usb_bulk_write(massstorage[device], 2, (char*)cbw, 31, 0);
+ usb_bulk_read(massstorage[device], 1, (char*)cbw, 36, 0);
+ usb_bulk_read(massstorage[device], 1, (char*)cbw, 13, 0);
- free(cbw);
+ free(cbw);
- return 0;
+ return 0;
}
u8 usb_storage_read_capacity(u8 device)
{
- /* send cwb "usbc" */
+ /* send cwb "usbc" */
- char tmp[8];
- u8 i;
- usb_storage_cbw * cbw = (usb_storage_cbw*)malloc(sizeof(usb_storage_cbw));
+ char tmp[8];
+ u8 i;
+ usb_storage_cbw * cbw = (usb_storage_cbw*)malloc(sizeof(usb_storage_cbw));
- usb_control_msg(massstorage[device], 0x02,1,0, 0x8100, 0,tmp, 8, 0); //
+ usb_control_msg(massstorage[device], 0x02,1,0, 0x8100, 0,tmp, 8, 0); //
- cbw->dCBWSignature= 0x43425355;
- cbw->dCBWTag=0x826A6008;
- cbw->dCBWDataTransferLength=0x00000008;
- cbw->bCWDFlags=0x80;
- cbw->bCBWLun=0x00;
- cbw->bCBWCBLength=0x0A;
+ cbw->dCBWSignature= 0x43425355;
+ cbw->dCBWTag=0x826A6008;
+ cbw->dCBWDataTransferLength=0x00000008;
+ cbw->bCWDFlags=0x80;
+ cbw->bCBWLun=0x00;
+ cbw->bCBWCBLength=0x0A;
- for(i=0;i<16;i++)
- cbw->CBWCB[i]=0x00;
+ for(i=0;i<16;i++)
+ cbw->CBWCB[i]=0x00;
- cbw->CBWCB[0]=0x25; // 0x12 = INQUIRY
+ cbw->CBWCB[0]=0x25; // 0x12 = INQUIRY
- usb_bulk_write(massstorage[device], 2, (char*)cbw, 31, 0);
- usb_bulk_read(massstorage[device], 1, (char*)cbw, 8, 0);
- usb_bulk_read(massstorage[device], 1, (char*)cbw, 13, 0);
+ usb_bulk_write(massstorage[device], 2, (char*)cbw, 31, 0);
+ usb_bulk_read(massstorage[device], 1, (char*)cbw, 8, 0);
+ usb_bulk_read(massstorage[device], 1, (char*)cbw, 13, 0);
- free(cbw);
+ free(cbw);
- return 0;
+ return 0;
}
u8 usb_storage_read_sector(u8 device, u32 sector, char * buf)
{
- /* send cwb "usbc" */
- char tmpbuf[] = {0x55,0x53,0x42,0x43,0x08,
+ /* send cwb "usbc" */
+ char tmpbuf[] = {0x55,0x53,0x42,0x43,0x08,
0xE0,0x63,0x82,0x00,0x02,
0x00,0x00,0x80,0x00,0x0A,
0x28,0x00,0x00,0x00,0x00,
0x00,
0x00,0x00,0x00,0x00,0x00};
- usb_bulk_write(massstorage[device], 2, tmpbuf, 31, 0);
- //usb_bulk_read(massstorage[device], 1, buf,64,0);
- //usb_bulk_read(massstorage[device], 1, buf, 13, 0);
+ usb_bulk_write(massstorage[device], 2, tmpbuf, 31, 0);
+ //usb_bulk_read(massstorage[device], 1, buf,64,0);
+ //usb_bulk_read(massstorage[device], 1, buf, 13, 0);
-
- return 0;
+
+ return 0;
}
u8 usb_storage_write_sector(u8 device, u32 sector, char * buf)
{
- return 0;
+ return 0;
}
typedef struct usb_storage_cbw_t usb_storage_cbw;
struct usb_storage_cbw_t {
- u32 dCBWSignature;
- u32 dCBWTag;
- u32 dCBWDataTransferLength;
- u8 bCWDFlags;
- u8 bCBWLun;
- u8 bCBWCBLength;
- u8 CBWCB[16];
+ u32 dCBWSignature;
+ u32 dCBWTag;
+ u32 dCBWDataTransferLength;
+ u8 bCWDFlags;
+ u8 bCBWLun;
+ u8 bCBWCBLength;
+ u8 CBWCB[16];
};
typedef struct usb_storage_csw_t usb_storage_csw;
struct usb_storage_csw_t {
- u32 dCSWSignature;
- u32 dCSWTag;
- u32 dCSWDataResidue;
- u8 bCSWStatus;
+ u32 dCSWSignature;
+ u32 dCSWTag;
+ u32 dCSWDataResidue;
+ u8 bCSWStatus;
};
u8 devices_in_use;
usb_driver skeleton = {
- .name = "skeleton",
- .probe = usb_skeleton_probe,
- .unprobe = usb_skeleton_unprobe,
- .check = usb_skeleton_check,
- .data = NULL
+ .name = "skeleton",
+ .probe = usb_skeleton_probe,
+ .unprobe = usb_skeleton_unprobe,
+ .check = usb_skeleton_check,
+ .data = NULL
};
/* Zum Treiber initialisieren und anmelden am Stack */
void usb_skeleton_init()
{
- devices_in_use = 0;
- usb_register_driver(&skeleton);
+ devices_in_use = 0;
+ usb_register_driver(&skeleton);
}
/* Prüfen ob neues Gerät vom Treiber aus angesteuert werden kann */
void usb_skeleton_probe()
{
- usb_device * tmp;
- tmp = usb_open(0x1234,0x9876);
- if(tmp!=NULL) {
- /* neues Gerät gefunden */
+ usb_device * tmp;
+ tmp = usb_open(0x1234,0x9876);
+ if(tmp!=NULL) {
+ /* neues Gerät gefunden */
- /* wenn Gerät noch nicht in interner Datenstruktur */
- if(devices_in_use<MAX_DEVICES)
- devices[devices_in_use++] = tmp;
- }
+ /* wenn Gerät noch nicht in interner Datenstruktur */
+ if(devices_in_use<MAX_DEVICES)
+ devices[devices_in_use++] = tmp;
+ }
}
/* Entferntes Gerät aus Treiberstrukturen löschen */
void usb_skeleton_unprobe(usb_device * dev)
{
- u8 i;
- for(i=0;i<MAX_DEVICES;i++) {
- if(devices[i]==dev)
- usb_close(dev);
- }
+ u8 i;
+ for(i=0;i<MAX_DEVICES;i++) {
+ if(devices[i]==dev)
+ usb_close(dev);
+ }
}
/* Für periodische Endpunkte, Verwaltungs- und Steuerungsaufgaben */
struct ohci_hcca {
#define NUM_INITS 32
- u32 int_table[NUM_INITS]; /* periodic schedule */
- /*
- * OHCI defines u16 frame_no, followed by u16 zero pad.
- * Since some processors can't do 16 bit bus accesses,
- * portable access must be a 32 bits wide.
- */
- u32 frame_no; /* current frame number */
- u32 done_head; /* info returned for an interrupt */
- u8 reserved_for_hc [116];
- u8 what [4]; /* spec only identifies 252 bytes :) */
+ u32 int_table[NUM_INITS]; /* periodic schedule */
+ /*
+ * OHCI defines u16 frame_no, followed by u16 zero pad.
+ * Since some processors can't do 16 bit bus accesses,
+ * portable access must be a 32 bits wide.
+ */
+ u32 frame_no; /* current frame number */
+ u32 done_head; /* info returned for an interrupt */
+ u8 reserved_for_hc [116];
+ u8 what [4]; /* spec only identifies 252 bytes :) */
} ALIGNED(256);
#endif
list* list_create()
{
- list *l = (list*)malloc(sizeof(list));
- l->head = NULL;
- return l;
+ list *l = (list*)malloc(sizeof(list));
+ l->head = NULL;
+ return l;
}
u8 list_add_tail(list *l, element *e)
{
- e->next = NULL;
+ e->next = NULL;
- /* if head is empty put first element here */
- if(l->head==NULL){
- l->head = e;
- return 1;
- }
+ /* if head is empty put first element here */
+ if(l->head==NULL){
+ l->head = e;
+ return 1;
+ }
- /* find last element */
- element * iterator;
- iterator = l->head;
+ /* find last element */
+ element * iterator;
+ iterator = l->head;
- while(iterator->next!=NULL) {
- iterator = iterator->next;
- }
- iterator->next = e;
+ while(iterator->next!=NULL) {
+ iterator = iterator->next;
+ }
+ iterator->next = e;
- return 1;
+ return 1;
}
// FIXME: untested and unused!!
u8 list_delete_element(list *l, element *e)
{
- return 1;
+ return 1;
}
// FIXME: untested and unused!!
u8 list_is_element_last(list *l, element *e)
{
- if(e->next==NULL)
- return 1;
- else
- return 0;
+ if(e->next==NULL)
+ return 1;
+ else
+ return 0;
}
// FIXME: untested and unused!!
element * list_find_next_element(list *l, element *e)
{
- element * iterator;
- iterator = l->head;
+ element * iterator;
+ iterator = l->head;
- while(iterator!=NULL){
- if(iterator == e)
- return iterator->next;
- iterator = iterator->next;
- }
- return NULL;
+ while(iterator!=NULL){
+ if(iterator == e)
+ return iterator->next;
+ iterator = iterator->next;
+ }
+ return NULL;
}
typedef struct element_t element;
struct element_t {
- void * data;
- element * next;
+ void * data;
+ element * next;
};
typedef struct list_t list;
struct list_t {
- element * head;
+ element * head;
};