Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
F
fwatch
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
8
Issues
8
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
fwatch
Commits
63ddf6ed
Commit
63ddf6ed
authored
Aug 09, 2014
by
Theodor-Adrian Stana
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
usb: Now able to blink LEDs from USB
usbled host-side s/w controls blinking the LEDs EFM32 code in usbdcdc
parent
a3dd4e81
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
104 additions
and
169 deletions
+104
-169
descriptors.h
sw/usbdcdc/src/descriptors.h
+26
-97
main.c
sw/usbdcdc/src/main.c
+8
-7
usbconfig.h
sw/usbdcdc/src/usbconfig.h
+2
-3
Makefile
sw/usbled/Makefile
+2
-2
usbled.c
sw/usbled/usbled.c
+66
-60
No files found.
sw/usbdcdc/src/descriptors.h
View file @
63ddf6ed
/***************************************************************************//**
* @file descriptors.h
* @brief USB descriptors for
CDC Serial Port adapter
example project.
* @brief USB descriptors for
Vendor Unique Device
example project.
* @version 3.20.5
*******************************************************************************
* @section License
...
...
@@ -23,7 +23,7 @@ static const USB_DeviceDescriptor_TypeDef deviceDesc __attribute__ ((aligned(4))
.
bLength
=
USB_DEVICE_DESCSIZE
,
.
bDescriptorType
=
USB_DEVICE_DESCRIPTOR
,
.
bcdUSB
=
0x0200
,
.
bDeviceClass
=
USB_CLASS_CDC
,
.
bDeviceClass
=
0xFF
,
.
bDeviceSubClass
=
0
,
.
bDeviceProtocol
=
0
,
.
bMaxPacketSize0
=
USB_EP0_SIZE
,
...
...
@@ -32,116 +32,42 @@ static const USB_DeviceDescriptor_TypeDef deviceDesc __attribute__ ((aligned(4))
.
bcdDevice
=
0x0000
,
.
iManufacturer
=
1
,
.
iProduct
=
2
,
.
iSerialNumber
=
0
,
.
iSerialNumber
=
3
,
.
bNumConfigurations
=
1
};
#define CONFIG_DESCSIZE ( USB_CONFIG_DESCSIZE + \
(
USB_INTERFACE_DESCSIZE
*
2
)
+
\
(
USB_ENDPOINT_DESCSIZE
*
NUM_EP_USED
)
+
\
USB_CDC_HEADER_FND_DESCSIZE
+
\
USB_CDC_CALLMNG_FND_DESCSIZE
+
\
USB_CDC_ACM_FND_DESCSIZE
+
\
5
)
EFM32_ALIGN
(
4
)
static
const
uint8_t
configDesc
[]
__attribute__
((
aligned
(
4
)))
=
{
/*** Configuration descriptor ***/
USB_CONFIG_DESCSIZE
,
/* bLength */
USB_CONFIG_DESCRIPTOR
,
/* bDescriptorType */
CONFIG_DESCSIZE
,
/* wTotalLength (LSB) */
USB_CONFIG_DESCSIZE
>>
8
,
/* wTotalLength (MSB) */
2
,
/* bNumInterfaces */
USB_CONFIG_DESCSIZE
+
/* wTotalLength (LSB) */
USB_INTERFACE_DESCSIZE
+
(
USB_ENDPOINT_DESCSIZE
*
NUM_EP_USED
),
(
USB_CONFIG_DESCSIZE
+
/* wTotalLength (MSB) */
USB_INTERFACE_DESCSIZE
+
(
USB_ENDPOINT_DESCSIZE
*
NUM_EP_USED
))
>>
8
,
1
,
/* bNumInterfaces */
1
,
/* bConfigurationValue */
0
,
/* iConfiguration */
CONFIG_DESC_BM_RESERVED_D7
|
/* bmAttrib: Self powered */
CONFIG_DESC_BM_SELFPOWERED
,
CONFIG_DESC_MAXPOWER_mA
(
100
),
/* bMaxPower: 100 mA */
/***
Communication Class Interface descriptor (interface no. 0)
***/
/***
Interface descriptor
***/
USB_INTERFACE_DESCSIZE
,
/* bLength */
USB_INTERFACE_DESCRIPTOR
,
/* bDescriptorType */
0
,
/* bInterfaceNumber */
0
,
/* bAlternateSetting */
1
,
/* bNumEndpoints */
USB_CLASS_CDC
,
/* bInterfaceClass */
USB_CLASS_CDC_ACM
,
/* bInterfaceSubClass */
0
,
/* bInterfaceProtocol */
0
,
/* iInterface */
/*** CDC Header Functional descriptor ***/
USB_CDC_HEADER_FND_DESCSIZE
,
/* bFunctionLength */
USB_CS_INTERFACE_DESCRIPTOR
,
/* bDescriptorType */
USB_CLASS_CDC_HFN
,
/* bDescriptorSubtype */
0x20
,
/* bcdCDC spec.no LSB */
0x01
,
/* bcdCDC spec.no MSB */
/*** CDC Call Management Functional descriptor ***/
USB_CDC_CALLMNG_FND_DESCSIZE
,
/* bFunctionLength */
USB_CS_INTERFACE_DESCRIPTOR
,
/* bDescriptorType */
USB_CLASS_CDC_CMNGFN
,
/* bDescriptorSubtype */
0
,
/* bmCapabilities */
1
,
/* bDataInterface */
/*** CDC Abstract Control Management Functional descriptor ***/
USB_CDC_ACM_FND_DESCSIZE
,
/* bFunctionLength */
USB_CS_INTERFACE_DESCRIPTOR
,
/* bDescriptorType */
USB_CLASS_CDC_ACMFN
,
/* bDescriptorSubtype */
0x02
,
/* bmCapabilities */
/* The capabilities that this configuration supports: */
/* D7..D4: RESERVED (Reset to zero) */
/* D3: 1 - Device supports the notification Network_Connection. */
/* D2: 1 - Device supports the request Send_Break */
/* D1: 1 - Device supports the request combination of Set_Line_Coding, */
/* Set_Control_Line_State, Get_Line_Coding, and the */
/* notification Serial_State. */
/* D0: 1 - Device supports the request combination of Set_Comm_Feature, */
/* Clear_Comm_Feature, and Get_Comm_Feature. */
/*** CDC Union Functional descriptor ***/
5
,
/* bFunctionLength */
USB_CS_INTERFACE_DESCRIPTOR
,
/* bDescriptorType */
USB_CLASS_CDC_UNIONFN
,
/* bDescriptorSubtype */
0
,
/* bControlInterface, itf. no. 0 */
1
,
/* bSubordinateInterface0, itf. no. 1 */
/*** CDC Notification endpoint descriptor ***/
USB_ENDPOINT_DESCSIZE
,
/* bLength */
USB_ENDPOINT_DESCRIPTOR
,
/* bDescriptorType */
EP_NOTIFY
,
/* bEndpointAddress (IN) */
USB_EPTYPE_INTR
,
/* bmAttributes */
BULK_EP_SIZE
,
/* wMaxPacketSize (LSB) */
0
,
/* wMaxPacketSize (MSB) */
0xFF
,
/* bInterval */
/*** Data Class Interface descriptor (interface no. 1) ***/
USB_INTERFACE_DESCSIZE
,
/* bLength */
USB_INTERFACE_DESCRIPTOR
,
/* bDescriptorType */
1
,
/* bInterfaceNumber */
0
,
/* bAlternateSetting */
2
,
/* bNumEndpoints */
USB_CLASS_CDC_DATA
,
/* bInterfaceClass */
NUM_EP_USED
,
/* bNumEndpoints */
0xFF
,
/* bInterfaceClass */
0
,
/* bInterfaceSubClass */
0
,
/* bInterfaceProtocol */
0
,
/* iInterface */
/*** CDC Data interface endpoint descriptors ***/
USB_ENDPOINT_DESCSIZE
,
/* bLength */
USB_ENDPOINT_DESCRIPTOR
,
/* bDescriptorType */
EP_DATA_IN
,
/* bEndpointAddress (IN) */
USB_EPTYPE_BULK
,
/* bmAttributes */
BULK_EP_SIZE
,
/* wMaxPacketSize (LSB) */
0
,
/* wMaxPacketSize (MSB) */
0
,
/* bInterval */
USB_ENDPOINT_DESCSIZE
,
/* bLength */
USB_ENDPOINT_DESCRIPTOR
,
/* bDescriptorType */
EP_DATA_OUT
,
/* bEndpointAddress (OUT)*/
USB_EPTYPE_BULK
,
/* bmAttributes */
BULK_EP_SIZE
,
/* wMaxPacketSize (LSB) */
0
,
/* wMaxPacketSize (MSB) */
0
/* bInterval */
};
STATIC_CONST_STRING_DESC_LANGID
(
langID
,
0x04
,
0x09
);
...
...
@@ -149,26 +75,29 @@ STATIC_CONST_STRING_DESC( iManufacturer, 'S','i','l','i','c','o','n',' ','L', \
'a'
,
'b'
,
'o'
,
'r'
,
'a'
,
't'
,
'o'
,
'r'
,
'i'
,
\
'e'
,
's'
,
' '
,
'I'
,
'n'
,
'c'
,
'.'
);
STATIC_CONST_STRING_DESC
(
iProduct
,
'E'
,
'F'
,
'M'
,
'3'
,
'2'
,
' '
,
'U'
,
'S'
,
'B'
,
\
' '
,
'C'
,
'D'
,
'C'
,
' '
,
's'
,
'e'
,
'r'
,
'i'
,
\
'a'
,
'l'
,
' '
,
'p'
,
'o'
,
'r'
,
't'
,
' '
,
'd'
,
\
'e'
,
'v'
,
'i'
,
'c'
,
'e'
);
' '
,
'V'
,
'e'
,
'n'
,
'd'
,
'o'
,
'r'
,
' '
,
\
'U'
,
'n'
,
'i'
,
'q'
,
'u'
,
'e'
,
' '
,
\
'L'
,
'E'
,
'D'
,
' '
,
\
'D'
,
'e'
,
'v'
,
'i'
,
'c'
,
'e'
);
STATIC_CONST_STRING_DESC
(
iSerialNumber
,
'0'
,
'0'
,
'0'
,
'0'
,
'0'
,
'0'
,
\
'0'
,
'0'
,
'1'
,
'2'
,
'3'
,
'4'
);
static
const
void
*
const
strings
[]
=
{
&
langID
,
&
iManufacturer
,
&
iProduct
,
&
iSerialNumber
};
/* Endpoint buffer sizes */
/* 1 = single buffer, 2 = double buffering, 3 = triple buffering ... */
/* Use double buffering on the BULK endpoints. */
static
const
uint8_t
bufferingMultiplier
[
NUM_EP_USED
+
1
]
=
{
1
,
1
,
2
,
2
};
/* 1 = single buffer, 2 = double buffering, 3 = tripple buffering ... */
static
const
uint8_t
bufferingMultiplier
[
NUM_EP_USED
+
1
]
=
{
1
};
static
const
USBD_Callbacks_TypeDef
callbacks
=
{
.
usbReset
=
NULL
,
.
usbStateChange
=
NULL
,
//StateChange,
.
usbStateChange
=
NULL
,
.
setupCmd
=
SetupCmd
,
.
isSelfPowered
=
NULL
,
.
sofInt
=
NULL
...
...
sw/usbdcdc/src/main.c
View file @
63ddf6ed
...
...
@@ -488,16 +488,17 @@ static void StateChange(USBD_State_TypeDef oldState,
*****************************************************************************/
static
int
SetupCmd
(
const
USB_Setup_TypeDef
*
setup
)
{
int
r
etVal
=
USB_STATUS_REQ_UNHANDLED
;
int
r
=
USB_STATUS_REQ_UNHANDLED
;
if
(
(
setup
->
Type
==
USB_SETUP_TYPE_CLASS
)
&&
(
setup
->
Recipient
==
USB_SETUP_RECIPIENT_INTERFA
CE
))
if
(
setup
->
Type
==
USB_SETUP_TYPE_VENDOR
)
//
&&
//(setup->Recipient == USB_SETUP_RECIPIENT_DEVI
CE))
{
switch
(
setup
->
bRequest
)
{
case
LED_SET
:
setup
->
wValue
?
GPIO_PinOutSet
(
gpioPortE
,
setup
->
wIndex
)
:
GPIO_PinOutClear
(
gpioPortE
,
setup
->
wIndex
);
r
=
USB_STATUS_OK
;
break
;
// case USB_CDC_GETLINECODING:
// /********************/
...
...
@@ -508,7 +509,7 @@ static int SetupCmd(const USB_Setup_TypeDef *setup)
// {
// /* Send current settings to USB host. */
// USBD_Write(0, (void*) &cdcLineCoding, 7, NULL);
// r
etVal
= USB_STATUS_OK;
// r = USB_STATUS_OK;
// }
// break;
//
...
...
@@ -521,7 +522,7 @@ static int SetupCmd(const USB_Setup_TypeDef *setup)
// {
// /* Get new settings from USB host. */
// USBD_Read(0, (void*) &cdcLineCoding, 7, LineCodingReceived);
// r
etVal
= USB_STATUS_OK;
// r = USB_STATUS_OK;
// }
// break;
//
...
...
@@ -531,13 +532,13 @@ static int SetupCmd(const USB_Setup_TypeDef *setup)
// (setup->wLength == 0)) /* No data */
// {
// /* Do nothing ( Non compliant behaviour !! ) */
// r
etVal
= USB_STATUS_OK;
// r = USB_STATUS_OK;
// }
// break;
}
}
return
r
etVal
;
return
r
;
}
/**************************************************************************//**
...
...
sw/usbdcdc/src/usbconfig.h
View file @
63ddf6ed
...
...
@@ -27,14 +27,13 @@ extern "C" {
** Specify number of endpoints used (in addition to EP0). **
** **
*****************************************************************************/
#define NUM_EP_USED
3
#define NUM_EP_USED
0
/****************************************************************************
** **
**
Specify number of application timers you need.
**
**
Configure serial port debug output.
**
** **
*****************************************************************************/
#define NUM_APP_TIMERS 1
#ifdef __cplusplus
}
...
...
sw/usbled/Makefile
View file @
63ddf6ed
CC
=
gcc
CFLAGS
=
-Wall
INCLUDE
=
INCLUDE
=
-I
/usr/include/libusb-1.0
SOURCES
=
usbled.c
LIB
=
LDFLAGS
=
-lusb
LDFLAGS
=
-lusb
-1
.0
all
:
$(CC)
-o
usbled
$(CFLAGS)
$(INCLUDE)
$(SOURCES)
$(LIB)
$(LDFLAGS)
...
...
sw/usbled/usbled.c
View file @
63ddf6ed
#include <stdio.h>
#include <usb.h>
#include <unistd.h>
#include <libusb.h>
#define LED_SET 0x11
int
main
()
{
static
usb_dev_handle
*
pDevH
=
NULL
;
// USB device handle
static
struct
usb_device
*
pDev
;
static
struct
usb_bus
*
pBus
;
int
i
=
0
;
int
led
=
12
;
int
vals
[
4
]
=
{
0
,
1
,
1
,
0
};
int
val
;
int
led
=
12
;
int
val
=
0
;
libusb_device
**
devs
,
*
dev
;
libusb_device_handle
*
devh
=
NULL
;
usb_init
(
);
libusb_init
(
NULL
);
usb_find_busses
();
usb_find_devices
();
libusb_get_device_list
(
NULL
,
&
devs
);
// Enumerate USB devices ...
for
(
pBus
=
usb_get_busses
();
pBus
;
pBus
=
pBus
->
next
)
{
for
(
pDev
=
pBus
->
devices
;
pDev
;
pDev
=
pDev
->
next
)
{
if
(
(
pDev
->
descriptor
.
idVendor
==
0x10C4
)
&&
(
pDev
->
descriptor
.
idProduct
==
0x00ff
)
)
{
pDevH
=
usb_open
(
pDev
);
if
(
pDevH
)
{
if
(
usb_set_configuration
(
pDevH
,
pDev
->
config
->
bConfigurationValue
)
!=
0
)
{
usb_close
(
pDevH
);
pDevH
=
NULL
;
printf
(
"FAIL: usb_set_configuration"
);
}
if
(
pDev
->
descriptor
.
idProduct
==
0x00ff
)
{
if
(
usb_claim_interface
(
pDevH
,
0
)
!=
0
)
{
usb_close
(
pDevH
);
pDevH
=
NULL
;
printf
(
"FAIL: usb_claim_interface"
);
}
}
while
((
dev
=
devs
[
i
++
])
!=
NULL
)
{
struct
libusb_device_descriptor
desc
;
int
r
=
libusb_get_device_descriptor
(
dev
,
&
desc
);
if
(
r
<
0
)
{
fprintf
(
stderr
,
"failed to get device descriptor"
);
break
;
}
if
((
desc
.
idVendor
==
0x10c4
)
&&
(
desc
.
idProduct
==
0x00ff
))
{
r
=
libusb_open
(
dev
,
&
devh
);
if
(
r
<
0
)
{
fprintf
(
stderr
,
"failed to open device: %d
\n
"
,
r
);
goto
cleanup
;
}
printf
(
"device open
\n
"
);
r
=
libusb_claim_interface
(
devh
,
0
);
if
(
r
<
0
)
{
fprintf
(
stderr
,
"failed to claim interface: %d
\n
"
,
r
);
goto
cleanup
;
}
printf
(
"interface claimed
\n
"
);
break
;
}
}
}
}
}
while
(
1
)
{
if
(
devh
!=
NULL
)
{
for
(
i
=
0
;
i
<
10
;
i
++
)
{
if
(
led
==
11
)
led
=
12
;
else
led
=
11
;
val
=
vals
[
i
%
4
];
if
(
led
==
11
)
led
=
12
;
if
(
led
==
12
)
led
=
11
;
val
^=
1
;
printf
(
"%d:%d:%d
\n
"
,
i
,
led
,
val
);
libusb_control_transfer
(
devh
,
// Device handle
LIBUSB_ENDPOINT_OUT
|
LIBUSB_REQUEST_TYPE_VENDOR
|
LIBUSB_RECIPIENT_DEVICE
,
// bmRequestType
LED_SET
,
// bRequest
val
,
// wValue
led
,
// wIndex
NULL
,
// char *data
0
,
// wLength
1000
);
// timeout (ms)
sleep
(
1
);
}
}
if
(
pDevH
)
{
printf
(
"led%d
\n
"
,
led
);
usb_control_msg
(
pDevH
,
// Device handle
USB_ENDPOINT_IN
|
USB_TYPE_VENDOR
|
USB_RECIP_DEVICE
,
// bmRequestType
LED_SET
,
// bRequest
val
,
// wValue
led
,
// wIndex
NULL
,
// char *pBuffer
1
,
// wLength
1000
);
// Timeout (ms)
sleep
(
1
);
}
cleanup:
printf
(
"cleanup
\n
"
);
if
(
devh
!=
NULL
)
{
printf
(
"release
\n
"
);
libusb_release_interface
(
devh
,
0
);
libusb_close
(
devh
);
}
printf
(
"free
\n
"
);
libusb_free_device_list
(
devs
,
1
);
printf
(
"exit
\n
"
);
libusb_exit
(
NULL
);
printf
(
"done
\n
"
);
}
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment