wiki:NewDriverClass

Adding a new driver class takes a few steps:

  • Add the class in the class enumeration
  • Add a header describing the class
    • its request functions
    • a structure containing pointer to request functions
    • utility function prototypes (blocking request wrappers, …) [1]
  • Add reference to the class in the driver structure
  • Add a configuration token for the class
  • Add a directory for the class
  • Add a C-file with utility functions [1]

[1]: This is only needed if the class has such utility functions.

In the examples, we'll call the new class foobar.

Adding the class in the device type enumeration

Edit device/include/device/device.h, you'll see a enum device_class_e. Add the new device type at the end.

    device_class_lcd,
    device_class_gpio,
    device_class_i2c,
+   device_class_foobar,
  };

Adding a header describing the class

Create a file in drivers/include/device/foobar.h. It may contain

  • Callback definitions,
  • Request function prototypes,
  • Global utility functions.

See trunk/mutekh/drivers/include/device/char.h for sample file.

The struct dev_class_foobar_s is a structure holding all the class-specific request functions. You may ensure this structure holds less pointers than the DRV_MAX_FUNC_COUNT constant defined in trunk/mutekh/drivers/include/device/driver.h.

Don't forget to protect the new header against circular inclusions with the lines:

#ifndef __DEVICE_FOOBAR_H__
#define __DEVICE_FOOBAR_H__

#endif

We'll use that macro later.

Adding a reference to the class in the driver structure

Edit trunk/mutekh/drivers/include/device/driver.h and add an entry in the f union of the struct driver_s.

You must protect it with the macros defined in the header of the class, in case the class is not included in legacy code.

Dont #include your driver class in driver.h.

#ifdef __DEVICE_FOOBAR_H__
    struct dev_class_foobar_s foobar;
#endif

Add a configuration token for the class

Edit trunk/mutekh/drivers/device/drivers.config, add a configuration block for the class:

%config CONFIG_DRIVER_FOOBAR
flags nodefine
desc At least one foobar device driver must be enabled to have it defined
%config end

The flags nodefine statement tells the build system an user may not directly define this token, and implies this token is only allowed to be provided by another one.

Create a directory for the class

  • create a driver/device/foobar directory,
  • add a Makefile inside it,
  • add foobar in the list of subdirectories in driver/device/Makefile.

Create the global helper functions file for your class

  • create a driver/device/foobar/device_foobar.c,
  • add it in driver/device/foobar/Makefile.

Add a new driver

See NewDriver

Last modified 10 years ago Last modified on Dec 22, 2009, 3:50:17 PM