works now
This commit is contained in:
@@ -77,7 +77,7 @@ _write (const char *s, int size)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
chMtxLock (&stdout.m);
|
chMtxLock (&stdout.m);
|
||||||
if (stdout.str)
|
while (stdout.str)
|
||||||
chCondWait (&stdout.finish_cnd);
|
chCondWait (&stdout.finish_cnd);
|
||||||
stdout.str = s;
|
stdout.str = s;
|
||||||
stdout.size = size;
|
stdout.size = size;
|
||||||
@@ -152,7 +152,7 @@ static msg_t Thread2 (void *arg)
|
|||||||
|
|
||||||
stdout.str = NULL;
|
stdout.str = NULL;
|
||||||
stdout.size = 0;
|
stdout.size = 0;
|
||||||
chCondSignal (&stdout.finish_cnd);
|
chCondBroadcast (&stdout.finish_cnd);
|
||||||
chMtxUnlock ();
|
chMtxUnlock ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ static msg_t Thread2 (void *arg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static WORKING_AREA(waUSBThread, 128);
|
static WORKING_AREA(waUSBThread, 128*2);
|
||||||
extern msg_t USBThread (void *arg);
|
extern msg_t USBThread (void *arg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
116
src/usb.c
116
src/usb.c
@@ -30,6 +30,8 @@
|
|||||||
#include "hw_config.h"
|
#include "hw_config.h"
|
||||||
#include "usb_istr.h"
|
#include "usb_istr.h"
|
||||||
|
|
||||||
|
Mutex icc_in_mutex;
|
||||||
|
|
||||||
static uint8_t icc_buffer_out[64];
|
static uint8_t icc_buffer_out[64];
|
||||||
static uint8_t icc_buffer_in[64];
|
static uint8_t icc_buffer_in[64];
|
||||||
|
|
||||||
@@ -39,6 +41,7 @@ static uint32_t icc_count_in = 0;
|
|||||||
void
|
void
|
||||||
EP4_IN_Callback(void)
|
EP4_IN_Callback(void)
|
||||||
{
|
{
|
||||||
|
icc_count_in = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -46,20 +49,25 @@ EP5_OUT_Callback(void)
|
|||||||
{
|
{
|
||||||
/* Get the received data buffer and update the counter */
|
/* Get the received data buffer and update the counter */
|
||||||
icc_count_out = USB_SIL_Read (EP5_OUT, icc_buffer_out);
|
icc_count_out = USB_SIL_Read (EP5_OUT, icc_buffer_out);
|
||||||
|
|
||||||
/* Enable the receive of data on EP5 */
|
|
||||||
SetEPRxValid (ENDP5);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define ICC_POWER_ON 0x62
|
#define ICC_POWER_ON 0x62
|
||||||
|
#define ICC_POWER_OFF 0x63
|
||||||
|
#define ICC_SLOT_STATUS 0x65
|
||||||
|
#define XFR_BLOCK 0x6F
|
||||||
|
|
||||||
|
#define ICC_MSG_SEQ_OFFSET 6
|
||||||
|
#define ICC_MSG_STATUS_OFFSET 7
|
||||||
|
#define ICC_MSG_ERROR_OFFSET 8
|
||||||
|
|
||||||
|
#if 0
|
||||||
0 bMessageType 0x62
|
0 bMessageType 0x62
|
||||||
1 dwLength 0x00000000
|
1 dwLength 0x00000000
|
||||||
5 bSlot 0x00 FIXED
|
5 bSlot 0x00 FIXED
|
||||||
6 bSeq 0x00-FF
|
6 bSeq 0x00-FF
|
||||||
7 bReserved 0x01 FIXED
|
7 bReserved 0x01 FIXED
|
||||||
8 abRFU 0x0000
|
8 abRFU 0x0000
|
||||||
|
-->
|
||||||
0 bMessageType 0x80 Indicates RDR_to_PC_DataBlock
|
0 bMessageType 0x80 Indicates RDR_to_PC_DataBlock
|
||||||
1 dwLength Size of bytes for the ATR
|
1 dwLength Size of bytes for the ATR
|
||||||
5 bSlot 0x00 FIXED
|
5 bSlot 0x00 FIXED
|
||||||
@@ -70,14 +78,12 @@ EP5_OUT_Callback(void)
|
|||||||
10 abData ATR
|
10 abData ATR
|
||||||
|
|
||||||
|
|
||||||
|
0 bMessageType 0x63
|
||||||
#define ICC_POWER_OFF 0x63
|
|
||||||
0 bMessageType 0x63 Indicates PC_to_RDR_IccPowerOn
|
|
||||||
1 dwLength 0x00000000 Message-specific data length
|
1 dwLength 0x00000000 Message-specific data length
|
||||||
5 bSlot 0x00 FIXED
|
5 bSlot 0x00 FIXED
|
||||||
6 bSeq 0x00-FF Sequence number for command.
|
6 bSeq 0x00-FF Sequence number for command.
|
||||||
7 abRFU 0x000000
|
7 abRFU 0x000000
|
||||||
|
-->
|
||||||
0 bMessageType 81h Indicates RDR_to_PC_SlotStatus
|
0 bMessageType 81h Indicates RDR_to_PC_SlotStatus
|
||||||
1 dwLength 0x00000000 Message-specific data length
|
1 dwLength 0x00000000 Message-specific data length
|
||||||
5 bSlot 0x00 FIXED
|
5 bSlot 0x00 FIXED
|
||||||
@@ -87,7 +93,6 @@ EP5_OUT_Callback(void)
|
|||||||
9 bReserved 0x00 FIXED
|
9 bReserved 0x00 FIXED
|
||||||
|
|
||||||
|
|
||||||
#define XFR_BLOCK 0x6F
|
|
||||||
0 bMessageType 0x6F Indicates PC_to_RDR_XfrBlock
|
0 bMessageType 0x6F Indicates PC_to_RDR_XfrBlock
|
||||||
1 dwLength Size of abData field of this message
|
1 dwLength Size of abData field of this message
|
||||||
5 bSlot 0x00 FIXED
|
5 bSlot 0x00 FIXED
|
||||||
@@ -114,8 +119,7 @@ EP5_OUT_Callback(void)
|
|||||||
is expected in the next RDR_to_PC_DataBlock.
|
is expected in the next RDR_to_PC_DataBlock.
|
||||||
|
|
||||||
10 abData Data block sent to the USB-ICC
|
10 abData Data block sent to the USB-ICC
|
||||||
|
-->
|
||||||
|
|
||||||
0 bMessageType 0x80 Indicates RDR_to_PC_DataBlock
|
0 bMessageType 0x80 Indicates RDR_to_PC_DataBlock
|
||||||
1 dwLength Size of abData field of this message
|
1 dwLength Size of abData field of this message
|
||||||
5 bSlot 0x00 FIXED
|
5 bSlot 0x00 FIXED
|
||||||
@@ -179,16 +183,102 @@ PC_to_RDR_XfrBlock
|
|||||||
RDR_to_PC_DataBlock
|
RDR_to_PC_DataBlock
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Direct conversion, T=1, "FSIJ" */
|
||||||
|
static const char ATR[] = { '\x3B', '\x84', '\x01', 'F', 'S', 'I', 'J' };
|
||||||
|
|
||||||
|
void
|
||||||
|
icc_power_on (char *buf, int len)
|
||||||
|
{
|
||||||
|
int i, size_atr;
|
||||||
|
|
||||||
|
size_atr = sizeof (ATR);
|
||||||
|
|
||||||
|
chMtxLock (&icc_in_mutex);
|
||||||
|
icc_buffer_in[0] = 0x80;
|
||||||
|
icc_buffer_in[1] = size_atr;
|
||||||
|
/* not including '\0' at the end */
|
||||||
|
icc_buffer_in[2] = 0x00;
|
||||||
|
icc_buffer_in[3] = 0x00;
|
||||||
|
icc_buffer_in[4] = 0x00;
|
||||||
|
icc_buffer_in[5] = 0x00; /* Slot */
|
||||||
|
icc_buffer_in[ICC_MSG_SEQ_OFFSET] = buf[ICC_MSG_SEQ_OFFSET];
|
||||||
|
icc_buffer_in[ICC_MSG_STATUS_OFFSET] = 0x00;
|
||||||
|
icc_buffer_in[ICC_MSG_ERROR_OFFSET] = 0x00;
|
||||||
|
icc_buffer_in[9] = 0x00;
|
||||||
|
for (i = 0; i < size_atr; i++)
|
||||||
|
icc_buffer_in[i+10] = ATR[i];
|
||||||
|
|
||||||
|
icc_count_in = 10 + size_atr;
|
||||||
|
|
||||||
|
USB_SIL_Write (EP4_IN, icc_buffer_in, icc_count_in);
|
||||||
|
SetEPTxValid (ENDP4);
|
||||||
|
chMtxUnlock ();
|
||||||
|
|
||||||
|
_write ("ON\r\n", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
icc_power_off (char *buf, int len)
|
||||||
|
{
|
||||||
|
chMtxLock (&icc_in_mutex);
|
||||||
|
|
||||||
|
icc_buffer_in[0] = 0x81;
|
||||||
|
icc_buffer_in[1] = 0x00;
|
||||||
|
icc_buffer_in[2] = 0x00;
|
||||||
|
icc_buffer_in[3] = 0x00;
|
||||||
|
icc_buffer_in[4] = 0x00;
|
||||||
|
icc_buffer_in[5] = 0x00; /* Slot */
|
||||||
|
icc_buffer_in[ICC_MSG_SEQ_OFFSET] = buf[ICC_MSG_SEQ_OFFSET];
|
||||||
|
icc_buffer_in[ICC_MSG_STATUS_OFFSET] = 0x00;
|
||||||
|
icc_buffer_in[ICC_MSG_ERROR_OFFSET] = 0x00;
|
||||||
|
icc_buffer_in[9] = 0x00;
|
||||||
|
|
||||||
|
icc_count_in = 10;
|
||||||
|
USB_SIL_Write (EP4_IN, icc_buffer_in, icc_count_in);
|
||||||
|
SetEPTxValid (ENDP4);
|
||||||
|
chMtxUnlock ();
|
||||||
|
|
||||||
|
_write ("OFF\r\n", 5);
|
||||||
|
}
|
||||||
|
|
||||||
msg_t
|
msg_t
|
||||||
USBThread (void *arg)
|
USBThread (void *arg)
|
||||||
{
|
{
|
||||||
|
char b[3];
|
||||||
|
|
||||||
|
chMtxInit (&icc_in_mutex);
|
||||||
|
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
{
|
{
|
||||||
while (icc_count_out == 0)
|
while (icc_count_out == 0)
|
||||||
chThdSleepMilliseconds (1);
|
chThdSleepMilliseconds (1);
|
||||||
|
|
||||||
_write ("!\r\n", 3);
|
b[0] = icc_buffer_out[0];
|
||||||
|
b[1] = '\r';
|
||||||
|
b[2] = '\n';
|
||||||
|
|
||||||
|
_write (b, 3);
|
||||||
|
if (icc_buffer_out[0] == ICC_POWER_ON)
|
||||||
|
{
|
||||||
|
/* Send back ATR (Answer To Reset) */
|
||||||
|
icc_power_on (icc_buffer_out, icc_count_out);
|
||||||
|
}
|
||||||
|
else if (icc_buffer_out[0] == ICC_POWER_OFF
|
||||||
|
|| icc_buffer_out[0] == ICC_SLOT_STATUS)
|
||||||
|
{
|
||||||
|
/* Kill ICC thread(s) and send back slot status */
|
||||||
|
icc_power_off (icc_buffer_out, icc_count_out);
|
||||||
|
}
|
||||||
|
else if (icc_buffer_out[0] == XFR_BLOCK)
|
||||||
|
{
|
||||||
|
/* Give this message to ICC thread */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
icc_count_out = 0;
|
icc_count_out = 0;
|
||||||
|
SetEPRxValid (ENDP5);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ static const uint8_t gnukConfigDescriptor[] = {
|
|||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
0x01, /* bDescriptorSubtype: Call Management Func Desc */
|
0x01, /* bDescriptorSubtype: Call Management Func Desc */
|
||||||
0x00, /* bmCapabilities: D0+D1 */
|
0x00, /* bmCapabilities: D0+D1 */
|
||||||
0x02, /* bDataInterface: 1 */
|
0x02, /* bDataInterface: 2 */
|
||||||
/*ACM Functional Descriptor*/
|
/*ACM Functional Descriptor*/
|
||||||
4, /* bFunctionLength */
|
4, /* bFunctionLength */
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
|||||||
Reference in New Issue
Block a user