Driver Types relate to whether a driver supports a peripheral, utility function, or middleware.
A peripheral driver is a driver that is directly related to some functionality in some hardware peripherals. This is usually not the full functionality set available in the hardware peripheral, but a subset to make it portable between hardware platforms with different hardware peripheral implementations.
Utility drivers are hardware agnostic drivers that implement commonly used software concepts. The utility drivers are available for both the Foundation Services AVR Code drivers and the user application. Examples of utility drivers are a generic linked list or a ring buffer. Utility drivers can also be in form of C macro definitions. Moving commonly used code into utility drivers makes it easier to maintain code and help the compiler to optimize the code because the same code is used by different drivers, but only one copy is needed. The utility drivers are fully abstracted and not bound to any particular hardware platform or type
Middleware drivers are built on top of peripheral drivers and does not have any direct link to the underlying hardware. A middleware driver can depend on multiple peripheral drivers at the same time or support a range of different peripheral drivers. These drivers usually implement highly abstracted code that implement some kind of software concept like graphics libraries, USB classes, or file systems.