mirror of
https://salsa.debian.org/gnuk-team/gnuk/gnuk.git
synced 2024-09-20 10:50:09 +00:00
more
This commit is contained in:
parent
ec409fe8a4
commit
f58233aa5d
@ -101,6 +101,10 @@ ifneq ($(ENABLE_PINPAD),)
|
||||
CSRC += pin-$(ENABLE_PINPAD).c
|
||||
endif
|
||||
|
||||
ifeq ($(ENABLE_PINPAD),dnd)
|
||||
CSRC += usb_msc.c
|
||||
endif
|
||||
|
||||
# List ASM source files here
|
||||
ASMSRC = $(PORTASM) \
|
||||
$(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F10x/vectors.s
|
||||
|
10
src/configure
vendored
10
src/configure
vendored
@ -86,8 +86,8 @@ Configuration:
|
||||
STM8S_DISCOVERY
|
||||
STBEE
|
||||
--enable-debug debug with virtual COM port [no]
|
||||
--enable-pinpad={cir,dial}
|
||||
PIN input device support [no]
|
||||
--enable-pinpad={dnd,cir,dial}
|
||||
PIN entry support [no]
|
||||
--with-dfu build image for DFU [<target specific>]
|
||||
EOF
|
||||
exit 0
|
||||
@ -159,10 +159,10 @@ if test "$pinpad" = "no"; then
|
||||
PINPAD_MORE_DEFINE=""
|
||||
echo "PIN pad option disabled"
|
||||
elif test "$pinpad" = "yes"; then
|
||||
PINPAD_MAKE_OPTION="ENABLE_PINPAD=cir"
|
||||
PINPAD_MAKE_OPTION="ENABLE_PINPAD=dnd"
|
||||
PINPAD_DEFINE="#define PINPAD_SUPPORT 1"
|
||||
PINPAD_MORE_DEFINE="#define PINPAD_CIR_SUPPORT 1"
|
||||
echo "PIN pad option enabled (cir)"
|
||||
PINPAD_MORE_DEFINE="#define PINPAD_DND_SUPPORT 1"
|
||||
echo "PIN pad option enabled (dnd)"
|
||||
else
|
||||
PINPAD_MAKE_OPTION="ENABLE_PINPAD=$pinpad"
|
||||
PINPAD_DEFINE="#define PINPAD_SUPPORT 1"
|
||||
|
@ -439,13 +439,6 @@ main (int argc, char **argv)
|
||||
"Hello world\r\n\r\n", 35+21+15);
|
||||
}
|
||||
#endif
|
||||
if (msc_recv_cbw () == 0)
|
||||
{
|
||||
int r = msc_handle_cbw ();
|
||||
|
||||
if (r != 1)
|
||||
msc_handle_err (r);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
103
src/pin-dnd.c
103
src/pin-dnd.c
@ -1,10 +1,65 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "ch.h"
|
||||
#include "board.h"
|
||||
#include "gnuk.h"
|
||||
#include "usb_msc.h"
|
||||
|
||||
extern Thread *main_thread;
|
||||
uint8_t pin_input_buffer[MAX_PIN_CHARS];
|
||||
uint8_t pin_input_len;
|
||||
|
||||
static Thread *pin_thread;
|
||||
|
||||
/*
|
||||
* Let user input PIN string.
|
||||
* Return length of the string.
|
||||
* The string itself is in PIN_INPUT_BUFFER.
|
||||
*/
|
||||
int
|
||||
pinpad_getline (int msg_code, systime_t timeout)
|
||||
{
|
||||
msg_t msg;
|
||||
|
||||
(void)msg_code;
|
||||
|
||||
|
||||
DEBUG_INFO (">>>\r\n");
|
||||
|
||||
pin_input_len = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
chSysLock ();
|
||||
msc_media_insert_change (1);
|
||||
pin_thread = chThdSelf ();
|
||||
chSchGoSleepS (THD_STATE_SUSPENDED);
|
||||
msg = chThdSelf ()->p_u.rdymsg;
|
||||
chSysUnlock ();
|
||||
|
||||
led_blink (0);
|
||||
if (msg == 1)
|
||||
break;
|
||||
}
|
||||
|
||||
msc_media_insert_change (0);
|
||||
|
||||
return pin_input_len;
|
||||
}
|
||||
|
||||
static void pinpad_input (void)
|
||||
{
|
||||
chSysLock ();
|
||||
pin_thread->p_u.rdymsg = 0;
|
||||
chSchReadyI (pin_thread);
|
||||
chSysUnlock ();
|
||||
}
|
||||
|
||||
static void pinpad_finish_entry (void)
|
||||
{
|
||||
chSysLock ();
|
||||
pin_thread->p_u.rdymsg = 1;
|
||||
chSchReadyI (pin_thread);
|
||||
chSysUnlock ();
|
||||
}
|
||||
|
||||
#define TOTAL_SECTOR 68
|
||||
|
||||
@ -195,8 +250,6 @@ msc_scsi_read (uint32_t lba, const uint8_t **sector_p)
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t datetime_string[29];
|
||||
static uint8_t *dts = datetime_string;
|
||||
|
||||
static void parse_directory_sector (const uint8_t *p, uint8_t index)
|
||||
{
|
||||
@ -206,6 +259,8 @@ static void parse_directory_sector (const uint8_t *p, uint8_t index)
|
||||
0x20, 0x20, 0x20 };
|
||||
uint8_t child;
|
||||
uint8_t *p_orig = p;
|
||||
int input = 0;
|
||||
int num_children = 0;
|
||||
|
||||
if (index != 0)
|
||||
{
|
||||
@ -218,24 +273,38 @@ static void parse_directory_sector (const uint8_t *p, uint8_t index)
|
||||
cluster_no = p[26] | (p[27] << 8);
|
||||
dest_index = CLUSTER_NO_TO_FOLDER_INDEX (cluster_no);
|
||||
|
||||
if (dest_index >= 1 && dest_index <= 7)
|
||||
dts += sprintf (dts, "%c%c ", FOLDER_INDEX_TO_DIRCHAR (index),
|
||||
FOLDER_INDEX_TO_DIRCHAR (dest_index));
|
||||
if (dest_index < 1 || dest_index > 7)
|
||||
; /* it can be 255 : root_dir */
|
||||
else
|
||||
; /* can be 255 : root_dir */
|
||||
if (pin_input_len < MAX_PIN_CHARS - 2)
|
||||
{
|
||||
pin_input_buffer[pin_input_len++]
|
||||
= FOLDER_INDEX_TO_DIRCHAR (index);
|
||||
pin_input_buffer[pin_input_len++]
|
||||
= FOLDER_INDEX_TO_DIRCHAR (dest_index);
|
||||
input = 1;
|
||||
}
|
||||
|
||||
p += 32;
|
||||
}
|
||||
|
||||
for (i = 0; i < 7; i++)
|
||||
if (*p)
|
||||
{
|
||||
child = DIRCHAR_TO_FOLDER_INDEX (*p);
|
||||
folders[index].children[i] = child;
|
||||
p += 32;
|
||||
}
|
||||
else
|
||||
break;
|
||||
{
|
||||
if (*p)
|
||||
{
|
||||
child = DIRCHAR_TO_FOLDER_INDEX (*p);
|
||||
folders[index].children[i] = child;
|
||||
num_children++;
|
||||
}
|
||||
else
|
||||
folders[index].children[i] = 0;
|
||||
p += 32;
|
||||
}
|
||||
|
||||
if (index == 0 && num_children == 1)
|
||||
pinpad_finish_entry ();
|
||||
else if (input)
|
||||
pinpad_input ();
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -141,8 +141,6 @@ void EP7_OUT_Callback (void)
|
||||
}
|
||||
}
|
||||
|
||||
static const uint8_t lun_buf[4] = {0, 0, 0, 0}; /* One drives: 0 */
|
||||
|
||||
static const uint8_t scsi_inquiry_data_00[] = { 0, 0, 0, 0, 0 };
|
||||
|
||||
static const uint8_t scsi_inquiry_data[] = {
|
||||
@ -280,6 +278,7 @@ static void msc_send_result (const uint8_t *p, size_t n)
|
||||
}
|
||||
|
||||
|
||||
|
||||
void msc_handle_command (void)
|
||||
{
|
||||
size_t n;
|
||||
@ -500,3 +499,22 @@ void msc_handle_command (void)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static msg_t
|
||||
msc_main (void *arg)
|
||||
{
|
||||
(void)arg;
|
||||
|
||||
while (1)
|
||||
msc_handle_command ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static WORKING_AREA(wa_msc_thread, 128);
|
||||
|
||||
void msc_init (void)
|
||||
{
|
||||
chThdCreateStatic (wa_msc_thread, sizeof (wa_msc_thread),
|
||||
NORMALPRIO, msc_main, NULL);
|
||||
}
|
||||
|
@ -36,6 +36,10 @@
|
||||
#include "usb-cdc-vport.c"
|
||||
#endif
|
||||
|
||||
#ifdef PINPAD_DND_SUPPORT
|
||||
#include "usb_msc.h"
|
||||
#endif
|
||||
|
||||
|
||||
static void
|
||||
gnuk_device_init (void)
|
||||
@ -247,11 +251,24 @@ gnuk_data_rates (uint16_t len)
|
||||
return (uint8_t *)data_rate_table;
|
||||
}
|
||||
|
||||
static const uint8_t lun_table[] = { 0, 0, 0, 0, };
|
||||
static uint8_t *
|
||||
msc_lun_info (uint16_t len)
|
||||
{
|
||||
if (len == 0)
|
||||
{
|
||||
pInformation->Ctrl_Info.Usb_wLength = sizeof (lun_table);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (uint8_t *)lun_table;
|
||||
}
|
||||
|
||||
static RESULT
|
||||
gnuk_setup_with_data (uint8_t RequestNo)
|
||||
{
|
||||
if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
|
||||
if (pInformation->USBwIndex0 == 0) /* Interface */
|
||||
if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) /* Interface */
|
||||
if (pInformation->USBwIndex0 == 0)
|
||||
{
|
||||
if (RequestNo == USB_CCID_REQ_GET_CLOCK_FREQUENCIES)
|
||||
{
|
||||
@ -270,23 +287,41 @@ gnuk_setup_with_data (uint8_t RequestNo)
|
||||
else
|
||||
return USB_UNSUPPORT;
|
||||
}
|
||||
else
|
||||
#if defined(PINPAD_DND_SUPPORT)
|
||||
# if defined(ENABLE_VIRTUAL_COM_PORT)
|
||||
else if (pInformation->USBwIndex0 == 2)
|
||||
return Virtual_Com_Port_Data_Setup (RequestNo);
|
||||
else if (pInformation->USBwIndex0 == 3)
|
||||
# else
|
||||
else if (pInformation->USBwIndex0 == 1)
|
||||
# endif
|
||||
{
|
||||
#if defined(ENABLE_VIRTUAL_COM_PORT)
|
||||
return Virtual_Com_Port_Data_Setup (RequestNo);
|
||||
#else
|
||||
return USB_UNSUPPORT;
|
||||
#endif
|
||||
if (RequestNo == MSC_GET_MAX_LUN_COMMAND)
|
||||
{
|
||||
pInformation->Ctrl_Info.CopyData = msc_lun_info;
|
||||
pInformation->Ctrl_Info.Usb_wOffset = 0;
|
||||
msc_lun_info (0);
|
||||
return USB_SUCCESS;
|
||||
}
|
||||
else
|
||||
return USB_UNSUPPORT;
|
||||
}
|
||||
#elif defined(ENABLE_VIRTUAL_COM_PORT)
|
||||
else if (pInformation->USBwIndex0 == 2)
|
||||
return Virtual_Com_Port_Data_Setup (RequestNo);
|
||||
#endif
|
||||
else
|
||||
return USB_UNSUPPORT;
|
||||
else
|
||||
return USB_UNSUPPORT;
|
||||
}
|
||||
|
||||
|
||||
static RESULT
|
||||
gnuk_setup_with_nodata (uint8_t RequestNo)
|
||||
{
|
||||
if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
|
||||
if (pInformation->USBwIndex0 == 0) /* Interface */
|
||||
if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) /* Interface */
|
||||
if (pInformation->USBwIndex0 == 0)
|
||||
{
|
||||
if (RequestNo == USB_CCID_REQ_ABORT)
|
||||
/* wValue: bSeq, bSlot */
|
||||
@ -295,14 +330,29 @@ gnuk_setup_with_nodata (uint8_t RequestNo)
|
||||
else
|
||||
return USB_UNSUPPORT;
|
||||
}
|
||||
else
|
||||
#if defined(PINPAD_DND_SUPPORT)
|
||||
# if defined(ENABLE_VIRTUAL_COM_PORT)
|
||||
else if (pInformation->USBwIndex0 == 2)
|
||||
return Virtual_Com_Port_NoData_Setup (RequestNo);
|
||||
else if (pInformation->USBwIndex0 == 3)
|
||||
# else
|
||||
else if (pInformation->USBwIndex0 == 1)
|
||||
# endif
|
||||
{
|
||||
#if defined(ENABLE_VIRTUAL_COM_PORT)
|
||||
return Virtual_Com_Port_NoData_Setup (RequestNo);
|
||||
#else
|
||||
return USB_UNSUPPORT;
|
||||
#endif
|
||||
if (RequestNo == MSC_MASS_STORAGE_RESET_COMMAND)
|
||||
{
|
||||
/* Should call resetting MSC thread, something like msc_reset() */
|
||||
return USB_SUCCESS;
|
||||
}
|
||||
else
|
||||
return USB_UNSUPPORT;
|
||||
}
|
||||
#elif defined(ENABLE_VIRTUAL_COM_PORT)
|
||||
else if (pInformation->USBwIndex0 == 2)
|
||||
return Virtual_Com_Port_NoData_Setup (RequestNo);
|
||||
#endif
|
||||
else
|
||||
return USB_UNSUPPORT;
|
||||
else
|
||||
return USB_UNSUPPORT;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user