Re: [PATCH v3 00/15] Add import from/export to file functionality

2014-09-23 Thread Matt Porter
On Mon, Aug 25, 2014 at 10:54:51AM +0200, Krzysztof Opasiak wrote:
 Dear Matt,
 
 This quite big series adds new part of libusbg API which allows to
 import/export gadget/function/configuration from/to file.
 
 Motivation:
 
 Libusbg allows to create a binary file which set up custom
 gadget. This is useful but if we have to create custom binary for
 each gadget we wast a lot of work which kernel people put to separate
 code from configuration. This leads us to main idea of gadget
 schemes. Allow to create simple, human readable config file which
 library will be able to translate into usb gadget.
 
 Description:
 
 Gadget schemes is idea of describing gadget/function/configuration in
 config file. To not reinvent the wheel I have used existing library
 libconfig [1]. This means that the syntax is similar to this described
 in documentation of libconfig.

Thank goodness. Apparently you read my mind and avoided use of xml and
json here. I've used libconfig before and really like the human
readable/creatable syntax.

 
 I have extended the library with set of usbg_export_*() functions
 which allows to export selected gadget to given FILE. There is also
 set of complementary usbg_import_*() functions which allows to read
 scheme of gadget/function/config from file and create it using
 configfs.
 
 To avoid name conflict I have used the convention that
 usbg_import_gadget() function takes name of new gadget as parameter
 and usbg_export_gadget() doesn't export gadget name to scheme
 file. Similar idea is used in configuration and functions.
 
 Base convention of gadget schemes is simple: if something is not set
 in scheme file, default values provided by kernel are used. Moreover
 configfs has some attributes which are read only. To allow to store
 them in scheme file they are ignored by import functions.
 
 Usage of libconfig and whole design of gadget schemes allows us to use
 include directive in gadget definition to import complicated
 configurations or functions.
 
 Syntax and detailed rules of using schemes has been described in
 gadget_schemes.txt in commit:
 
snip

 Summary:
 
 I have created a pull request also for this series:
 
 https://github.com/libusbg/libusbg/pull/8

Applied this to master, thanks.

 
 Feel free to provide your comments about the whole idea and also about
 its implementation.

It all looks good, my major concern when you had first mentioned this
was about was schema/format would be used. APIs look great, and I've
tested this with my own WIP application and it works quite nicely.
Thanks for adding this feature.

-Matt
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 00/15] Add import from/export to file functionality

2014-08-25 Thread Krzysztof Opasiak
Dear Matt,

This quite big series adds new part of libusbg API which allows to
import/export gadget/function/configuration from/to file.

Motivation:

Libusbg allows to create a binary file which set up custom
gadget. This is useful but if we have to create custom binary for
each gadget we wast a lot of work which kernel people put to separate
code from configuration. This leads us to main idea of gadget
schemes. Allow to create simple, human readable config file which
library will be able to translate into usb gadget.

Description:

Gadget schemes is idea of describing gadget/function/configuration in
config file. To not reinvent the wheel I have used existing library
libconfig [1]. This means that the syntax is similar to this described
in documentation of libconfig.

I have extended the library with set of usbg_export_*() functions
which allows to export selected gadget to given FILE. There is also
set of complementary usbg_import_*() functions which allows to read
scheme of gadget/function/config from file and create it using
configfs.

To avoid name conflict I have used the convention that
usbg_import_gadget() function takes name of new gadget as parameter
and usbg_export_gadget() doesn't export gadget name to scheme
file. Similar idea is used in configuration and functions.

Base convention of gadget schemes is simple: if something is not set
in scheme file, default values provided by kernel are used. Moreover
configfs has some attributes which are read only. To allow to store
them in scheme file they are ignored by import functions.

Usage of libconfig and whole design of gadget schemes allows us to use
include directive in gadget definition to import complicated
configurations or functions.

Syntax and detailed rules of using schemes has been described in
gadget_schemes.txt in commit:

 libusbg: doc: Add document about gadget schemes

Example:

I have used the gadget-acm-ecm example to create a gadget and then
exported it and imported.  Gadget exported using usbg_export_gadget():

$ gadget-export g1 g1.schema
$ cat g1.schema

attrs =
{
bcdUSB = 0x200
bDeviceClass = 0x0
bDeviceSubClass = 0x0
bDeviceProtocol = 0x0
bMaxPacketSize0 = 0x40
idVendor = 0x1D6B
idProduct = 0x104
bcdDevice = 0x1
}
strings = (
{
lang = 0x409
manufacturer = Foo Inc.
product = Bar Gadget
serialnumber = 0123456789
} )
functions =
{
acm_usb0 =
{
instance = usb0
type = acm
attrs =
{
port_num = 0
}
}
acm_usb1 =
{
instance = usb1
type = acm
attrs =
{
port_num = 1
}
}
ecm_usb0 =
{
instance = usb0
type = ecm
attrs =
{
dev_addr = aa:bb:f9:ca:76:fb
host_addr = a2:ad:a2:3f:c8:6f
qmult = 5
}
}
}
configs = (
{
id = 1
name = The only one
attrs =
{
bmAttributes = 0x80
bMaxPower = 0x2
}
strings = (
{
lang = 0x409
configuration = CDC 2xACM+ECM
} )
functions = (
{
name = acm.GS0
function = acm_usb0
},
{
name = acm.GS1
function = acm_usb1
},
{
name = ecm.usb0
function = ecm_usb0
} )
} )

This is quite verbose because it contains read only attributes and
some default ones. This file can be shorten to:

attrs =
{
bcdUSB = 0x200
bMaxPacketSize0 = 0x40
idVendor = 0x1D6B
idProduct = 0x104
bcdDevice = 0x1
}
strings = (
{
lang = 0x409
manufacturer = Foo Inc.
product = Bar Gadget
serialnumber = 0123456789
} )
functions =
{
acm_usb0 =
{
instance = usb0
type = acm
}
acm_usb1 =
{
instance = usb1
type = acm
}
ecm_usb0 =
{
instance = usb0
type = ecm
attrs =
{
dev_addr = aa:bb:f9:ca:76:fb
host_addr = a2:ad:a2:3f:c8:6f
qmult = 5
}
}
}
configs = (
{
id = 1
name = The only one
strings = (
{
lang = 0x409
configuration = CDC 2xACM+ECM
} )
functions = (
{
name = acm.GS0
function = acm_usb0
},
{
name = acm.GS1
function = acm_usb1
},
{
name = ecm.usb0
function = ecm_usb0
} )
} )

Remarks:

Current version of libconfig has no possibility to select output
format details. I have created a patch and set up github pull request
and this patch is waiting for maintainer review[2], so results of
usbg_export_*() may be slightly