mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-11-09 20:45:41 +08:00
class driver can custom string description
This commit is contained in:
1 parent
b91271d490
commit
34d531578e
5 files changed
+130
-88
No files matched your search
@@ -166,7 +166,7 @@ struct udev_msg
|
||||
};
|
||||
typedef struct udev_msg* udev_msg_t;
|
||||
|
||||
udevice_t rt_usbd_device_create(const char** str);
|
||||
udevice_t rt_usbd_device_create(void);
|
||||
uconfig_t rt_usbd_config_create(void);
|
||||
uclass_t rt_usbd_class_create(udevice_t device, udev_desc_t dev_desc,
|
||||
uclass_ops_t ops);
|
||||
@@ -180,6 +180,7 @@ rt_err_t rt_usbd_post_event(struct udev_msg* msg, rt_size_t size);
|
||||
rt_err_t rt_usbd_free_device(udevice_t device);
|
||||
rt_err_t rt_usbd_device_set_controller(udevice_t device, udcd_t dcd);
|
||||
rt_err_t rt_usbd_device_set_descriptor(udevice_t device, udev_desc_t dev_desc);
|
||||
rt_err_t rt_usbd_device_set_string(udevice_t device, const char** ustring);
|
||||
rt_err_t rt_usbd_device_add_config(udevice_t device, uconfig_t cfg);
|
||||
rt_err_t rt_usbd_config_add_class(uconfig_t cfg, uclass_t cls);
|
||||
rt_err_t rt_usbd_class_add_interface(uclass_t cls, uintf_t intf);
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -24,7 +24,7 @@
|
||||
#define STATUS_CBW 0x00
|
||||
#define STATUS_CSW 0x01
|
||||
#define STATUS_RECEIVE 0x02
|
||||
#define STATUS_SEND 0x03
|
||||
#define STATUS_SEND 0x03
|
||||
|
||||
static int status = STATUS_CBW;
|
||||
ALIGN(RT_ALIGN_SIZE)
|
||||
@@ -79,6 +79,16 @@ const static struct umass_descriptor _mass_desc =
|
||||
0x00, //bInterval;
|
||||
};
|
||||
|
||||
const static char* _ustring[] =
|
||||
{
|
||||
"Language",
|
||||
"RT-Thread Team.",
|
||||
"RTT Mass Storage",
|
||||
"1.1.0",
|
||||
"Configuration",
|
||||
"Interface",
|
||||
};
|
||||
|
||||
/**
|
||||
* This function will allocate an usb device instance from system.
|
||||
*
|
||||
@@ -301,7 +311,7 @@ static rt_err_t _ep_in_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
||||
{
|
||||
mass_eps_t eps;
|
||||
RT_ASSERT(device != RT_NULL);
|
||||
|
||||
|
||||
eps = cls->eps;
|
||||
if(status == STATUS_CSW)
|
||||
{
|
||||
@@ -312,7 +322,7 @@ static rt_err_t _ep_in_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
||||
if(status == STATUS_SEND)
|
||||
{
|
||||
rt_device_read(disk, _block, eps->ep_in->buffer, 1);
|
||||
dcd_ep_write(device->dcd, eps->ep_in, eps->ep_in->buffer,
|
||||
dcd_ep_write(device->dcd, eps->ep_in, eps->ep_in->buffer,
|
||||
geometry.bytes_per_sector);
|
||||
_count --;
|
||||
if (_count)
|
||||
@@ -356,7 +366,7 @@ static rt_err_t _ep_out_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
||||
{
|
||||
mass_eps_t eps;
|
||||
RT_ASSERT(device != RT_NULL);
|
||||
|
||||
|
||||
eps = (mass_eps_t)cls->eps;
|
||||
if(status == STATUS_CBW)
|
||||
{
|
||||
@@ -372,7 +382,7 @@ static rt_err_t _ep_out_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
||||
csw.data_reside = 0;
|
||||
csw.status = 0;
|
||||
}
|
||||
else
|
||||
else
|
||||
return -RT_ERROR;
|
||||
|
||||
switch(cbw->cb[0])
|
||||
@@ -424,18 +434,18 @@ static rt_err_t _ep_out_handler(udevice_t device, uclass_t cls, rt_size_t size)
|
||||
|
||||
_size -= size;
|
||||
csw.data_reside -= size;
|
||||
|
||||
|
||||
rt_device_write(disk, _block, eps->ep_in->buffer, 1);
|
||||
_block ++;
|
||||
if(_size == 0)
|
||||
{
|
||||
{
|
||||
dcd_ep_write(device->dcd, eps->ep_in, (rt_uint8_t*)&csw, SIZEOF_CSW);
|
||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer, SIZEOF_CBW);
|
||||
status = STATUS_CBW;
|
||||
}
|
||||
else
|
||||
{
|
||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer,
|
||||
dcd_ep_read(device->dcd, eps->ep_out, eps->ep_out->buffer,
|
||||
geometry.bytes_per_sector);
|
||||
}
|
||||
}
|
||||
@@ -501,7 +511,7 @@ static rt_err_t _class_run(udevice_t device, uclass_t cls)
|
||||
{
|
||||
rt_kprintf("no disk named %s\n", RT_USB_MSTORAGE_DISK_NAME);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
}
|
||||
if(rt_device_control(disk, RT_DEVICE_CTRL_BLK_GETGEOME, (void*)&geometry) != RT_EOK)
|
||||
return -RT_ERROR;
|
||||
|
||||
@@ -562,24 +572,26 @@ uclass_t rt_usbd_class_mstorage_create(udevice_t device)
|
||||
/* parameter check */
|
||||
RT_ASSERT(device != RT_NULL);
|
||||
|
||||
/* set usb device string description */
|
||||
rt_usbd_device_set_string(device, _ustring);
|
||||
/* create a mass storage class */
|
||||
mstorage = rt_usbd_class_create(device, &dev_desc, &ops);
|
||||
/* create a mass storage endpoints collection */
|
||||
eps = (mass_eps_t)rt_malloc(sizeof(struct mass_eps));
|
||||
mstorage->eps = (void*)eps;
|
||||
|
||||
|
||||
/* create an interface */
|
||||
intf = rt_usbd_interface_create(device, _interface_handler);
|
||||
|
||||
/* create an alternate setting */
|
||||
setting = rt_usbd_altsetting_create(sizeof(struct umass_descriptor));
|
||||
/* config desc in alternate setting */
|
||||
/* config desc in alternate setting */
|
||||
rt_usbd_altsetting_config_descriptor(setting, &_mass_desc, 0);
|
||||
|
||||
|
||||
/* create a bulk out and a bulk in endpoint */
|
||||
mass_desc = (umass_desc_t)setting->desc;
|
||||
eps->ep_in = rt_usbd_endpoint_create(&mass_desc->ep_in_desc, _ep_in_handler);
|
||||
eps->ep_out = rt_usbd_endpoint_create(&mass_desc->ep_out_desc, _ep_out_handler);
|
||||
eps->ep_out = rt_usbd_endpoint_create(&mass_desc->ep_out_desc, _ep_out_handler);
|
||||
|
||||
/* add the bulk out and bulk in endpoint to the alternate setting */
|
||||
rt_usbd_altsetting_add_endpoint(setting, eps->ep_out);
|
||||
|
||||
@@ -612,13 +612,10 @@ rt_err_t _sof_notify(udevice_t device)
|
||||
*
|
||||
* @return an usb device object on success, RT_NULL on fail.
|
||||
*/
|
||||
udevice_t rt_usbd_device_create(const char** ustring)
|
||||
udevice_t rt_usbd_device_create(void)
|
||||
{
|
||||
udevice_t udevice;
|
||||
|
||||
/* parameter check */
|
||||
RT_ASSERT(ustring != RT_NULL);
|
||||
|
||||
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_usbd_device_create\n"));
|
||||
|
||||
/* allocate memory for the object */
|
||||
@@ -630,9 +627,6 @@ udevice_t rt_usbd_device_create(const char** ustring)
|
||||
}
|
||||
rt_memset(udevice, 0, sizeof(struct udevice));
|
||||
|
||||
/* set string descriptor array to the device object */
|
||||
udevice->str = ustring;
|
||||
|
||||
/* to initialize configuration list */
|
||||
rt_list_init(&udevice->cfg_list);
|
||||
|
||||
@@ -642,6 +636,26 @@ udevice_t rt_usbd_device_create(const char** ustring)
|
||||
return udevice;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will set usb device string description.
|
||||
*
|
||||
* @param device the usb device object.
|
||||
* @param ustring pointer to string pointer array.
|
||||
*
|
||||
* @return RT_EOK.
|
||||
*/
|
||||
rt_err_t rt_usbd_device_set_string(udevice_t device, const char** ustring)
|
||||
{
|
||||
/* parameter check */
|
||||
RT_ASSERT(device != RT_NULL);
|
||||
RT_ASSERT(ustring != RT_NULL);
|
||||
|
||||
/* set string descriptor array to the device object */
|
||||
device->str = ustring;
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will set an usb controller driver to a device.
|
||||
*
|
||||
|
||||
@@ -18,15 +18,17 @@
|
||||
|
||||
#ifdef RT_USING_USB_DEVICE
|
||||
|
||||
const static char* ustring[] =
|
||||
#ifdef RT_USB_DEVICE_COMPOSITE
|
||||
const static char* ustring[] =
|
||||
{
|
||||
"Language",
|
||||
"RT-Thread Team.",
|
||||
"RT-Thread Device",
|
||||
"RTT Composite Device",
|
||||
"1.1.0",
|
||||
"Configuration",
|
||||
"Interface",
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef RT_USB_DEVICE_COMPOSITE
|
||||
static struct udevice_descriptor compsit_desc =
|
||||
@@ -44,7 +46,7 @@ static struct udevice_descriptor compsit_desc =
|
||||
USB_STRING_MANU_INDEX, //iManufacturer;
|
||||
USB_STRING_PRODUCT_INDEX, //iProduct;
|
||||
USB_STRING_SERIAL_INDEX, //iSerialNumber;
|
||||
USB_DYNAMIC, //bNumConfigurations;
|
||||
USB_DYNAMIC, //bNumConfigurations;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -53,7 +55,7 @@ rt_err_t rt_usb_device_init(const char* udc_name)
|
||||
rt_device_t udc;
|
||||
udevice_t udevice;
|
||||
uconfig_t cfg;
|
||||
uclass_t cls;
|
||||
uclass_t cls;
|
||||
|
||||
RT_ASSERT(udc_name != RT_NULL);
|
||||
|
||||
@@ -68,8 +70,8 @@ rt_err_t rt_usb_device_init(const char* udc_name)
|
||||
rt_usbd_core_init();
|
||||
|
||||
/* create a device object */
|
||||
udevice = rt_usbd_device_create(ustring);
|
||||
|
||||
udevice = rt_usbd_device_create();
|
||||
|
||||
/* set usb controller driver to the device */
|
||||
rt_usbd_device_set_controller(udevice, (udcd_t)udc);
|
||||
|
||||
@@ -78,7 +80,7 @@ rt_err_t rt_usb_device_init(const char* udc_name)
|
||||
|
||||
#ifdef RT_USB_DEVICE_MSTORAGE
|
||||
/* create a mass storage class object */
|
||||
cls = rt_usbd_class_mstorage_create(udevice);
|
||||
cls = rt_usbd_class_mstorage_create(udevice);
|
||||
|
||||
/* add the class to the configuration */
|
||||
rt_usbd_config_add_class(cfg, cls);
|
||||
@@ -101,13 +103,14 @@ rt_err_t rt_usb_device_init(const char* udc_name)
|
||||
/* set device descriptor to the device */
|
||||
#ifdef RT_USB_DEVICE_COMPOSITE
|
||||
rt_usbd_device_set_descriptor(udevice, &compsit_desc);
|
||||
rt_usbd_device_set_string(udevice, ustring);
|
||||
#else
|
||||
rt_usbd_device_set_descriptor(udevice, cls->dev_desc);
|
||||
#endif
|
||||
|
||||
/* add the configuration to the device */
|
||||
rt_usbd_device_add_config(udevice, cfg);
|
||||
|
||||
|
||||
/* set default configuration to 1 */
|
||||
rt_usbd_set_config(udevice, 1);
|
||||
|
||||
|
||||
Reference in new issue
Block a user