216 lines
4.4 KiB
C
216 lines
4.4 KiB
C
#include <stdbool.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include "wm_regs.h"
|
|
#include "wm_7816.h"
|
|
#include "wm_gpio.h"
|
|
#include "wm_uart.h"
|
|
#include "wm_osal.h"
|
|
#include "wm_demo.h"
|
|
#include "wm_pmu.h"
|
|
|
|
#if DEMO_7816
|
|
|
|
struct sc_rx
|
|
{
|
|
uint8_t *buf;
|
|
u16 buf_len;
|
|
u16 require_len;
|
|
u16 current_len;
|
|
tls_os_sem_t * sem_rx;
|
|
uint8_t timeout;
|
|
}sc_rx;
|
|
|
|
extern void tls_uart_rx_callback_register(u16 uart_no, s16(*rx_callback) (u16 len, void* user_data), void *priv_data);
|
|
extern void tls_uart_free_tx_sent_data(struct tls_uart_port *port);
|
|
|
|
const char i2d_cmd[] = { 0x00,0xa4,0x04,0x04,0x10,0xa0,0x00,
|
|
0x00,0x00,0x30,0x50,0x00,0x00,0x00,
|
|
0x00,0x00,0x00,0x00,0x49,0x64,0x32 };
|
|
|
|
s16 uart2_rx_cb(uint16_t len)
|
|
{
|
|
if (len == 0xFFFF)
|
|
{
|
|
sc_rx.timeout = 1;
|
|
tls_os_sem_release(sc_rx.sem_rx);
|
|
return 0 ;
|
|
}
|
|
if(sc_rx.current_len + len < sc_rx.require_len)
|
|
{
|
|
tls_uart_read(2, &sc_rx.buf[sc_rx.current_len], len);
|
|
sc_rx.current_len += len;
|
|
sc_rx.timeout = 0;
|
|
}
|
|
else
|
|
{
|
|
tls_uart_read(2, &sc_rx.buf[sc_rx.current_len], len);
|
|
sc_rx.current_len += len;
|
|
sc_rx.timeout = 0;
|
|
tls_os_sem_release(sc_rx.sem_rx);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
void wm_sc_atr_test()
|
|
{
|
|
char sdata[4] = {0xff, 0x10, 0x95};
|
|
//char rdata[4] = {0xa,0xb,0xc,0xd};
|
|
char parity_byte = (uint8_t)(0xff ^ (uint8_t)0x10 ^ 0x95);
|
|
sdata[3] = parity_byte;
|
|
char test[32];
|
|
|
|
uint16_t sc_state = 0;
|
|
/*open 7816 clk*/
|
|
tls_open_peripheral_clock(TLS_PERIPHERAL_TYPE_UART2);
|
|
sc_io.clk_pin_num = WM_IO_PB_04;
|
|
sc_io.clk_opt = WM_IO_OPTION2;
|
|
|
|
sc_io.io_pin_num = WM_IO_PB_02;
|
|
sc_io.io_opt = WM_IO_OPTION3;
|
|
sc_io.initialed = 1;
|
|
|
|
sc_rx.buf = (uint8_t *)test;
|
|
sc_rx.buf_len = 32;
|
|
sc_rx.require_len = 20;
|
|
sc_rx.current_len = 0;
|
|
sc_rx.timeout = 0;
|
|
tls_os_sem_create(&sc_rx.sem_rx, 0);
|
|
|
|
wm_sc_powerInit();
|
|
tls_uart_port_init(2, NULL, 1);
|
|
tls_uart_set_parity(2, TLS_UART_PMODE_EVEN);
|
|
tls_uart_set_stop_bits(2, TLS_UART_TWO_STOPBITS);
|
|
wm_sc_set_bcwt(0x1ff);
|
|
|
|
tls_uart_rx_callback_register((u16) TLS_UART_2, (void *)uart2_rx_cb, NULL);
|
|
tls_uart_tx_callback_register(2, (s16(*) (struct tls_uart_port *))tls_uart_free_tx_sent_data);
|
|
|
|
while(1)
|
|
{
|
|
switch(sc_state)
|
|
{
|
|
case 0:
|
|
wm_sc_colreset();
|
|
break;
|
|
case 1:
|
|
if (test[0] == 0x3b)
|
|
{
|
|
sc_rx.require_len = 4;
|
|
sc_rx.current_len = 0;
|
|
sc_rx.timeout = 0;
|
|
tls_uart_write(2, sdata, 4);
|
|
}
|
|
else
|
|
{
|
|
sc_state = 0;
|
|
continue;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (test[0] == 0xff)
|
|
{
|
|
if (!memcmp(sdata, test, 4))
|
|
{
|
|
wm_sc_set_etu(32);
|
|
}
|
|
sc_rx.require_len = 1;
|
|
sc_rx.current_len = 0;
|
|
sc_rx.timeout = 0;
|
|
tls_uart_write(2, (char *)i2d_cmd, 5);
|
|
}
|
|
break;
|
|
case 3:
|
|
if (test[0] == 0xA4)
|
|
{
|
|
sc_rx.require_len = 2;
|
|
sc_rx.current_len = 0;
|
|
sc_rx.timeout = 0;
|
|
tls_uart_write(2, (char *)&i2d_cmd[5], 16);
|
|
}
|
|
break;
|
|
case 4:
|
|
if (test[0] == 0x90)
|
|
{
|
|
test[0] = 0x00;
|
|
test[1] = 0x36;
|
|
test[2] = 0x00;
|
|
test[3] = 0x00;
|
|
test[4] = 0x03;
|
|
sc_rx.require_len = 1;
|
|
sc_rx.current_len = 0;
|
|
sc_rx.timeout = 0;
|
|
tls_uart_write(2, test, 5);
|
|
}
|
|
break;
|
|
case 5:
|
|
if (test[0] == 0x36)
|
|
{
|
|
test[0] = 0x41;
|
|
test[1] = 0x00;
|
|
test[2] = 0x41;
|
|
sc_rx.require_len = 0x2;
|
|
sc_rx.current_len = 0;
|
|
sc_rx.timeout = 0;
|
|
tls_uart_write(2, test, 3);
|
|
}
|
|
break;
|
|
case 6:
|
|
if (test[0] == 0x61)
|
|
{
|
|
test[0] = 0x00;
|
|
test[1] = 0xc0;
|
|
test[2] = 0x00;
|
|
test[3] = 0x00;
|
|
test[4] = 0x16;
|
|
sc_rx.require_len = 0x19;
|
|
sc_rx.current_len = 0;
|
|
sc_rx.timeout = 0;
|
|
tls_uart_write(2, test, 5);
|
|
}
|
|
break;
|
|
case 7:
|
|
if (test[0] == 0xc0)
|
|
{
|
|
test[19] = 0;
|
|
printf("id2:%s\r\n", &test[1]);
|
|
printf("\nhot reset \n");
|
|
sc_rx.require_len = 20;
|
|
sc_rx.current_len = 0;
|
|
sc_rx.timeout = 0;
|
|
wm_sc_hotreset();
|
|
sc_state = 0;
|
|
}
|
|
break;
|
|
}
|
|
tls_os_sem_acquire(sc_rx.sem_rx, 0);
|
|
if (!sc_rx.timeout)
|
|
{
|
|
sc_state++;
|
|
}
|
|
else
|
|
{
|
|
printf("timeout\r\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
#define DEMO_TASK_SIZE 768
|
|
static OS_STK DemoTaskStk7816[DEMO_TASK_SIZE];
|
|
#define DEMO_CONSOLE_BUF_SIZE 512
|
|
|
|
int wm_7816_demo(void)
|
|
{
|
|
tls_os_task_create(NULL, NULL,
|
|
wm_sc_atr_test,
|
|
NULL,
|
|
(void *)DemoTaskStk7816,
|
|
DEMO_TASK_SIZE * sizeof(u32),
|
|
61,
|
|
0);
|
|
return WM_SUCCESS;
|
|
}
|
|
|
|
#endif
|
|
|