mirror of
https://github.com/linux-usb-gadgets/libusbgx.git
synced 2025-07-13 21:49:45 +03:00
libusbgx: Add functions to set all strs and attrs with one call.
Rename usbg_create_gadget() to usbg_create_vid_pid(). dd usbg_create_gadget() to allow gadget creation with given attributes and strings. Add usbg_set_gadget_attrs() which allow to set all attributes with one call. Add usbg_set_gadget_strs() which allow to set all strings with one call. Gadget structure creation and initialization has been moved to usbg_create_empty_gadget() to avoid copy-paste same code in usbg_create_gadget_vid_pid() and usbg_create_gadget(). Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com> [Port from libusbg and update description] Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com>
This commit is contained in:
parent
d1148ca3fc
commit
2a0e2bc756
3 changed files with 137 additions and 22 deletions
|
@ -42,7 +42,7 @@ int main(void)
|
|||
goto out1;
|
||||
}
|
||||
|
||||
g = usbg_create_gadget(s, "g1", VENDOR, PRODUCT);
|
||||
g = usbg_create_gadget_vid_pid(s, "g1", VENDOR, PRODUCT);
|
||||
if (!g) {
|
||||
fprintf(stderr, "Error on create gadget\n");
|
||||
goto out2;
|
||||
|
|
|
@ -269,9 +269,30 @@ extern struct config *usbg_get_config(struct gadget *g, const char *name);
|
|||
* @param idProduct Gadget product ID
|
||||
* @return Pointer to gadget or NULL if the gadget cannot be created
|
||||
*/
|
||||
extern struct gadget *usbg_create_gadget(struct state *s, char *name,
|
||||
extern struct gadget *usbg_create_gadget_vid_pid(struct state *s, char *name,
|
||||
uint16_t idVendor, uint16_t idProduct);
|
||||
|
||||
/**
|
||||
* @brief Create a new USB gadget device and set given attributes
|
||||
* and strings
|
||||
* @param s Pointer to state
|
||||
* @param name Name of the gadget
|
||||
* @param g_attrs Gadget attributes to be set. If NULL setting is omitted.
|
||||
* @param g_strs Gadget strings to be set. If NULL setting is omitted.
|
||||
* @note Given strings are assumed to be in US English
|
||||
* @return Pointer to gadget or NULL if the gadget cannot be created
|
||||
*/
|
||||
extern struct gadget *usbg_create_gadget(struct state *s, char *name,
|
||||
struct gadget_attrs *g_attrs, struct gadget_strs *g_strs);
|
||||
|
||||
/**
|
||||
* @brief Set the USB gadget attributes
|
||||
* @param g Pointer to gadget
|
||||
* @param g_attrs Gadget attributes
|
||||
*/
|
||||
extern void usbg_set_gadget_attrs(struct gadget *g,
|
||||
struct gadget_attrs *g_attrs);
|
||||
|
||||
/**
|
||||
* @brief Set the USB gadget vendor id
|
||||
* @param g Pointer to gadget
|
||||
|
@ -333,6 +354,15 @@ extern void usbg_set_gadget_device_bcd_device(struct gadget *g,
|
|||
*/
|
||||
extern void usbg_set_gadget_device_bcd_usb(struct gadget *g, uint16_t bcdUSB);
|
||||
|
||||
/**
|
||||
* @brief Set the USB gadget strings
|
||||
* @param g Pointer to gadget
|
||||
* @param lang USB language ID
|
||||
* @param g_sttrs Gadget attributes
|
||||
*/
|
||||
extern void usbg_set_gadget_strs(struct gadget *g, int lang,
|
||||
struct gadget_strs *g_strs);
|
||||
|
||||
/**
|
||||
* @brief Set the serial number for a gadget
|
||||
* @param g Pointer to gadget
|
||||
|
|
111
src/usbg.c
111
src/usbg.c
|
@ -525,22 +525,12 @@ struct binding *usbg_get_link_binding(struct config *c, struct function *f)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct gadget *usbg_create_gadget(struct state *s, char *name,
|
||||
uint16_t idVendor, uint16_t idProduct)
|
||||
static struct gadget *usbg_create_empty_gadget(struct state *s, char *name)
|
||||
{
|
||||
char gpath[USBG_MAX_PATH_LENGTH];
|
||||
struct gadget *g, *cur;
|
||||
struct gadget *g;
|
||||
int ret;
|
||||
|
||||
if (!s)
|
||||
return NULL;
|
||||
|
||||
g = usbg_get_gadget(s, name);
|
||||
if (g) {
|
||||
ERROR("duplicate gadget name\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sprintf(gpath, "%s/%s", s->path, name);
|
||||
|
||||
g = malloc(sizeof(struct gadget));
|
||||
|
@ -552,7 +542,7 @@ struct gadget *usbg_create_gadget(struct state *s, char *name,
|
|||
TAILQ_INIT(&g->configs);
|
||||
TAILQ_INIT(&g->functions);
|
||||
strcpy(g->name, name);
|
||||
sprintf(g->path, "%s", s->path);
|
||||
strcpy(g->path, s->path);
|
||||
g->parent = s;
|
||||
|
||||
ret = mkdir(gpath, S_IRWXU|S_IRWXG|S_IRWXO);
|
||||
|
@ -562,6 +552,32 @@ struct gadget *usbg_create_gadget(struct state *s, char *name,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* Should be empty but read the default */
|
||||
usbg_read_string(g->path, g->name, "UDC", g->udc);
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct gadget *usbg_create_gadget_vid_pid(struct state *s, char *name,
|
||||
uint16_t idVendor, uint16_t idProduct)
|
||||
{
|
||||
struct gadget *g;
|
||||
|
||||
if (!s)
|
||||
return NULL;
|
||||
|
||||
g = usbg_get_gadget(s, name);
|
||||
if (g) {
|
||||
ERROR("duplicate gadget name\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
g = usbg_create_empty_gadget(s, name);
|
||||
|
||||
/* Check if gadget creation was successful and set attributes */
|
||||
if (g) {
|
||||
usbg_write_hex16(s->path, name, "idVendor", idVendor);
|
||||
usbg_write_hex16(s->path, name, "idProduct", idProduct);
|
||||
|
||||
|
@ -569,10 +585,61 @@ struct gadget *usbg_create_gadget(struct state *s, char *name,
|
|||
usbg_parse_strings(s->path, name, &g->strs);
|
||||
|
||||
INSERT_TAILQ_STRING_ORDER(&s->gadgets, ghead, name, g, gnode);
|
||||
}
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
struct gadget *usbg_create_gadget(struct state *s, char *name,
|
||||
struct gadget_attrs *g_attrs, struct gadget_strs *g_strs)
|
||||
{
|
||||
struct gadget *g;
|
||||
|
||||
if (!s)
|
||||
return NULL;
|
||||
|
||||
g = usbg_get_gadget(s, name);
|
||||
if (g) {
|
||||
ERROR("duplicate gadget name\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
g = usbg_create_empty_gadget(s, name);
|
||||
|
||||
/* Check if gadget creation was successful and set attrs and strings */
|
||||
if (g) {
|
||||
if (g_attrs)
|
||||
usbg_set_gadget_attrs(g, g_attrs);
|
||||
else
|
||||
usbg_parse_gadget_attrs(s->path, name, &g->attrs);
|
||||
|
||||
if (g_strs)
|
||||
usbg_set_gadget_strs(g, LANG_US_ENG, g_strs);
|
||||
else
|
||||
usbg_parse_strings(s->path, name, &g->strs);
|
||||
|
||||
INSERT_TAILQ_STRING_ORDER(&s->gadgets, ghead, name, g, gnode);
|
||||
}
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
void usbg_set_gadget_attrs(struct gadget *g, struct gadget_attrs *g_attrs)
|
||||
{
|
||||
if (!g || !g_attrs)
|
||||
return;
|
||||
|
||||
g->attrs = *g_attrs;
|
||||
usbg_write_hex16(g->path, g->name, "bcdUSB", g_attrs->bcdUSB);
|
||||
usbg_write_hex8(g->path, g->name, "bDeviceClass", g_attrs->bDeviceClass);
|
||||
usbg_write_hex8(g->path, g->name, "bDeviceSubClass", g_attrs->bDeviceSubClass);
|
||||
usbg_write_hex8(g->path, g->name, "bDeviceProtocol", g_attrs->bDeviceProtocol);
|
||||
usbg_write_hex8(g->path, g->name, "bMaxPacketSize0", g_attrs->bMaxPacketSize0);
|
||||
usbg_write_hex16(g->path, g->name, "idVendor", g_attrs->idVendor);
|
||||
usbg_write_hex16(g->path, g->name, "idProduct", g_attrs->idProduct);
|
||||
usbg_write_hex16(g->path, g->name, "bcdDevice", g_attrs->bcdDevice);
|
||||
}
|
||||
|
||||
void usbg_set_gadget_vendor_id(struct gadget *g, uint16_t idVendor)
|
||||
{
|
||||
g->attrs.idVendor = idVendor;
|
||||
|
@ -621,6 +688,24 @@ void usbg_set_gadget_device_bcd_usb(struct gadget *g, uint16_t bcdUSB)
|
|||
usbg_write_hex16(g->path, g->name, "bcdUSB", bcdUSB);
|
||||
}
|
||||
|
||||
void usbg_set_gadget_strs(struct gadget *g, int lang,
|
||||
struct gadget_strs *g_strs)
|
||||
{
|
||||
char path[USBG_MAX_PATH_LENGTH];
|
||||
|
||||
sprintf(path, "%s/%s/%s/0x%x", g->path, g->name, STRINGS_DIR, lang);
|
||||
|
||||
mkdir(path, S_IRWXU|S_IRWXG|S_IRWXO);
|
||||
|
||||
/* strings in library are hardcoded to US English for now */
|
||||
if (lang == LANG_US_ENG)
|
||||
g->strs = *g_strs;
|
||||
|
||||
usbg_write_string(path, "", "serialnumber", g_strs->str_ser);
|
||||
usbg_write_string(path, "", "manufacturer", g_strs->str_mnf);
|
||||
usbg_write_string(path, "", "product", g_strs->str_prd);
|
||||
}
|
||||
|
||||
void usbg_set_gadget_serial_number(struct gadget *g, int lang, char *serno)
|
||||
{
|
||||
char path[USBG_MAX_PATH_LENGTH];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue