mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 05:38:33 +03:00
Structure build system to build for multiple boards/apps/environments
This commit is contained in:
38
firmware/libcommon/include/card_emu.h
Normal file
38
firmware/libcommon/include/card_emu.h
Normal file
@@ -0,0 +1,38 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct card_handle;
|
||||
|
||||
enum card_io {
|
||||
CARD_IO_VCC,
|
||||
CARD_IO_RST,
|
||||
CARD_IO_CLK,
|
||||
};
|
||||
|
||||
struct card_handle *card_emu_init(uint8_t slot_num, uint8_t tc_chan, uint8_t uart_chan);
|
||||
|
||||
/* process a single byte received from the reader */
|
||||
void card_emu_process_rx_byte(struct card_handle *ch, uint8_t byte);
|
||||
|
||||
/* transmit a single byte to the reader */
|
||||
int card_emu_tx_byte(struct card_handle *ch);
|
||||
|
||||
/* hardware driver informs us that a card I/O signal has changed */
|
||||
void card_emu_io_statechg(struct card_handle *ch, enum card_io io, int active);
|
||||
|
||||
/* User sets a new ATR to be returned during next card reset */
|
||||
int card_emu_set_atr(struct card_handle *ch, const uint8_t *atr, uint8_t len);
|
||||
|
||||
struct llist_head *card_emu_get_uart_tx_queue(struct card_handle *ch);
|
||||
struct llist_head *card_emu_get_usb_tx_queue(struct card_handle *ch);
|
||||
void card_emu_have_new_uart_tx(struct card_handle *ch);
|
||||
void card_emu_report_status(struct card_handle *ch);
|
||||
|
||||
#define ENABLE_TX 0x01
|
||||
#define ENABLE_RX 0x02
|
||||
|
||||
int card_emu_uart_update_fidi(uint8_t uart_chan, unsigned int fidi);
|
||||
int card_emu_uart_tx(uint8_t uart_chan, uint8_t byte);
|
||||
void card_emu_uart_enable(uint8_t uart_chan, uint8_t rxtx);
|
||||
void card_emu_uart_wait_tx_idle(uint8_t uart_chan);
|
||||
135
firmware/libcommon/include/cardemu_prot.h
Normal file
135
firmware/libcommon/include/cardemu_prot.h
Normal file
@@ -0,0 +1,135 @@
|
||||
#pragma once
|
||||
|
||||
/* Smart Card Emulation USB protocol */
|
||||
|
||||
/* (C) 2015 by Harald Welte <hwelte@hmw-consulting.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* DT = Device Terminated. DO = Device Originated */
|
||||
enum cardemu_usb_msg_type {
|
||||
/* Bulk out pipe */
|
||||
CEMU_USB_MSGT_DT_TX_DATA, /* TPDU Date */
|
||||
CEMU_USB_MSGT_DT_SET_ATR, /* Set the ATR stored in simulator */
|
||||
CEMU_USB_MSGT_DT_GET_STATS, /* request DO_STATS */
|
||||
CEMU_USB_MSGT_DT_GET_STATUS, /* request DO_STATUS */
|
||||
CEMU_USB_MSGT_DT_CARDINSERT, /* insert/remove card */
|
||||
|
||||
/* Bulk in pipe */
|
||||
CEMU_USB_MSGT_DO_RX_DATA, /* TPDU data */
|
||||
CEMU_USB_MSGT_DO_STATUS, /* Status information */
|
||||
CEMU_USB_MSGT_DO_STATS, /* Statistics */
|
||||
CEMU_USB_MSGT_DO_PTS, /* Information about PTS */
|
||||
CEMU_USB_MSGT_DO_ERROR, /* Error message */
|
||||
};
|
||||
|
||||
/* generic header, shared by all messages */
|
||||
struct cardemu_usb_msg_hdr {
|
||||
uint8_t msg_type; /* enum cardemu_usb_msg_type */
|
||||
uint8_t seq_nr; /* sequence number */
|
||||
uint16_t msg_len; /* length of message including hdr */
|
||||
uint8_t data[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* indicates a TPDU header is present in this message */
|
||||
#define CEMU_DATA_F_TPDU_HDR 0x00000001
|
||||
/* indicates last part of transmission in this direction */
|
||||
#define CEMU_DATA_F_FINAL 0x00000002
|
||||
/* incdicates a PB is present and we should continue with TX */
|
||||
#define CEMU_DATA_F_PB_AND_TX 0x00000004
|
||||
/* incdicates a PB is present and we should continue with RX */
|
||||
#define CEMU_DATA_F_PB_AND_RX 0x00000008
|
||||
|
||||
/* CEMU_USB_MSGT_DT_CARDINSERT */
|
||||
struct cardemu_usb_msg_cardinsert {
|
||||
struct cardemu_usb_msg_hdr hdr;
|
||||
uint8_t card_insert;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* CEMU_USB_MSGT_DT_SET_ATR */
|
||||
struct cardemu_usb_msg_set_atr {
|
||||
struct cardemu_usb_msg_hdr hdr;
|
||||
uint8_t atr_len;
|
||||
/* variable-length ATR data */
|
||||
uint8_t atr[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* CEMU_USB_MSGT_DT_TX_DATA */
|
||||
struct cardemu_usb_msg_tx_data {
|
||||
struct cardemu_usb_msg_hdr hdr;
|
||||
uint32_t flags;
|
||||
uint16_t data_len;
|
||||
/* variable-length TPDU data */
|
||||
uint8_t data[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* CEMU_USB_MSGT_DO_RX_DATA */
|
||||
struct cardemu_usb_msg_rx_data {
|
||||
struct cardemu_usb_msg_hdr hdr;
|
||||
uint32_t flags;
|
||||
uint16_t data_len;
|
||||
/* variable-length TPDU data */
|
||||
uint8_t data[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define CEMU_STATUS_F_VCC_PRESENT 0x00000001
|
||||
#define CEMU_STATUS_F_CLK_ACTIVE 0x00000002
|
||||
#define CEMU_STATUS_F_RCEMU_ACTIVE 0x00000004
|
||||
#define CEMU_STATUS_F_CARD_INSERT 0x00000008
|
||||
#define CEMU_STATUS_F_RESET_ACTIVE 0x00000010
|
||||
|
||||
/* CEMU_USB_MSGT_DO_STATUS */
|
||||
struct cardemu_usb_msg_status {
|
||||
struct cardemu_usb_msg_hdr hdr;
|
||||
uint32_t flags;
|
||||
/* phone-applied target voltage in mV */
|
||||
uint16_t voltage_mv;
|
||||
/* Fi/Di related information */
|
||||
uint8_t fi;
|
||||
uint8_t di;
|
||||
uint8_t wi;
|
||||
uint32_t waiting_time;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* CEMU_USB_MSGT_DO_PTS */
|
||||
struct cardemu_usb_msg_pts_info {
|
||||
struct cardemu_usb_msg_hdr hdr;
|
||||
uint8_t pts_len;
|
||||
/* PTS request as sent from reader */
|
||||
uint8_t req[6];
|
||||
/* PTS response as sent by card */
|
||||
uint8_t resp[6];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* CEMU_USB_MSGT_DO_ERROR */
|
||||
struct cardemu_usb_msg_error {
|
||||
struct cardemu_usb_msg_hdr hdr;
|
||||
uint8_t severity;
|
||||
uint8_t subsystem;
|
||||
uint16_t code;
|
||||
uint8_t msg_len;
|
||||
/* human-readable error message */
|
||||
uint8_t msg[0];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
static inline void cardemu_hdr_set(struct cardemu_usb_msg_hdr *hdr, uint16_t msgt)
|
||||
{
|
||||
memset(hdr, 0, sizeof(*hdr));
|
||||
hdr->msg_type = msgt;
|
||||
}
|
||||
120
firmware/libcommon/include/simtrace.h
Normal file
120
firmware/libcommon/include/simtrace.h
Normal file
@@ -0,0 +1,120 @@
|
||||
#ifndef SIMTRACE_H
|
||||
#define SIMTRACE_H
|
||||
|
||||
#include "ringbuffer.h"
|
||||
#include "board.h"
|
||||
|
||||
/* Endpoint numbers */
|
||||
#define DATAOUT 1
|
||||
#define DATAIN 2
|
||||
#define INT 3
|
||||
|
||||
#define BUFLEN 512
|
||||
|
||||
#define PHONE_DATAOUT 4
|
||||
#define PHONE_DATAIN 5
|
||||
#define PHONE_INT 6
|
||||
|
||||
#define CARDEM_USIM2_DATAOUT DATAOUT
|
||||
#define CARDEM_USIM2_DATAIN DATAIN
|
||||
#define CARDEM_USIM2_INT INT
|
||||
|
||||
#define CLK_MASTER true
|
||||
#define CLK_SLAVE false
|
||||
|
||||
/* ===================================================*/
|
||||
/* Taken from iso7816_4.c */
|
||||
/* ===================================================*/
|
||||
/** Flip flop for send and receive char */
|
||||
#define USART_SEND 0
|
||||
#define USART_RCV 1
|
||||
|
||||
|
||||
extern volatile ringbuf sim_rcv_buf;
|
||||
|
||||
extern volatile bool rcvdChar;
|
||||
extern volatile uint32_t char_stat;
|
||||
|
||||
extern const Pin pinPhoneRST;
|
||||
|
||||
enum confNum {
|
||||
CFG_NUM_NONE = 0,
|
||||
#ifdef HAVE_SNIFFER
|
||||
CFG_NUM_SNIFF,
|
||||
#endif
|
||||
#ifdef HAVE_CCID
|
||||
CFG_NUM_CCID,
|
||||
#endif
|
||||
#ifdef HAVE_CARDEM
|
||||
CFG_NUM_PHONE,
|
||||
#endif
|
||||
#ifdef HAVE_MITM
|
||||
CFG_NUM_MITM,
|
||||
#endif
|
||||
NUM_CONF
|
||||
};
|
||||
|
||||
/// CCIDDriverConfiguration Descriptors
|
||||
/// List of descriptors that make up the configuration descriptors of a
|
||||
/// device using the CCID driver.
|
||||
typedef struct {
|
||||
|
||||
/// Configuration descriptor
|
||||
USBConfigurationDescriptor configuration;
|
||||
/// Interface descriptor
|
||||
USBInterfaceDescriptor interface;
|
||||
/// CCID descriptor
|
||||
CCIDDescriptor ccid;
|
||||
/// Bulk OUT endpoint descriptor
|
||||
USBEndpointDescriptor bulkOut;
|
||||
/// Bulk IN endpoint descriptor
|
||||
USBEndpointDescriptor bulkIn;
|
||||
/// Interrupt OUT endpoint descriptor
|
||||
USBEndpointDescriptor interruptIn;
|
||||
} __attribute__ ((packed)) CCIDDriverConfigurationDescriptors;
|
||||
|
||||
extern const USBConfigurationDescriptor *configurationDescriptorsArr[];
|
||||
|
||||
int check_data_from_phone();
|
||||
void update_fidi(uint8_t fidi);
|
||||
|
||||
void ISR_PhoneRST( const Pin *pPin);
|
||||
|
||||
/* Configure functions */
|
||||
extern void Sniffer_configure( void );
|
||||
extern void CCID_configure( void );
|
||||
extern void mode_cardemu_configure(void);
|
||||
extern void MITM_configure( void );
|
||||
|
||||
/* Init functions */
|
||||
extern void Sniffer_init( void );
|
||||
extern void CCID_init( void );
|
||||
extern void mode_cardemu_init(void);
|
||||
extern void MITM_init( void );
|
||||
|
||||
extern void SIMtrace_USB_Initialize( void );
|
||||
|
||||
/* Exit functions */
|
||||
extern void Sniffer_exit( void );
|
||||
extern void CCID_exit( void );
|
||||
extern void mode_cardemu_exit(void);
|
||||
extern void MITM_exit( void );
|
||||
|
||||
/* Run functions */
|
||||
extern void Sniffer_run( void );
|
||||
extern void CCID_run( void );
|
||||
extern void mode_cardemu_run(void);
|
||||
extern void MITM_run( void );
|
||||
|
||||
extern void mode_cardemu_usart0_irq(void);
|
||||
extern void mode_cardemu_usart1_irq(void);
|
||||
|
||||
/* Timer helper function */
|
||||
void Timer_Init( void );
|
||||
void TC0_Counter_Reset( void );
|
||||
|
||||
struct llist_head;
|
||||
int usb_refill_to_host(struct llist_head *queue, uint32_t ep);
|
||||
int usb_refill_from_host(struct llist_head *queue, int ep);
|
||||
|
||||
#endif /* SIMTRACE_H */
|
||||
11
firmware/libcommon/include/tc_etu.h
Normal file
11
firmware/libcommon/include/tc_etu.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
void tc_etu_set_wtime(uint8_t chan_nr, uint16_t wtime);
|
||||
void tc_etu_set_etu(uint8_t chan_nr, uint16_t etu);
|
||||
void tc_etu_init(uint8_t chan_nr, void *handle);
|
||||
void tc_etu_enable(uint8_t chan_nr);
|
||||
void tc_etu_disable(uint8_t chan_nr);
|
||||
|
||||
extern void tc_etu_wtime_half_expired(void *handle);
|
||||
extern void tc_etu_wtime_expired(void *handle);
|
||||
Reference in New Issue
Block a user