/*
* Greybus module manifest definition
*
* See "Greybus Application Protocol" document (version 0.1) for
* details on these values and structures.
*
* Copyright 2014 Google Inc.
* Copyright 2014 Linaro Ltd.
*
* Released under the GPLv2 and BSD licenses.
*/
#ifndef __GREYBUS_MANIFEST_H
#define __GREYBUS_MANIFEST_H
#pragma pack(push, 1)
enum greybus_descriptor_type {
GREYBUS_TYPE_INVALID = 0x00,
GREYBUS_TYPE_MODULE = 0x01,
GREYBUS_TYPE_STRING = 0x02,
GREYBUS_TYPE_INTERFACE = 0x03,
GREYBUS_TYPE_CPORT = 0x04,
GREYBUS_TYPE_CLASS = 0x05,
};
enum greybus_protocol {
GREYBUS_PROTOCOL_CONTROL = 0x00,
GREYBUS_PROTOCOL_AP = 0x01,
GREYBUS_PROTOCOL_GPIO = 0x02,
GREYBUS_PROTOCOL_I2C = 0x03,
GREYBUS_PROTOCOL_UART = 0x04,
GREYBUS_PROTOCOL_HID = 0x05,
GREYBUS_PROTOCOL_USB = 0x06,
GREYBUS_PROTOCOL_SDIO = 0x07,
GREYBUS_PROTOCOL_BATTERY = 0x08,
GREYBUS_PROTOCOL_PWM = 0x09,
GREYBUS_PROTOCOL_I2S = 0x0a,
GREYBUS_PROTOCOL_SPI = 0x0b,
GREYBUS_PROTOCOL_DISPLAY = 0x0c,
GREYBUS_PROTOCOL_CAMERA = 0x0d,
GREYBUS_PROTOCOL_SENSOR = 0x0e,
GREYBUS_PROTOCOL_LED = 0x0f,
GREYBUS_PROTOCOL_VIBRATOR = 0x10,
/* ... */
GREYBUS_PROTOCOL_VENDOR = 0xff,
};
enum greybus_class_type {
GREYBUS_CLASS_CONTROL = 0x00,
GREYBUS_CLASS_AP = 0x01,
GREYBUS_CLASS_GPIO = 0x02,
GREYBUS_CLASS_I2C = 0x03,
GREYBUS_CLASS_UART = 0x04,
GREYBUS_CLASS_HID = 0x05,
GREYBUS_CLASS_USB = 0x06,
GREYBUS_CLASS_SDIO = 0x07,
GREYBUS_CLASS_BATTERY = 0x08,
GREYBUS_CLASS_PWM = 0x09,
GREYBUS_CLASS_I2S = 0x0a,
GREYBUS_CLASS_SPI = 0x0b,
GREYBUS_CLASS_DISPLAY = 0x0c,
GREYBUS_CLASS_CAMERA = 0x0d,
GREYBUS_CLASS_SENSOR = 0x0e,
GREYBUS_CLASS_VENDOR = 0xff,
};
/*
* A module descriptor describes information about a module as a
* whole, *not* the functions within it.
*/
struct greybus_descriptor_module {
__le16 vendor;
__le16 product;
__le16 version; // TODO - remove after Dec demo.
__u8 vendor_stringid;
__u8 product_stringid;
__le64 unique_id;
};
/*
* The string in a string descriptor is not NUL-terminated. The
* size of the descriptor will be rounded up to a multiple of 4
* bytes, by padding the string with 0x00 bytes if necessary.
*/
struct greybus_descriptor_string {
__u8 length;
__u8 id;
__u8 string[0];
};
/*
* An interface descriptor simply defines a module-unique id for
* each interface present on a module. Its sole purpose is to allow
* CPort descriptors to specify which interface they are associated
* with. Normally there's only one interface, with id 0. The
* second one must have id 1, and so on consecutively.
*
* The largest CPort id associated with an interface (defined by a
* CPort descriptor in the manifest) is used to determine how to
* encode the device id and module number in UniPro packets
* that use the interface.
*/
struct greybus_descriptor_interface {
__u8 id; /* module-relative id (0..) */
};
/*
* A CPort descriptor indicates the id of the bundle within the
* module it's associated with, along with the CPort id used to
* address the CPort. The protocol id defines the format of messages
* exchanged using the CPort.
*/
struct greybus_descriptor_cport {
__u8 bundle;
__le16 id;
__u8 protocol_id; /* enum greybus_protocol */
};
/*
* A class descriptor defines functionality supplied by a module.
* Beyond that, not much else is defined yet...
*/
struct greybus_descriptor_class {
__u8 class; /* enum greybus_class_type */
};
struct greybus_descriptor_header {
__le16 size;
__u8 type; /* enum greybus_descriptor_type */
};
struct greybus_descriptor {
struct greybus_descriptor_header header;
union {
struct greybus_descriptor_module module;
struct greybus_descriptor_string string;
struct greybus_descriptor_interface interface;
struct greybus_descriptor_cport cport;
struct greybus_descriptor_class class;
};
};
struct greybus_manifest_header {
__le16 size;
__u8 version_major;
__u8 version_minor;
};
struct greybus_manifest {
struct greybus_manifest_header header;
struct greybus_descriptor descriptors[0];
};
#pragma pack(pop)
#endif /* __GREYBUS_MANIFEST_H */