1 Commits

Author SHA1 Message Date
Oliver Smith
b86831c55b debian: don't package simtrace2-firmware anymore
Don't attempt to build the firmware with the random default compiler
from the distribution anymore. With some GCC versions, the DFU loader
does not fit the partition anymore.

Related: OS#5260
Change-Id: I95a8472b458db203ad14efd57268ca922c75aeb1
2021-11-17 16:16:46 +01:00
123 changed files with 776 additions and 1449 deletions

View File

@@ -1 +0,0 @@
--exclude ^firmware/atmel_softpack_libraries/.*$

3
.gitignore vendored
View File

@@ -20,9 +20,6 @@ tags
host/simtrace2-list
host/simtrace2-cardem-pcsc
host/contrib/simtrace2.spec
host/src/simtrace2-tool
host/tests
usb_strings_generated.h
firmware/usbstring/usbstring
firmware/apps/*/usb_strings.txt.patched
firmware/misc/crctool

View File

@@ -27,45 +27,21 @@ verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="$inst/lib"
# dfu target MUST be built first, the combined targets need a bl that can be combined..
BUILDS="simtrace/dfu qmod/dfu owhw/dfu ngff_cardem/dfu "
#
BUILDS+="simtrace/blupdate qmod/blupdate owhw/blupdate ngff_cardem/blupdate "
BUILDS+="simtrace/cardem qmod/cardem owhw/cardem octsimtest/cardem ngff_cardem/cardem "
BUILDS+="simtrace/trace ngff_cardem/trace "
BUILDS=""
BUILDS+="simtrace/dfu simtrace/blupdate simtrace/trace simtrace/cardem "
BUILDS+="qmod/dfu qmod/blupdate qmod/cardem "
BUILDS+="owhw/dfu owhw/blupdate owhw/cardem "
BUILDS+="octsimtest/cardem "
BUILDS+="ngff_cardem/dfu ngff_cardem/blupdate ngff_cardem/cardem ngff_cardem/trace "
cd $TOPDIR/firmware
for build in $BUILDS; do
board=`echo $build | cut -d "/" -f 1`
app=`echo $build | cut -d "/" -f 2`
case "$build" in
"owhw/cardem")
comb="combined"
;;
"qmod/cardem")
comb="combined"
;;
"ngff_cardem/cardem")
comb="combined"
;;
"simtrace/trace")
comb="combined"
;;
*)
comb=""
;;
esac
echo
# Build the bootloader with clang, the rest with gcc (OS#5260, OS#6026)
if [ "$app" = "dfu" ]; then
echo "=============== $board / $app START (CLANG) =============="
PATH="/opt/llvm-arm/bin:$PATH" make USE_CLANG=1 BOARD="$board" APP="$app" $comb
echo "=============== $board / $app RES:$? =============="
else
echo "=============== $board / $app START (GCC) =============="
make USE_CLANG=0 BOARD="$board" APP="$app" $comb
echo "=============== $board / $app RES:$? =============="
fi
echo "=============== $board / $app START =============="
make BOARD="$board" APP="$app"
echo "=============== $board / $app RES:$? =============="
done
echo

View File

@@ -1,4 +1,4 @@
#!/bin/bash -e
#!/bin/sh -e
# Create copies of binaries with -latest, -$GIT_VERSION (OS#4413, OS#3452)
cd "$(dirname "$0")/.."
@@ -9,10 +9,8 @@ echo "Copying binaries with "-latest" and "-$GIT_VERSION" appended..."
cd firmware/bin
for ext in bin elf; do
for file in *."$ext"; do
if ! [[ "$file" =~ ^(.*padded.*|.*nocrcstub.*bin)$ ]];then
without_ext="${file%.*}"
cp -v "$file" "$without_ext-latest.$ext"
cp -v "$file" "$without_ext-$GIT_VERSION.$ext"
fi
without_ext="${file%.*}"
cp -v "$file" "$without_ext-latest.$ext"
cp -v "$file" "$without_ext-$GIT_VERSION.$ext"
done
done

View File

@@ -1,12 +1,3 @@
-- wireshark LUA dissector for the SIMtrace USB protocol
-- (C) 2021 by sysmocom - s.f.m.c. GmbH, Author: Eric Wild
-- SPDX-License-Identifier: GPL-2.0+
--
-- Usage: Move this file to your "personal lua plugins" folder that
-- can be found in the Wireshark Help->About Wireshark->Folders tab
-- Windows: %APPDATA%\Wireshark\plugins.
-- Unix-like systems: ~/.local/lib/wireshark/plugins.
usb_simtrace_protocol = Proto("USB_simtrace", "USB simtrace protocol")
@@ -16,95 +7,49 @@ local control_commands = {
[0x0001] = "SIMTRACE_CMD_BD_BOARD_INFO",
-- /* SIMTRACE_MSGC_CARDEM */
[0x0101] = "DT_CEMU_TX_DATA",
[0x0102] = "DT_CEMU_SET_ATR",
[0x0103] = "BD_CEMU_STATS",
[0x0104] = "BD_CEMU_STATUS",
[0x0105] = "DT_CEMU_CARDINSERT",
[0x0106] = "DO_CEMU_RX_DATA",
[0x0107] = "DO_CEMU_PTS",
[0x0108] = "BD_CEMU_CONFIG",
[0x0101] = "SIMTRACE_MSGT_DT_CEMU_TX_DATA",
[0x0102] = "SIMTRACE_MSGT_DT_CEMU_SET_ATR",
[0x0103] = "SIMTRACE_MSGT_BD_CEMU_STATS",
[0x0104] = "SIMTRACE_MSGT_BD_CEMU_STATUS",
[0x0105] = "SIMTRACE_MSGT_DT_CEMU_CARDINSERT",
[0x0106] = "SIMTRACE_MSGT_DO_CEMU_RX_DATA",
[0x0107] = "SIMTRACE_MSGT_DO_CEMU_PTS",
[0x0108] = "SIMTRACE_MSGT_BD_CEMU_CONFIG",
-- /* SIMTRACE_MSGC_MODEM */
[0x0201] = "DT_MODEM_RESET",
[0x0202] = "DT_MODEM_SIM_SELECT",
[0x0203] = "BD_MODEM_STATUS",
[0x0201] = "SIMTRACE_MSGT_DT_MODEM_RESET",
[0x0202] = "SIMTRACE_MSGT_DT_MODEM_SIM_SELECT",
[0x0203] = "SIMTRACE_MSGT_BD_MODEM_STATUS",
-- /* SIMTRACE_MSGC_SNIFF */
[0x0300] = "SNIFF_CHANGE",
[0x0301] = "SNIFF_FIDI",
[0x0302] = "SNIFF_ATR",
[0x0304] = "SNIFF_TPDU",
[0x0303] = "SNIFF_PPS"
[0x0300] = "SIMTRACE_MSGT_SNIFF_CHANGE",
[0x0301] = "SIMTRACE_MSGT_SNIFF_FIDI",
[0x0302] = "SIMTRACE_MSGT_SNIFF_ATR",
[0x0304] = "SIMTRACE_MSGT_SNIFF_TPDU",
[0x0303] = "SIMTRACE_MSGT_SNIFF_PPS"
}
local msgtype = ProtoField.uint16("usb_simtrace.msgtype", "Message Type", base.HEX_DEC, control_commands)
local seqnr = ProtoField.uint8("usb_simtrace.seqnr", "Sequence Number", base.DEC)
local slotnr = ProtoField.uint8("usb_simtrace.slotnr", "Slot Number", base.DEC)
local seqnr = ProtoField.uint8("usb_simtrace.seqnr", "Sequence Number", base.HEX_DEC)
local slotnr = ProtoField.uint8("usb_simtrace.slotnr", "Slot Number", base.HEX_DEC)
local reserved = ProtoField.uint16("usb_simtrace.reserved", "reserved", base.HEX_DEC)
local payloadlen = ProtoField.uint16("usb_simtrace.length", "length", base.DEC)
local payloadlen = ProtoField.uint16("usb_simtrace.length", "length", base.HEX_DEC)
local payload = ProtoField.bytes("usb_simtrace.payload", "Data")
local pb_and_rx = ProtoField.uint32("usb_simtrace.pb_and_rx", "pb_and_rx", base.HEX_DEC, NULL, 0x8)
local pb_and_tx = ProtoField.uint32("usb_simtrace.pb_and_tx", "pb_and_tx", base.HEX_DEC, NULL, 0x4)
local final = ProtoField.uint32("usb_simtrace.final", "final", base.HEX_DEC, NULL, 0x2)
local tpdu_hdr = ProtoField.uint32("usb_simtrace.tpdu_hdr", "tpdu_hdr", base.HEX_DEC, NULL, 0x1)
local rxtxdatalen = ProtoField.uint16("usb_simtrace.rxtxdatalen", "rx/tx data length", base.DEC)
local rxtxdatalen = ProtoField.uint16("usb_simtrace.rxtxdatalen", "rx/tx data length", base.HEX_DEC)
local rxtxdata = ProtoField.bytes("usb_simtrace.rxtxdata", "rx/tx (data)")
local hf_pts_len = ProtoField.uint8("usb_simtrace.pts_len", "PTS length", base.DEC)
local hf_pts_req = ProtoField.bytes("usb_simtrace.pts_req", "PTS request")
local hf_pts_resp = ProtoField.bytes("usb_simtrace.pts_resp", "PTS response")
local hf_cemu_cfg_features = ProtoField.uint32("usb_simtrace.cemu_cfg.features.status_irq", "CardEm Features", base.HEX)
local hf_cemu_cfg_slot_mux_nr = ProtoField.uint32("usb_simtrace.cemu_cfg.features.slot_mux_nr", "CardEm Slot Mux Nr", base.DEC)
local card_insert_types = {
[0x00] = "not inserted",
[0x01] = "inserted",
}
local hf_cemu_cardinsert = ProtoField.uint8("usb_simtrace.cardinsert", "Card Insert", base.DEC, card_insert_types, 0xff)
local CEMU_STATUS_F_VCC_PRESENT = ProtoField.uint32("usb_simtrace.CEMU_STATUS.F_VCC_PRESENT", "VCC_PRESENT", base.HEX_DEC, NULL, 0x00000001)
local CEMU_STATUS_F_CLK_ACTIVE = ProtoField.uint32("usb_simtrace.CEMU_STATUS.F_CLK_ACTIVE", "CLK_ACTIVE", base.HEX_DEC, NULL, 0x00000002)
local CEMU_STATUS_F_RCEMU_ACTIVE = ProtoField.uint32("usb_simtrace.CEMU_STATUS.F_RCEMU_ACTIVE", "CEMU_ACTIVE", base.HEX_DEC, NULL, 0x00000004)
local CEMU_STATUS_F_CARD_INSERT = ProtoField.uint32("usb_simtrace.CEMU_STATUS.F_CARD_INSERT", "CARD_INSERT", base.HEX_DEC, NULL, 0x00000008)
local CEMU_STATUS_F_RESET_ACTIVE = ProtoField.uint32("usb_simtrace.CEMU_STATUS.F_RESET_ACTIVE", "RESET_ACTIVE", base.HEX_DEC, NULL, 0x00000010)
local modem_reset_types = {
[0x00] = "de-assert",
[0x01] = "assert",
[0x02] = "pulse"
}
local modem_reset_status = ProtoField.uint8("usb_simtrace.modem.reset_type", "modem reset type", base.HEX, modem_reset_types, 0xf)
local modem_reset_len = ProtoField.uint8("usb_simtrace.modem.reset_len", "modem reset length (ms)", base.DEC)
local modem_sim_select_types = {
[0x00] = "local",
[0x01] = "remote",
}
local hf_modem_sim_select = ProtoField.uint8("usb_simtrace.modem.sim_select", "SIM card selection", base.DEC, modem_sim_select_types, 0xff)
usb_simtrace_protocol.fields = {
msgtype, seqnr, slotnr, reserved, payloadlen, payload,
pb_and_rx, pb_and_tx, final, tpdu_hdr, rxtxdatalen, rxtxdata,
CEMU_STATUS_F_VCC_PRESENT, CEMU_STATUS_F_CLK_ACTIVE, CEMU_STATUS_F_RCEMU_ACTIVE, CEMU_STATUS_F_CARD_INSERT, CEMU_STATUS_F_RESET_ACTIVE,
modem_reset_status, modem_reset_len,
hf_pts_len, hf_pts_req, hf_pts_resp,
hf_cemu_cfg_features, hf_cemu_cfg_slot_mux_nr,
hf_cemu_cardinsert, hf_modem_sim_select,
msgtype, seqnr, slotnr, reserved, payloadlen, payload, pb_and_rx, pb_and_tx, final, tpdu_hdr, rxtxdatalen, rxtxdata
}
local is_hdr = Field.new("usb_simtrace.tpdu_hdr")
local is_pbrx = Field.new("usb_simtrace.pb_and_rx")
local is_pbtx = Field.new("usb_simtrace.pb_and_tx")
local is_final= Field.new("usb_simtrace.final")
function dissect_rxtx(payload_data,pinfo,tree)
local headerSubtree = tree:add(usb_simtrace_protocol, payload_data, "rx/tx data")
local len = payload_data(4,2):le_uint();
local cmd32 = payload_data(0,4):le_uint();
local len = payload_data(8+4,2):le_uint();
local cmd32 = payload_data(8+0,4):le_uint();
headerSubtree:add(pb_and_rx, cmd32)
headerSubtree:add(pb_and_tx, cmd32)
@@ -112,129 +57,9 @@ function dissect_rxtx(payload_data,pinfo,tree)
headerSubtree:add(tpdu_hdr, cmd32)
headerSubtree:add(rxtxdatalen, len)
headerSubtree:add_le(rxtxdata, payload_data(6,len))
local flagstr = " "
if is_pbrx().value == 1 then
flagstr = flagstr .. "R"
else
flagstr = flagstr .. "."
end
if is_pbtx().value == 1 then
flagstr = flagstr .. "T"
else
flagstr = flagstr .. "."
end
if is_final().value == 1 then
flagstr = flagstr .. "F"
else
flagstr = flagstr .. "."
end
if is_hdr().value == 1 then
flagstr = flagstr .. "H"
else
flagstr = flagstr .. "."
end
flagstr = flagstr .. " "
pinfo.cols.info:append(flagstr .. payload_data(6,len))
-- ghetto dissection does not work due to mixed in procedure bytes
--if pinfo.visited == false then
-- Dissector.get("iso7816"):call(payload_data(6):tvb(), pinfo, tree)
-- local offs = 0
-- if (is_pbrx().value == 1 or is_pbtx().value == 1) and is_final().value == 0 then
-- offs = 1
-- else
-- offs = 0
-- end
--
-- if is_hdr().value == 1 then
-- Dissector.get("gsm_sim"):call(concatss:tvb(), pinfo, tree)
-- concatss = payload_data(6):bytes()
-- else
-- concatss = concatss .. payload_data(6+offs):bytes()
-- end
--end
headerSubtree:add_le(rxtxdata, payload_data(8+6,len))
end
function dissect_status(payload_data,pinfo,tree)
local headerSubtree = tree:add(usb_simtrace_protocol, payload_data, "status message")
local cmd32 = payload_data(0,4):le_uint();
headerSubtree:add(CEMU_STATUS_F_VCC_PRESENT, cmd32)
headerSubtree:add(CEMU_STATUS_F_CLK_ACTIVE, cmd32)
headerSubtree:add(CEMU_STATUS_F_RCEMU_ACTIVE, cmd32)
headerSubtree:add(CEMU_STATUS_F_CARD_INSERT, cmd32)
headerSubtree:add(CEMU_STATUS_F_RESET_ACTIVE, cmd32)
pinfo.cols.info:append(" VCC:" .. payload_data(0,1):bitfield(7, 1) .. " CLK:" .. payload_data(0,1):bitfield(6, 1) .. " RESET:" .. payload_data(0,1):bitfield(3, 1))
end
function dissect_atr(payload_data,pinfo,tree)
local len = payload_data(0,1):le_uint()
Dissector.get("iso7816.atr"):call(payload_data(1):tvb(), pinfo, tree)
end
function dissect_modem_reset(payload_data,pinfo,tree)
local headerSubtree = tree:add(usb_simtrace_protocol, payload_data, "modem reset")
local cmd8 = payload_data(0,1):le_uint();
headerSubtree:add(modem_reset_status, cmd8)
pinfo.cols.info:append(" reset type:" .. modem_reset_types[cmd8]);
if(cmd8 == 2) then
local duration = payload_data(1,2):le_uint()
headerSubtree:add(modem_reset_len, duration)
pinfo.cols.info:append(" duration:" .. duration .. "ms")
end
end
function dissect_pts(payload_data, pinfo, tree)
local subtree = tree:add(usb_simtrace_protocol, payload_data, "PTS")
local pts_len = payload_data(0,1):le_uint()
local pts_req = payload_data(1, pts_len);
local pts_resp = payload_data(7, pts_len);
subtree:add(hf_pts_len, pts_len);
subtree:add(hf_pts_req, pts_req);
subtree:add(hf_pts_resp, pts_resp);
pinfo.cols.info:append(" Req: " .. pts_req .. ", Resp: " .. pts_resp);
end
function dissect_cemu_config(payload_data, pinfo, tree)
local subtree = tree:add(usb_simtrace_protocol, payload_data, "Card Emu Config")
subtree:add(hf_cemu_cfg_features, payload_data(0,4));
subtree:add(hf_cemu_cfg_slot_mux_nr, payload_data(4,1));
end
function dissect_modem_sim_sel(payload_data, pinfo, tree)
local subtree = tree:add(usb_simtrace_protocol, payload_data, "Modem SIM Select")
local sim_select = payload_data(0,1):le_uint();
subtree:add(hf_modem_sim_select, sim_select);
pinfo.cols.info:append(" " .. modem_sim_select_types[sim_select]);
end
function dissect_cemu_cardinsert(payload_data, pinfo, tree)
local subtree = tree:add(usb_simtrace_protocol, payload_data, "Card Insert")
local cins_type = payload_data(0,1):le_uint()
subtree:add(hf_cemu_cardinsert, cins_type);
pinfo.cols.info:append(" " .. card_insert_types[cins_type]);
end
function usb_simtrace_protocol.dissector(buffer, pinfo, tree)
length = buffer:len()
if length == 0 then return end
@@ -251,21 +76,7 @@ function usb_simtrace_protocol.dissector(buffer, pinfo, tree)
pinfo.cols.info = string.format("Cmd 0x%04X : %s", command, control_commands[command])
local payload_data = buffer(8,length-8)
if(command == 0x0101 or command == 0x0106) then
return dissect_rxtx(payload_data(),pinfo,subtree)
elseif(command == 0x0104) then
return dissect_status(payload_data(),pinfo,subtree)
elseif(command == 0x0102) then
return dissect_atr(payload_data(),pinfo,subtree)
elseif(command == 0x0105) then
return dissect_cemu_cardinsert(payload_data(),pinfo,subtree)
elseif(command == 0x0107) then
return dissect_pts(payload_data(),pinfo,subtree)
elseif(command == 0x0108) then
return dissect_cemu_config(payload_data(),pinfo,subtree)
elseif(command == 0x0201) then
return dissect_modem_reset(payload_data(),pinfo,subtree)
elseif(command == 0x0202) then
return dissect_modem_sim_sel(payload_data(),pinfo,subtree)
return dissect_rxtx(buffer(),pinfo,subtree)
else
subtree:add(payload, payload_data)
end
@@ -274,13 +85,8 @@ end
function usb_simtrace_protocol.init()
local usb_product_dissectors = DissectorTable.get("usb.product")
usb_product_dissectors:add(0x1d50616d, usb_simtrace_protocol) -- OCTSIMTEST
usb_product_dissectors:add(0x1d50616e, usb_simtrace_protocol) -- NGFF_CARDEM
usb_product_dissectors:add(0x1d5060e3, usb_simtrace_protocol) -- SIMTRACE2
usb_product_dissectors:add(0x1d504004, usb_simtrace_protocol) -- QMOD
usb_product_dissectors:add(0x1d504001, usb_simtrace_protocol) -- OWHW
DissectorTable.get("usb.device"):add_for_decode_as(usb_simtrace_protocol)
DissectorTable.get("usb.bulk"):add(0xffff, usb_simtrace_protocol)
DissectorTable.get("usb.interrupt"):add(0xffff, usb_simtrace_protocol)
local usb_product_dissectors = DissectorTable.get("usb.product")
usb_product_dissectors:add(0x1d50616d, usb_simtrace_protocol)
usb_product_dissectors:add(0x1d50616e, usb_simtrace_protocol)
DissectorTable.get("usb.bulk"):add(0xffff, usb_simtrace_protocol)
end

207
debian/changelog vendored
View File

@@ -1,211 +1,8 @@
simtrace2 (0.8.1) unstable; urgency=medium
simtrace2 (0.5.2) UNRELEASED; urgency=medium
* host/contrib/simtrace2.spec.in: fix soname
-- Oliver Smith <osmith@sysmocom.de> Fri, 10 Dec 2021 10:04:28 +0100
simtrace2 (0.8.0) unstable; urgency=medium
[ Harald Welte ]
* adapt to host tools in autotools
* simtrace2_api: Remove dead code
* fix baudrate of 'make log'
* qmod DFU: Don't overwrite memory beyond end of usb_strings[]
* usb_strings.txt: s/SIMtrace Phone/SIMtrace Card Emulation/
* Patch actual board name into the USB iProduct string descriptor
* Build only 'reasonable' combinations of APP/MEMORY
* stdio: Add support for %p format string (pointer address)
* Fix format string related warnings (int vs. long)
* Add missing CR to achieve CRLF at end of log lines
* more comments in host_communication.c.
* usb_buf: count number of elements in queue
* usb_buf: Limit the maximum queue length to 3 elements
* qmod: Don't print EEPROM operations in help when not supported
* cosmetic: board_qmod: Annotate #endif with comments
* qmod: Document '!' and '@' commands on UART
* implement minimalistic talloc_report(); add 't' command on UART
* update copyright statement
* cardem: Fix memory leak on unsupported SIMTRACE_MSGT_DT_CEMU_CARDINSERT
* usb_buf: Actually limit queue to 3 elements, not 4
* USBD_HAL: Don't disable UDP peripheral clock on suspend
* usb_buf: Properly initialize buffered_endpoint->ep number
* pseudo_talloc: Increment number of buffers from 10 to 20
* card_emu: Factor out card_handle_reset() from card_emu_init()
* cardem: Move card_emu_io_statechg() calls out of interrupt context
* cardem: RST resets all state (including release of buffers)
* host_communication: Send zero-length-packet on wMaxPacketSize
* card_emu: Initialize PTSS state every time we start PTS
* card_emu: Avoid recursive calls to card_set_state()
* card_emu: Always print state names in string representation
* card_emu: Remove extraneous code
* card_emu: Remove extraneous initialization of ch->pts.state
* cardem: Make card_emu_report_status() optionally use IRQ endpoint
* cardem: Add SIMTRACE_MSGT_BD_CEMU_CONFIG
* cardem: Implement support for CEMU_FEAT_F_STATUS_IRQ
* simtrace2-sniff: Reformat value_string to pass our validation scripts
* firmware: Reformat value_string to pass our validation scripts
* jenkins.sh: Add verify_value_string_arrays_are_terminated.py
* [lib] apdu_dispatch: Use DLGLOBAL and don't printf() directly
* [lib] apdu_dispatch: Don't print APDU state to stdout
* OSMO_ASSERT() on double-free or invalid pointer
* Update .gitignore file for host
* migrate to libosmousb
* library: Add osmo_st2_compatible_dev_idsp[]
* firmware: move printing of welcome banner to common function print_banner()
* firmware: apps/cardem/main.c: Synchronize with apps/trace/main.c
* host: Add COPYING file for host software (GPLv2)
* host/lib/gsmtap.c: Add GPLv2 disclaimer
* increase ringbuffer size from 512 to 1024 bytes
* simtrace2_api: Add osmo_st2_cardem_request_config()
* Disable interrupts during EEFC_ReadUniqueID()
* cardem: Fix infinite loop + watchdog reset on long OUT message
* extend osmo_st2_cardem_inst with fields required by osmo-remsim
* cosmetic: Add missing CR to LF in dispatch_received_usb_msg()
* USBD.c: Don't reset EP0 on SetConfiguration(0)
* pio_it.c: Permit repeated calls to PIO_ConfigureIt()
* simtrace2_siff: getopt_long() returns int, not char
* Introduce support for asynchronous USB transmission
* firmware: fix builds with gcc stack smashing protection enabled
* dfu: Shrink code by 144 bytes (by not calling PIO_InitializeInterrupts)
* dfu: Save another 60 bytes by changing the way we print horizontal lines
* migrate from BSC_FD_* to OSMO_FD_*
* remove usb2udp
* rename simtrace2-remsim to simtrace2-cardem-pcsc
* Update README
* remove old pre-autoconf makefile
* simtrace2-cardem-pcsc: Make it work again
* Revert "add ISO 7816-3 library to remsim project"
* Revert "add library providing ISO 7816-3 utilities"
* card_emu: waiting_time is stored in etu, not clocks.
* card_emu: Rename fi to Fi and di to Di
* card_emu: Clarify and differentiate F/Fi/F_index/Fi_index
* iso7816_fidi: Add iso7816_3_ prefix to symbols; fix terminology
* card_emu: improve reset detection conditions
* card_emu: explicitly initialize PTS and TPDU states
* card_emu: Use USART timeout for waiting time
* card_emu: Fix USART timer, particularly in re-start situations
* card_emu: Fix computation of waiting time
* contrib/jenkins.sh: Switch from rita -> ftp.osmocom.org
* st2-cardem-pcsc: Fix goto-in-while mess
* st2-cardem-pcsc: Use ATR of real card by default
* simtrace board.h: Enable HAVE_CARDEM if we build the cardem firmware
* jenkins.sh: build 'cardem' firmware also for simtrace board
* Revert "cardem: disable upload for simtrace2"
* simtrace2-cardem-pcsc: Decode STATUS flags to strings
* simtrace2-cardem-pcsc: Reset the real card if reader resets cardem
* assert: Use printf_sync() to ensure printing of assert / panic
* Add usb product ID of sysmoOCTSIMTEST
* octsimtest: remove lots of unused #defines
* octsimtest: most code for support of this new board
* octsimtest: Switch direction of I/O level shifter depending on uart tx / rx
* cardem-pcsc: initialize libosmocore logging
* octsimtest: Adjust VCC voltage thresholds (resistive VCC divider)
* contrib/jenkins.sh: Build 'cardem' app for 'octsimtest' board
* firmware: octsimtest: Fix IO_DIR pin definition
* firmware: octsimtest: Make slot mux configurable via USB
* firmware: octsimtest: mcp23017 initializaiton
* firmware: cardem: re-factor CARDINSERT command processing
* firmware: octsimtest: Support SIMTRACE_MSGT_DT_CEMU_CARDINSERT
* firmware: octsimtest: use TRACE_* macros instead of direct printf
* firmware: octsimtest: Fix disabling the card_insert signal
* firmware: octsimtest: Add i/I command for setting card-insert via I2C GPIO
* firmware: octsimtest: ensure all card_insert GPIO are 0 after reset
* don't printf() directly from library code, go via libosmocore logging
* simtrace2-list: Use osmo_st2_compatible_dev_ids[]
* board_gpio.gnumeric: Add ngff-cardem pin-out
* 99-simtrace2.rules: Add OCTSIMTEST
* contrib/flash.py: Add OCTSIMTEST support
* Introduce simtrace2-tool
* introduce support for new ngff_cardem board
* simtrace2.spec: Add simtrace2-tool binary to package
* contrib/jenkins.sh: Build APP=cardem for BOARD=ngff_cardem
* jenkins.sh: Build 'trace' firmware for ngff_cardem
* Use osmo_libusb_{init,exit}() instead of libusb_{init,exit}()
* simtrace2-cardem-pcsc: Remove double libusb initialization
* simtrace2-tool: Initialize logging to avoid error on first log output
* cardem-pcsc: Fix return of uninitialized variable
* host: Upgrade libosmocore dependency to 1.4.0
[ Kévin Redon ]
* minor: fix spacing
* minor: updated copyright years
* dfu: minor: make debug output only verbose in info level
* minor: move USB debug output from info to debug level
* minor: improve debug output
* minor : fix typo in comment
* better detect VCC and nRST changes on simtrace2 board
* minor: ignore usbstring binary
* simtrace2-remsim: Use simplest ATR
* cardem: use simplest ATR as default ATR
* minor: fix typo
* DFU: increase USB reset duration to 50 ms
* DFU: restart bootloader when USB conf failed
* Makefile: add linker option showing memory usage
* improve shared bootloader/application memory
* minor: improve trace output
* DFU: add DFU application
* add script to flash latest firmware
* minor: use same LED pattern for cardem as other applications
* cardem: currently simtrace does not support cardem
* add library providing ISO 7816-3 utilities
* add ISO 7816-3 library to remsim project
* rename PIN_PHONE_{CLK,IO} to PIN_USIM1_{CLK,IO}
* minor add comments
* make sim switch board specific
[ Eric Wild ]
* remsim: allow selecting pcsc reader number
* cardem: disable upload for simtrace2
* firmware: do not allow undefined symbols
* firmware: allow verbose builds
* cardem: choose a more reasonable default ATR
* contrib: add a basic simtrace lua dissector for wireshark
* cardem: free the buf
* cardemu: support 1v8 for the tester
* firmware: data sections
* firmware: proper makefile deps
* firmware: make the ngff beakout blink
* simtrace2-cardem: use local sim on exit
* contrib: more cardem dissection
* firmware: trace for ngff
* cardem: fix spurious NULL bytes during transfers
* contrib/jenkins.sh: build ngff_Cardem dfu bootloader
* contrib: allow manually forcing bulk simtrace dissection
* contrib/jenkins.sh: lower trace to make bl fit
* Revert "firmware: data sections"
* add the ngff cardem to default build targets
* drop unused exidx sections when linking
* clang build support
* fix bootloader led config crash
* firmware: add bootloader update "app"
* firmware: remove usb pullup that dates back to simtrace1
* firmware: increase reset delay before usb reattach
* firmware: drop cref printing
* add our default clang-format file
* firmware: add missing usb strings to blupdate that prevented building it
* jenkins: build bootloader updater
* firmware: remove dfu-dfu default target
[ Oliver Smith ]
* contrib: import RPM spec
* contrib: integrate RPM spec
* d/source/format: new file
* firmware/Makefile: fix UNKNOWN in OBS packages
* host: use git-version-gen/tarball-v. from topdir
* gitignore: add firmware/apps/*/usb_strings.txt.patched
* firmware: create duplicate files for upload only
* contrib/prepare_upload.sh: fix cd problems
* firmware: qmod-dfu: disable stack protector
* firmware: disable stack protector by default
* gitreview: new file
[ Leonard Hübner ]
* remsim: adding cli argument to set the atr
[ Eric ]
* dfu: let the device reset itself
-- Harald Welte <laforge@osmocom.org> Thu, 09 Dec 2021 08:12:56 +0100
-- Harald Welte <lafore@gnumonks.org> Thu, 28 Nov 2019 00:44:57 +0100
simtrace2 (0.5.1) unstable; urgency=medium

2
debian/compat vendored
View File

@@ -1 +1 @@
10
9

30
debian/control vendored
View File

@@ -1,8 +1,8 @@
Source: simtrace2
Maintainer: Osmocom team <openbsc@lists.osmocom.org>
Maintainer: Harald Welte <laforge@gnumonks.org>
Section: devel
Priority: optional
Build-Depends: debhelper (>= 10),
Build-Depends: debhelper (>= 9),
autotools-dev,
autoconf,
automake,
@@ -10,34 +10,22 @@ Build-Depends: debhelper (>= 10),
pkg-config,
git,
dh-autoreconf,
libosmocore-dev (>= 1.4.0),
libosmocore-dev,
libpcsclite-dev,
libnewlib-arm-none-eabi,
libusb-1.0-0-dev,
gcc-arm-none-eabi
libusb-1.0-0-dev
Standards-Version: 3.9.8
Vcs-Git: https://gitea.osmocom.org/sim-card/simtrace2
Vcs-Browser: https://gitea.osmocom.org/sim-card/simtrace2
Vcs-Git: git://git.osmocom.org/simtrace2.git
Vcs-Browser: http://git.osmocom.org/simtrace2/
Homepage: http://osmocom.org/projects/simtrace2/wiki
Package: simtrace2-firmware
Section: devel
Architecture: all
Recommends: dfu-util
Description: Firmware for SAM3 based SIMtrace2 USB Devices.
Open Source firmware for the Cortex-M3 microcontroller in the
"Osmocom SIMtrace2" USB-attached peripheral device. Will only work in
SAM3S-based SIMtrace2, not in its SAM7S-based predecessor SIMtrace!
Package: simtrace2-utils
Section: devel
Architecture: any
Multi-Arch: same
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmo-simtrace2-1
Recommends: simtrace2-firmware
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmo-simtrace2-0
Description: Host utilities to communicate with SIMtrace2 USB Devices.
Package: libosmo-simtrace2-1
Package: libosmo-simtrace2-0
Section: libs
Architecture: any
Multi-Arch: same
@@ -52,7 +40,7 @@ Package: libosmo-simtrace2-dev
Section: libdevel
Architecture: any
Multi-Arch: same
Depends: libosmo-simtrace2-1, ${misc:Depends}
Depends: libosmo-simtrace2-0, ${misc:Depends}
Description: Development headers for Osmocom SIMtrace2 library
This library contains core "driver" functionality to interface with the
Osmocom SIMtrace2 (and compatible) USB device firmware. It enables

11
debian/rules vendored
View File

@@ -13,4 +13,13 @@ export DEB_LDFLAGS_MAINT_STRIP = -Wl,-Bsymbolic-functions
%:
dh $@ --no-parallel
dh $@
override_dh_autoreconf:
cd host && dh_autoreconf
override_dh_auto_build:
dh_auto_build -- utils
override_dh_auto_install:
dh_auto_build -- -C host

View File

@@ -1 +0,0 @@
usr/share/simtrace2/*.bin

View File

@@ -29,13 +29,6 @@
# Makefile for compiling the Getting Started with SAM3S Microcontrollers project
GIT_VERSION=$(shell $(TOP)/git-version-gen $(TOP)/.tarball-version)
CFLAGS = \
-Werror=format-security \
-Wformat \
-g \
$(NULL)
#-------------------------------------------------------------------------------
# User-modifiable options
#-------------------------------------------------------------------------------
@@ -56,7 +49,7 @@ APP ?= dfu
# Defines which are the available memory targets for the SAM3S-EK board.
ifeq ($(APP), dfu)
MEMORIES ?= flash
MEMORIES ?= flash dfu
TRACE_LEVEL ?= 0
else
MEMORIES ?= dfu
@@ -124,7 +117,7 @@ C_LIBUSB = USBDescriptors.c USBRequests.c USBD.c USBDCallbacks.c USBDDriver.
C_LIBUSB_RT = dfu.c dfu_runtime.c
C_LIBUSB_DFU = dfu.c dfu_desc.c dfu_driver.c
C_LIBCOMMON = string.c stdio.c fputs.c usb_buf.c ringbuffer.c pseudo_talloc.c host_communication.c \
main_common.c stack_check.c crcstub.c
main_common.c stack_check.c
C_BOARD = $(notdir $(wildcard libboard/common/source/*.c))
C_BOARD += $(notdir $(wildcard libboard/$(BOARD)/source/*.c))
@@ -236,15 +229,12 @@ $(BIN)/$(BOARD)-dfu-flash-padded.bin: $(BIN)/$(BOARD)-dfu-flash.bin
$(OUTPUT)-combined.bin: $(BIN)/$(BOARD)-dfu-flash-padded.bin $(OUTPUT)-dfu.bin
cat $^ > $@
$(BIN) $(OBJ): apps/$(APP)/usb_strings_generated.h misc/crctool
$(BIN) $(OBJ): apps/$(APP)/usb_strings_generated.h
mkdir -p $@
usbstring/usbstring: usbstring/usbstring.c
gcc $^ -o $@
misc/crctool: misc/crctool.c
gcc $^ -o $@
.PHONY: apps/$(APP)/usb_strings.txt.patched
apps/$(APP)/usb_strings.txt.patched: apps/$(APP)/usb_strings.txt
sed "s/PRODUCT_STRING/$(shell cat libboard/$(BOARD)/product_string.txt)/" $< > $@
@@ -261,6 +251,7 @@ build_$(1): $$(ASM_OBJECTS_$(1)) $$(C_OBJECTS_$(1)) $$(EXTRA_OBJECTS_$(1))
$(SILENT)$(CC) $(CFLAGS) $(LDFLAGS) $(LD_OPTIONAL) -T"libboard/common/resources/$(CHIP)/$(1).ld" -Wl,-Map,$(OUTPUT)-$(1).map -o $(OUTPUT)-$(1).elf $$^ $(LIBS)
$(SILENT)$(NM) $(OUTPUT)-$(1).elf >$(OUTPUT)-$(1).elf.txt
$(SILENT)$(OBJCOPY) -O binary $(OUTPUT)-$(1).elf $(OUTPUT)-$(1).bin
$(SILENT)$(SIZE) $$^ $(OUTPUT)-$(1).elf
$$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile $(OBJ) $(BIN)
@echo [COMPILING $$<]
@@ -270,17 +261,26 @@ $$(ASM_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.S Makefile $(OBJ) $(BIN)
@echo [ASSEMBLING $$@]
$(SILENT)$(CC) $(ASFLAGS) -DENVIRONMENT_$(1) -DENVIRONMENT=\"$(1)\" -c -o $$@ $$<
debug_$(1): $(1)
$(GDB) -x "$(BOARD_LIB)/resources/gcc/$(BOARD)_$(1).gdb" -ex "reset" -readnow -se $(OUTPUT)-$(1).elf
endef
ALL_MEMORIES = flash ram
ALL_MEMORIES = dfu flash ram
$(foreach MEMORY, $(ALL_MEMORIES), $(eval $(call RULES,$(MEMORY))))
# files with those names do exist..
.PHONY: dfu
dfu: $(OUTPUT)-dfu.bin
.PHONY: ram
ram: build_ram
.PHONY: dfu
.PHONY: flash
ram: build_ram
dfu: build_dfu
ifeq ($(APP), blupdate)
$(info updating updater section with padded bootloader file..)
$(SILENT)dd if=/dev/zero bs=16384 count=1 of=$(BIN)/$(BOARD)-dfu-flash-padded.bin
$(SILENT)dd if=$(BIN)/$(BOARD)-dfu-flash.bin conv=notrunc of=$(BIN)/$(BOARD)-dfu-flash-padded.bin
$(SILENT)$(OBJCOPY) --update-section .blupdate=bin/$(BOARD)-dfu-flash-padded.bin bin/$(BOARD)-blupdate-dfu.elf
$(SILENT)$(OBJCOPY) -O binary bin/$(BOARD)-blupdate-dfu.elf bin/$(BOARD)-blupdate-dfu.bin
endif
flash: build_flash
#alternate way of embedding: obj file
#ifeq ($(APP), dfu)
@@ -288,37 +288,8 @@ flash: build_flash
# $(SILENT)$(OBJCOPY) --rename-section .data=.fwupdate -I binary -O elf32-littlearm bin/$(BOARD)-dfu-flash.bin $(OBJ)/flash_fwupdate.o
#endif
C_OBJECTS_dfu = $(addprefix $(OBJ)/dfu_, $(C_OBJECTS))
ASM_OBJECTS_dfu = $(addprefix $(OBJ)/dfu_, $(ASM_OBJECTS))
EXTRA_OBJECTS_dfu = $(addprefix $(OBJ)/dfu_, $(EXTRA_OBJECTS))
$(OUTPUT)-dfu.bin: $(OUTPUT)-dfu_nocrcstub.bin
$(info updating app with crc..)
$(SILENT)cp $< $@.temp
$(SILENT)misc/crctool 512 $@.temp
$(SILENT)mv $@.temp $@
$(OUTPUT)-dfu_nocrcstub.bin: $(OUTPUT)-dfu_nocrcstub.elf
ifeq ($(APP), blupdate)
$(info updating updater section with padded bootloader file..)
$(SILENT)dd status=none if=/dev/zero bs=16384 count=1 of=$(BIN)/$(BOARD)-dfu-flash-padded.bin
$(SILENT)dd status=none if=$(BIN)/$(BOARD)-dfu-flash.bin conv=notrunc of=$(BIN)/$(BOARD)-dfu-flash-padded.bin
$(SILENT)$(OBJCOPY) --update-section .blupdate=bin/$(BOARD)-dfu-flash-padded.bin $<
endif
$(SILENT)$(OBJCOPY) -O binary $< $@
$(OUTPUT)-dfu_nocrcstub.elf: $(ASM_OBJECTS_dfu) $(C_OBJECTS_dfu) $(EXTRA_OBJECTS_dfu)
$(SILENT)$(CC) $(CFLAGS) $(LDFLAGS) $(LD_OPTIONAL) -T"libboard/common/resources/$(CHIP)/dfu.ld" -Wl,-Map,$(OUTPUT)-dfu_nocrcstub.map -o $@ $^ $(LIBS)
$(SILENT)$(NM) $@ >$@.txt
$(C_OBJECTS_dfu): $(OBJ)/dfu_%.o: %.c Makefile $(OBJ) $(BIN)
@echo [COMPILING $<]
$(SILENT)$(CC) $(CFLAGS) -DENVIRONMENT_dfu -DENVIRONMENT=\"dfu\" -c -o $@ $<
$(ASM_OBJECTS_dfu): $(OBJ)/dfu_%.o: %.S Makefile $(OBJ) $(BIN)
@echo [ASSEMBLING $@]
$(SILENT)$(CC) $(ASFLAGS) -DENVIRONMENT_dfu -DENVIRONMENT=\"dfu\" -c -o$@ $<
program:
openocd -f openocd/openocd.cfg -c "init" -c "halt" -c "flash write_bank 0 ./bin/project-flash.bin 0" -c "reset" -c "shutdown"
SERIAL ?= /dev/ttyUSB0
log:

View File

@@ -12,6 +12,10 @@
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "board.h"
#include "core_cm3.h"
@@ -89,14 +93,8 @@ __attribute__((section(".ramfunc"), noinline, noreturn)) static void erase_first
flash_cmd(EFC_FCMD_EA, 0);
#endif
flash_wait_ready();
for (;;) {
/* no functon call, since NVIC_SystemReset() might not be inlined! */
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk);
__DSB();
while (1)
;
}
for (;;)
NVIC_SystemReset();
}
#define MAX_USB_ITER BOARD_MCK / 72 // This should be around a second

View File

@@ -12,6 +12,10 @@
* 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
*/
/*------------------------------------------------------------------------------
* Headers
@@ -155,7 +159,7 @@ extern int main(void)
WDT_Enable(WDT, WDT_MR_WDRSTEN | WDT_MR_WDDBGHLT | WDT_MR_WDIDLEHLT |
(WDT_GetPeriod(2000) << 16) | WDT_GetPeriod(2000));
PIO_InitializeInterrupts(10);
PIO_InitializeInterrupts(0);
print_banner();
board_main_top();
@@ -194,8 +198,8 @@ extern int main(void)
WDT_Restart(WDT);
#if TRACE_LEVEL >= TRACE_LEVEL_DEBUG
const char rotor[] = { '-', '\\', '|', '/' };
putchar(rotor[i++ % ARRAY_SIZE(rotor)]);
putchar('\b');
putchar(rotor[i++ % ARRAY_SIZE(rotor)]);
#endif
check_exec_dbg_cmd();
osmo_timers_prepare();
@@ -206,10 +210,6 @@ extern int main(void)
if (isUsbConnected) {
isUsbConnected = 0;
}
/* HACK: we don't really deal with USB disconnect yet,
* so let's just reset the entire uC if this happens */
TRACE_INFO("Resetting uC on USB disconnect\n\r");
NVIC_SystemReset();
} else if (isUsbConnected == 0) {
TRACE_INFO("USB is now configured\n\r");

View File

@@ -12,6 +12,10 @@
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "board.h"
#include "utils.h"

View File

@@ -12,6 +12,10 @@
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/*------------------------------------------------------------------------------
* Headers

View File

@@ -11,6 +11,10 @@
* 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
*/
/*------------------------------------------------------------------------------
* Headers

View File

@@ -15,7 +15,7 @@
/* Define attribute */
#if defined ( __CC_ARM ) /* Keil µVision 4 */
#if defined ( __CC_ARM ) /* Keil µVision 4 */
#define WEAK __attribute__ ((weak))
#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
#define WEAK __weak

View File

@@ -1672,10 +1672,6 @@ uint8_t USBD_HAL_Halt(uint8_t bEndpoint, uint8_t ctl)
UDP->UDP_RST_EP |= 1 << bEndpoint;
UDP->UDP_RST_EP &= ~(1 << bEndpoint);
}
/* This fixes a weird bug with regard to ping-pong OUT endpoints */
UDP->UDP_RST_EP |= 1 << bEndpoint;
UDP->UDP_RST_EP &= ~(1 << bEndpoint);
}
/* Return Halt status */

View File

@@ -14,6 +14,10 @@
* 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 <unistd.h>

View File

@@ -15,6 +15,10 @@
* 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 <board.h>

View File

@@ -63,7 +63,7 @@
*------------------------------------------------------------------------------*/
/* Define attribute */
#if defined ( __CC_ARM ) /* Keil µVision 4 */
#if defined ( __CC_ARM ) /* Keil µVision 4 */
#define WEAK __attribute__ ((weak))
#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
#define WEAK __weak

View File

@@ -296,7 +296,7 @@ typedef uint32_t (*USBDescriptorParseFunction)(void *descriptor, void *parseArg)
*/
#pragma pack(1)
#if defined ( __CC_ARM ) /* Keil µVision 4 */
#if defined ( __CC_ARM ) /* Keil µVision 4 */
#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
#define __attribute__(...)
#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */

View File

@@ -12,6 +12,10 @@
* 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
*/
#ifndef _BOARD_
#define _BOARD_

View File

@@ -7,6 +7,10 @@
* 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
*/
#pragma once

View File

@@ -7,6 +7,10 @@
* 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
*/
#pragma once

View File

@@ -7,6 +7,10 @@
* 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
*/
#ifndef _MANIFEST_H
#define _MANIFEST_H

View File

@@ -7,6 +7,10 @@
* 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
*/
#pragma once

View File

@@ -39,8 +39,7 @@ SEARCH_DIR(.)
MEMORY
{
/* reserve the first 16k (= 0x4000) for the DFU bootloader */
crcstub (rx) : ORIGIN = 0x00400000 + 16K, LENGTH = 512 /* crcstub part */
rom (rx) : ORIGIN = 0x00400000 + 16K + 512, LENGTH = 256K - 16K - 512 /* flash, 256K */
rom (rx) : ORIGIN = 0x00400000 + 16K, LENGTH = 256K - 16K /* flash, 256K */
/* note: dfudata will be at the start */
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K /* SRAM, 48K */
}
@@ -48,17 +47,9 @@ MEMORY
/* Section Definitions */
SECTIONS
{
.crcstub :
{
.text :
{
. = ALIGN(4);
KEEP(*(.crcstub_table))
KEEP(*(.crcstub_code))
} > crcstub = 0xff
.text :
{
. = ALIGN(512);
_sfixed = .;
KEEP(*(.vectors .vectors.*))
*(.text .text.* .gnu.linkonce.t.*)
@@ -103,7 +94,7 @@ SECTIONS
. = ALIGN(4);
_efixed = .; /* End of text section */
} > rom = 0xff
} > rom
/DISCARD/ :
{

View File

@@ -97,8 +97,6 @@ SECTIONS
/DISCARD/ :
{
*(.ARM.exidx)
*(.crcstub_table)
*(.crcstub_code)
}
. = ALIGN(4);

View File

@@ -147,7 +147,7 @@ extern WEAK void LowLevelInit( void )
}
*/
#ifndef BOARD_MAINOSC_BYPASS
#ifndef qmod
/* Initialize main oscillator */
if ( !(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) )
{
@@ -165,11 +165,11 @@ extern WEAK void LowLevelInit( void )
timeout = 0;
while (!(PMC->PMC_SR & PMC_SR_MOSCSELS) && (timeout++ < CLOCK_TIMEOUT));
#else
/* Board has external clock, not a crystal oscillator */
/* QMOD has external 12MHz clock source */
PIOB->PIO_PDR = (1 << 9);
PIOB->PIO_PUDR = (1 << 9);
PIOB->PIO_PPDDR = (1 << 9);
PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTBY | CKGR_MOR_MOSCSEL;
PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTBY| CKGR_MOR_MOSCSEL;
#endif
/* disable the red LED after main clock initialization */

View File

@@ -7,6 +7,10 @@
* 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 "board.h"
#include "boardver_adc.h"

View File

@@ -12,6 +12,10 @@
* 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>
#include <string.h>

View File

@@ -7,6 +7,10 @@
* 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 "manifest.h"

View File

@@ -100,7 +100,6 @@ extern void UART_Configure( uint32_t baudrate, uint32_t masterClock)
/* Enable TX interrupts */
pUart->UART_IER = UART_IER_TXRDY;
NVIC_SetPriority(CONSOLE_IRQ, 15); /* lowest priority */
NVIC_EnableIRQ(CONSOLE_IRQ);
/* Enable receiver and transmitter */

View File

@@ -11,6 +11,10 @@
* 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
*/
#pragma once
#include "board_common.h"

View File

@@ -11,6 +11,10 @@
* 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
*/
#pragma once

View File

@@ -9,6 +9,10 @@
* 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
*/
#pragma once

View File

@@ -9,6 +9,10 @@
* 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
*/
#pragma once

View File

@@ -11,6 +11,10 @@
* 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 "board.h"
#include "simtrace.h"

View File

@@ -11,6 +11,10 @@
* 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 <osmocom/core/timer.h>
#include "board.h"

View File

@@ -11,6 +11,10 @@
* 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 "board.h"
#include "trace.h"

View File

@@ -9,6 +9,10 @@
* 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
*/
/* Depending on the board this is running on, it might be possible
* for the controller to read the status of the WWAN LED output lines of

View File

@@ -9,6 +9,10 @@
* 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
*/
/* Depending on the board this is running on, it might be possible
* for the controller to set the status of the PERST input line of

View File

@@ -11,6 +11,10 @@
* 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
*/
#pragma once
#include "board_common.h"

View File

@@ -9,6 +9,10 @@
* 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
*/
#pragma once

View File

@@ -9,6 +9,10 @@
* 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
*/
#pragma once

View File

@@ -12,6 +12,10 @@
* 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 <stdbool.h>
#include "board.h"

View File

@@ -9,6 +9,10 @@
* 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 "board.h"
#include <stdbool.h>

View File

@@ -11,6 +11,10 @@
* 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 "board.h"

View File

@@ -11,6 +11,10 @@
* 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 "board.h"
#include "trace.h"

View File

@@ -12,6 +12,10 @@
* 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
*/
#pragma once
#include "board_common.h"

View File

@@ -12,6 +12,10 @@
* 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 "chip.h"

View File

@@ -11,6 +11,10 @@
* 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 "board.h"
#include "trace.h"

View File

@@ -11,6 +11,10 @@
* 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
*/
#pragma once
#include "board_common.h"
@@ -25,8 +29,6 @@
#define BOARD_MAINOSC 12000000
/** desired main clock frequency (in Hz, based on BOARD_MAINOSC) */
#define BOARD_MCK 58000000 // 18.432 * 29 / 6
/** board has external clock, not crystal */
#define BOARD_MAINOSC_BYPASS
/** MCU pin connected to red LED */
#define PIO_LED_RED PIO_PA17
@@ -37,7 +39,7 @@
/** green LED pin definition */
#define PIN_LED_GREEN {PIO_LED_GREEN, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
/** LEDs pin definition */
#define PINS_LEDS PIN_LED_RED, PIN_LED_GREEN
#define PINS_LEDS PIN_LED_RED, PIN_LED_GREEN
/** index for red LED in LEDs pin definition array */
#define LED_NUM_RED 0
/** index for green LED in LEDs pin definition array */

View File

@@ -11,6 +11,10 @@
* 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
*/
#pragma once

View File

@@ -9,6 +9,10 @@
* 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
*/
#pragma once

View File

@@ -9,6 +9,10 @@
* 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
*/
#pragma once

View File

@@ -9,6 +9,10 @@
* 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
*/
#pragma once

View File

@@ -12,6 +12,10 @@
* 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 "board.h"
#include "simtrace.h"

View File

@@ -11,6 +11,10 @@
* 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 <osmocom/core/timer.h>
#include "board.h"

View File

@@ -9,6 +9,10 @@
* 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 "board.h"
#include <stdbool.h>

View File

@@ -11,6 +11,10 @@
* 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 "board.h"
#include "trace.h"

View File

@@ -9,6 +9,10 @@
* 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
*/
/* Depending on the board this is running on, it might be possible
* for the controller to read the status of the WWAN LED output lines of

View File

@@ -9,6 +9,10 @@
* 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
*/
/* Depending on the board this is running on, it might be possible
* for the controller to set the status of the PERST input line of

View File

@@ -11,6 +11,10 @@
* 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
*/
#pragma once
#include "board_common.h"

View File

@@ -12,6 +12,10 @@
* 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 "board.h"
#include "simtrace.h"

View File

@@ -12,6 +12,10 @@
* 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
*/
#pragma once
#include "board_common.h"

View File

@@ -12,6 +12,10 @@
* 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 "board.h"
#include "simtrace.h"

View File

@@ -12,6 +12,10 @@
* 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 "board.h"
#include "trace.h"

View File

@@ -12,6 +12,10 @@
* 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
*/
#pragma once
@@ -69,8 +73,6 @@ void card_emu_uart_enable(uint8_t uart_chan, uint8_t rxtx);
void card_emu_uart_wait_tx_idle(uint8_t uart_chan);
void card_emu_uart_interrupt(uint8_t uart_chan);
int card_emu_get_vcc(uint8_t uart_chan);
struct cardemu_usb_msg_config;
int card_emu_set_config(struct card_handle *ch, const struct cardemu_usb_msg_config *scfg,
unsigned int scfg_len);

View File

@@ -175,11 +175,11 @@ typedef struct
{
/// Number of seconds. If 00h then CCID default value is used.
unsigned char bTimeOut;
/// Several parameters for the PIN format options (defined in § 6.1.11.4)
/// Several parameters for the PIN format options (defined in § 6.1.11.4)
unsigned char bmFormatString4;
/// Define the length of the PIN to present in the APDU command
unsigned char bmPINBlockString;
/// Allows the length PIN insertion in the APDU command (defined in § 6.1.11.6)
/// Allows the length PIN insertion in the APDU command (defined in § 6.1.11.6)
unsigned char bmPinLengthFormat;
/// Insertion position offset in byte for the current PIN
unsigned char bInsertionOffsetOld;
@@ -218,13 +218,13 @@ typedef struct
/// Protocol Data Structure for Protocol T=0 (bProtocolNum=0, dwLength=00000005h)
typedef struct
{
/// B7-4 - FI - Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
/// B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
/// clock rate conversion factor
/// B3-0 - DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
/// B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
/// baud rate conversion factor
unsigned char bmFindexDindex;
/// For T=0 ,B0 - 0b, B7-2 - 000000b
/// B1 - Convention used (b1=0 for direct, b1=1 for inverse)
/// For T=0 ,B0 0b, B7-2 000000b
/// B1 Convention used (b1=0 for direct, b1=1 for inverse)
unsigned char bmTCCKST0; // 0 to 2
/// Extra Guardtime between two characters. Add 0 to 254 etu to the normal
/// guardtime of 12etu. FFh is the same as 00h.
@@ -243,14 +243,14 @@ typedef struct
/// Protocol Data Structure for Protocol T=1 (bProtocolNum=1, dwLength=00000007h)
typedef struct
{
/// B7-4 - FI - Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
/// B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
/// clock rate conversion factor
/// B3-0 - DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
/// B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
/// baud rate conversion factor
unsigned char bmFindexDindex;
/// For T=1, B7-2 - 000100b
/// B0 - Checksum type (b0=0 for LRC, b0=1 for CRC
/// B1 - Convention used (b1=0 for direct, b1=1 for inverse)
/// For T=1, B7-2 000100b
/// B0 Checksum type (b0=0 for LRC, b0=1 for CRC
/// B1 Convention used (b1=0 for direct, b1=1 for inverse)
unsigned char bmTCCKST1; // 10h, 11h, 12h, 13h
/// Extra Guardtime (0 to 254 etu between two characters).
/// If value is FFh, then guardtime is reduced by 1.
@@ -292,8 +292,8 @@ typedef struct
/// - 04h 1.8V
/// Other bits are RFU.
unsigned char bVoltageSupport;
/// RRRR -Upper Word- is RFU = 0000h
/// PPPP -Lower Word- Encodes the supported protocol types. A "1" in a given
/// RRRR Upper Word- is RFU = 0000h
/// PPPP Lower Word- Encodes the supported protocol types. A 1 in a given
/// bit position indicates support for the associated ISO protocol.
/// 0001h = Protocol T=0
/// 0002h = Protocol T=1
@@ -318,7 +318,7 @@ typedef struct
/// Indicates the maximum IFSD supported by CCID for protocol T=1.
unsigned long dwMaxIFSD;
/// - RRRR-Upper Word- is RFU = 0000h
/// - PPPP-Lower Word- encodes the supported protocol types. A "1" in a given
/// - PPPP-Lower Word- encodes the supported protocol types. A 1 in a given
/// bit position indicates support for the associated protocol.
/// 0001h indicates support for the 2-wire protocol 1
/// 0002h indicates support for the 3-wire protocol 1

View File

@@ -11,6 +11,10 @@
* 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
*/
#pragma once

View File

@@ -11,6 +11,10 @@
* 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
*/
#pragma once

View File

@@ -9,6 +9,10 @@
* 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
*/
#ifndef SIMTRACE_RINGBUF_H
#define SIMTRACE_RINGBUF_H
@@ -32,22 +36,4 @@ int rbuf_write(volatile ringbuf * rb, uint8_t item);
bool rbuf_is_empty(volatile ringbuf * rb);
bool rbuf_is_full(volatile ringbuf * rb);
/* same as above but with 16bit values instead of 8bit */
#define RING16_BUFLEN 512
typedef struct ringbuf16 {
uint16_t buf[RING16_BUFLEN];
size_t ird;
size_t iwr;
} ringbuf16;
void rbuf16_reset(volatile ringbuf16 * rb);
uint16_t rbuf16_read(volatile ringbuf16 * rb);
uint16_t rbuf16_peek(volatile ringbuf16 * rb);
int rbuf16_write(volatile ringbuf16 * rb, uint16_t item);
bool rbuf16_is_empty(volatile ringbuf16 * rb);
bool rbuf16_is_full(volatile ringbuf16 * rb);
#endif /* end of include guard: SIMTRACE_RINGBUF_H */

View File

@@ -12,6 +12,10 @@
* 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
*/
#ifndef SIMTRACE_H
#define SIMTRACE_H

View File

@@ -1,6 +1,6 @@
/* SIMtrace2 USB protocol
*
* (C) 2015-2022 by Harald Welte <hwelte@hmw-consulting.de>
* (C) 2015-2017 by Harald Welte <hwelte@hmw-consulting.de>
* (C) 2018 by sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de>
*
* This program is free software; you can redistribute it and/or modify
@@ -12,6 +12,10 @@
* 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
*/
#pragma once
@@ -84,8 +88,6 @@ enum simtrace_msg_type_sniff {
SIMTRACE_MSGT_SNIFF_PPS,
/* TPDU data */
SIMTRACE_MSGT_SNIFF_TPDU,
/* Statistics */
SIMTRACE_MSGT_DO_SNIFF_STATS,
};
/* common message header */
@@ -315,9 +317,6 @@ struct st_modem_status {
#define SNIFF_DATA_FLAG_ERROR_INCOMPLETE (1<<5)
#define SNIFF_DATA_FLAG_ERROR_MALFORMED (1<<6)
#define SNIFF_DATA_FLAG_ERROR_CHECKSUM (1<<7)
#define SNIFF_DATA_FLAG_ERROR_OVERRUN (1<<8)
#define SNIFF_DATA_FLAG_ERROR_FRAMING (1<<9)
#define SNIFF_DATA_FLAG_ERROR_PARITY (1<<10)
/* SIMTRACE_MSGT_SNIFF_CHANGE */
struct sniff_change {
@@ -340,24 +339,3 @@ struct sniff_data {
/* data */
uint8_t data[0];
} __attribute__ ((packed));
/* SIMTRACE_MSGT_DO_SNIFF_STATS */
struct st_sniff_stats {
uint32_t flags; /* RFU */
uint32_t num_bytes; /* total lnumber of bytes received */
uint32_t num_tpdu; /* total number of TPDUs received */
uint32_t num_atr; /* total number of ATRs received */
uint32_t num_pps; /* total number of PPS (req, resp) received */
uint32_t num_reset; /* total number of resets */
struct {
uint32_t overruns;
uint32_t framing_errs;
uint32_t parity_errs;
uint32_t breaks;
} num_usart;
uint32_t num_waiting_time_exp;
uint32_t num_tpdu_overflows; /* TPDU buffer overflows */
uint32_t num_csum_errors; /* ATR + PPS checksum */
uint32_t num_ringbuf_overflows; /* ISR->main ringbuffer overflows */
uint32_t num_tpdu_malformed;
} __attribute__ ((packed));

View File

@@ -11,6 +11,10 @@
* 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
*/
/* SIMtrace USB IDs */
#define USB_VENDOR_OPENMOKO 0x1d50

View File

@@ -9,6 +9,10 @@
* 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
*/
#pragma once

View File

@@ -9,6 +9,10 @@
* 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
*/
#pragma once

View File

@@ -9,6 +9,10 @@
* 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
*/
#pragma once

View File

@@ -12,6 +12,10 @@
* 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 <stdio.h>
#include <assert.h>
@@ -775,15 +779,6 @@ static void set_tpdu_state(struct card_handle *ch, enum tpdu_state new_ts)
/* prepare to extend the waiting time once half of it is reached */
card_emu_uart_update_wt(ch->uart_chan, ch->waiting_time);
break;
case TPDU_S_WAIT_TX:
/* If we came from WAIT_RX, disable the receiver and
* enable the transmitter. If we came from WAIT_RX or
* WAIT_PB, reset the waiting time so that we can extend
* waiting time if needed. */
card_emu_uart_enable(ch->uart_chan, ENABLE_TX);
/* prepare to extend the waiting time once half of it is reached */
card_emu_uart_update_wt(ch->uart_chan, ch->waiting_time);
break;
default:
break;
}
@@ -1067,10 +1062,7 @@ void card_emu_report_status(struct card_handle *ch, bool report_on_irq)
sts->flags |= CEMU_STATUS_F_CLK_ACTIVE;
if (ch->in_reset)
sts->flags |= CEMU_STATUS_F_RESET_ACTIVE;
#ifdef DETECT_VCC_BY_ADC
sts->voltage_mv = card_emu_get_vcc(ch->num);
#endif
/* FIXME: card insert */
/* FIXME: voltage + card insert */
sts->F_index = ch->F_index;
sts->D_index = ch->D_index;
sts->wi = ch->wi;
@@ -1114,12 +1106,7 @@ void card_emu_io_statechg(struct card_handle *ch, enum card_io io, int active)
card_set_state(ch, ISO_S_WAIT_POWER);
chg_mask |= CEMU_STATUS_F_VCC_PRESENT;
} else if (active == 1 && ch->vcc_active == 0) {
#ifdef DETECT_VCC_BY_ADC
TRACE_INFO("%u: VCC activated (%d mV)\r\n", ch->num,
card_emu_get_vcc(ch->num));
#else
TRACE_INFO("%u: VCC activated\r\n", ch->num);
#endif
card_set_state(ch, ISO_S_WAIT_CLK);
chg_mask |= CEMU_STATUS_F_VCC_PRESENT;
}

View File

@@ -193,8 +193,8 @@ static void RDRtoPCDatablock_ATR( void )
ccidDriver.ProtocolDataStructure[0] = Atr[2]; // TA(1)
// bmTCCKST0
// For T=0 ,B0 - 0b, B7-2 - 000000b
// B1 - Convention used (b1=0 for direct, b1=1 for inverse)
// For T=0 ,B0 0b, B7-2 000000b
// B1 Convention used (b1=0 for direct, b1=1 for inverse)
// bGuardTimeT0
// Extra Guardtime between two characters. Add 0 to 254 etu to the normal
@@ -1005,7 +1005,7 @@ unsigned char CCID_Removal( void )
//------------------------------------------------------------------------------
/// Interrupt-IN Messages
/// This message is sent when any bit in the bHardwareErrorCode field is set.
/// If this message is sent when there is no "outstanding" command, the bSeq
/// If this message is sent when there is no outstanding command, the bSeq
/// field will be undefined.
/// \param bSlot ICC slot number
/// \param bSeq Sequence number of the bulk OUT command when the hardware error

View File

@@ -1,86 +0,0 @@
/* SIMtrace 2 firmware crc stub
*
* (C) 2021 by sysmocom -s.f.m.c. GmbH, Author: Eric Wild <ewild@sysmocom.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.
*/
#include <stdint.h>
#include "board.h"
#include "core_cm3.h"
#include "usb/device/dfu/dfu.h"
/*
* This file is a bit special, everything has to go to specific sections, and no globals are available.
* No external functions may be called, unless inlining is enforced!
*/
static void crc_check_stub();
__attribute__((section(".crcstub_table"))) volatile uint32_t crcstub_dummy_table[] = {
(uint32_t)0xdeadc0de, /* deliberately choose invalid value so unpatched image will not be started */
(uint32_t)crc_check_stub, /* must be valid flash addr */
(uint32_t)0xf1, /* crc value calculated by the host */
(uint32_t)0xf2, /* crc calc start address */
(uint32_t)0xf3 /* crc calc length (byte) */
};
__attribute__((section(".crcstub_code"))) static void do_crc32(int8_t c, uint32_t *crc_reg)
{
int32_t i, mask;
*crc_reg ^= c;
for (unsigned int j = 0; j < 8; j++)
if (*crc_reg & 1)
*crc_reg = (*crc_reg >> 1) ^ 0xEDB88320;
else
*crc_reg = *crc_reg >> 1;
}
__attribute__((section(".crcstub_code"), noinline)) static void crc_check_stub()
{
uint32_t crc_reg = 0xffffffff;
uint32_t expected_crc_val = crcstub_dummy_table[2];
uint8_t *crc_calc_startaddr = (uint8_t *)crcstub_dummy_table[3];
volatile uint32_t *actual_exc_tbl = (volatile uint32_t *)crc_calc_startaddr;
uint32_t crc_len = crcstub_dummy_table[4];
/* 4000ms wdt tickling */
WDT->WDT_MR = WDT_MR_WDRSTEN | WDT_MR_WDDBGHLT | WDT_MR_WDIDLEHLT | (((4000UL << 8) / 1000) << 16) |
((4000UL << 8) / 1000);
for (uint8_t *i = crc_calc_startaddr; i < crc_calc_startaddr + crc_len; i++)
do_crc32(*i, &crc_reg);
crc_reg = ~crc_reg;
if (crc_reg == expected_crc_val) {
/* this looks a bit awkward because we have to ensure the bx does not require a sp-relative load */
__asm__ volatile("\
mov r0, %0;\n\
mov r1, %1;\n\
MSR msp,r0;\n\
bx r1;"
:
: "r"(actual_exc_tbl[0]), "r"(actual_exc_tbl[1]));
} else {
/* no globals ! */
((struct dfudata *)0x20000000)->magic = USB_DFU_MAGIC;
__DSB();
for (;;) {
/* no functon call, since NVIC_SystemReset() might not be inlined! */
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk);
__DSB();
while (1)
;
}
}
}

View File

@@ -9,6 +9,10 @@
* 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 <stdio.h>
#include "uart_console.h"

View File

@@ -9,6 +9,10 @@
* 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 "board.h"
#include "llist_irqsafe.h"

View File

@@ -11,6 +11,10 @@
* 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>
#include <errno.h>

View File

@@ -11,6 +11,10 @@
* 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 "board.h"

View File

@@ -12,6 +12,10 @@
* 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 "board.h"
#include "boardver_adc.h"
@@ -83,21 +87,10 @@ struct cardem_inst {
#ifdef DETECT_VCC_BY_ADC
uint32_t vcc_uv;
#endif
/*! real-time state of VCC I/O line, irrespective of enabled flag */
bool vcc_active;
/*! last VCC state we reported to the card emu state machine (conditioned by enabled flag) */
bool vcc_active_last;
/*! real-time state of RST I/O line, irrespective of enabled flag */
bool rst_active;
/*! last RST state we reported to the card emu state machine (conditioned by enabled flag) */
bool rst_active_last;
/*! flag indicating whether this instance should perform card emulation, or not */
bool enabled;
};
struct cardem_inst cardem_inst[] = {
@@ -179,16 +172,6 @@ static void card_emu_uart_set_direction(uint8_t uart_chan, bool tx)
#endif
}
int card_emu_get_vcc(uint8_t uart_chan)
{
struct cardem_inst *ci = &cardem_inst[uart_chan];
#ifdef DETECT_VCC_BY_ADC
return ci->vcc_uv / 1000;
#else
return -1;
#endif
}
/* call-back from card_emu.c to enable/disable transmit and/or receive */
void card_emu_uart_enable(uint8_t uart_chan, uint8_t rxtx)
{
@@ -421,9 +404,10 @@ void card_emu_uart_reset_wt(uint8_t uart_chan)
/* call-back from card_emu.c to force a USART interrupt */
void card_emu_uart_interrupt(uint8_t uart_chan)
{
OSMO_ASSERT(uart_chan < ARRAY_SIZE(cardem_inst));
Usart *usart = get_usart_by_chan(uart_chan);
if (!usart) {
return;
}
if (USART0 == usart) {
NVIC_SetPendingIRQ(USART0_IRQn);
} else if (USART1 == usart) {
@@ -437,7 +421,7 @@ void card_emu_uart_interrupt(uint8_t uart_chan)
#ifdef DETECT_VCC_BY_ADC
#if !defined(VCC_UV_THRESH_1V8) || !defined(VCC_UV_THRESH_3V)
#error "You must define VCC_UV_THRESH_{1V8,3V} if you use ADC VCC detection"
#error "You must define VCC_UV_THRESH_{1V1,3V} if you use ADC VCC detection"
#endif
static volatile int adc_triggered = 0;
@@ -481,7 +465,6 @@ static int card_vcc_adc_init(void)
ADC->ADC_CHER |= ADC_CHER_CH6;
ADC->ADC_IER |= ADC_IER_EOC6;
#endif
NVIC_SetPriority(ADC_IRQn, 13);
NVIC_EnableIRQ(ADC_IRQn);
ADC->ADC_CR |= ADC_CR_START;
@@ -526,25 +509,19 @@ void ADC_IrqHandler(void)
#endif /* DETECT_VCC_BY_ADC */
/**
* called from main loop; dispatches card I/O state changes to card_emu from main loop.
* NOTE: conditions I/O state on the ci->enabled flag; if the instance is disabled, we assume VCC is
* disabled and the device is not in reset
*/
/* called from main loop; dispatches card I/O state changes to card_emu from main loop */
static void process_io_statechg(struct cardem_inst *ci)
{
const bool vcc_active = ci->vcc_active && ci->enabled;
if (vcc_active != ci->vcc_active_last) {
card_emu_io_statechg(ci->ch, CARD_IO_VCC, vcc_active);
if (ci->vcc_active != ci->vcc_active_last) {
card_emu_io_statechg(ci->ch, CARD_IO_VCC, ci->vcc_active);
/* FIXME do this for real */
card_emu_io_statechg(ci->ch, CARD_IO_CLK, vcc_active);
ci->vcc_active_last = vcc_active;
card_emu_io_statechg(ci->ch, CARD_IO_CLK, ci->vcc_active);
ci->vcc_active_last = ci->vcc_active;
}
const bool rst_active = ci->rst_active && ci->enabled;
if (rst_active != ci->rst_active_last) {
card_emu_io_statechg(ci->ch, CARD_IO_RST, rst_active);
ci->rst_active_last = rst_active;
if (ci->rst_active != ci->rst_active_last) {
card_emu_io_statechg(ci->ch, CARD_IO_RST, ci->rst_active);
ci->rst_active_last = ci->rst_active;
}
}
@@ -591,8 +568,6 @@ void mode_cardemu_init(void)
TRACE_ENTRY();
NVIC_SetPriority(UDP_IRQn, 14);
#ifdef PINS_CARDSIM
PIO_Configure(pins_cardsim, PIO_LISTSIZE(pins_cardsim));
#endif
@@ -606,7 +581,6 @@ void mode_cardemu_init(void)
/* configure USART as ISO-7816 slave (e.g. card) */
ISO7816_Init(&cardem_inst[0].usart_info, CLK_SLAVE);
NVIC_SetPriority(FIRST_USART_IRQ, 0);
NVIC_EnableIRQ(FIRST_USART_IRQ);
PIO_ConfigureIt(&pin_usim1_rst, usim1_rst_irqhandler);
PIO_EnableIt(&pin_usim1_rst);
@@ -634,7 +608,6 @@ void mode_cardemu_init(void)
PIO_Configure(pins_usim2, PIO_LISTSIZE(pins_usim2));
ISO7816_Init(&cardem_inst[1].usart_info, CLK_SLAVE);
/* TODO enable timeout */
NVIC_SetPriority(USART0_IRQn, 0);
NVIC_EnableIRQ(USART0_IRQn);
PIO_ConfigureIt(&pin_usim2_rst, usim2_rst_irqhandler);
PIO_EnableIt(&pin_usim2_rst);
@@ -795,8 +768,10 @@ static int usb_command_sim_select(struct msgb *msg, struct cardem_inst *ci)
if (msgb_l2len(msg) < sizeof(*mss))
return -1;
ci->enabled = mss->remote_sim ? true : false;
sim_switch_use_physical(ci->num, !ci->enabled);
if (mss->remote_sim)
sim_switch_use_physical(ci->num, 0);
else
sim_switch_use_physical(ci->num, 1);
return 0;
}
@@ -940,10 +915,7 @@ void mode_cardemu_run(void)
}
uint8_t byte = rbuf_read(&ci->rb);
__enable_irq();
if (ci->enabled) {
card_emu_process_rx_byte(ci->ch, byte);
}
card_emu_process_rx_byte(ci->ch, byte);
//TRACE_ERROR("%uRx%02x\r\n", i, byte);
}

View File

@@ -9,6 +9,10 @@
* 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>
#include <stdio.h>

View File

@@ -9,6 +9,10 @@
* 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 "ringbuffer.h"
#include "trace.h"
@@ -28,16 +32,6 @@ void rbuf_reset(volatile ringbuf * rb)
local_irq_restore(state);
}
void rbuf16_reset(volatile ringbuf16 * rb)
{
unsigned long state;
local_irq_save(state);
rb->ird = 0;
rb->iwr = 0;
local_irq_restore(state);
}
uint8_t rbuf_read(volatile ringbuf * rb)
{
unsigned long state;
@@ -51,49 +45,21 @@ uint8_t rbuf_read(volatile ringbuf * rb)
return val;
}
uint16_t rbuf16_read(volatile ringbuf16 * rb)
{
unsigned long state;
uint16_t val;
local_irq_save(state);
val = rb->buf[rb->ird];
rb->ird = (rb->ird + 1) % RING16_BUFLEN;
local_irq_restore(state);
return val;
}
uint8_t rbuf_peek(volatile ringbuf * rb)
{
return rb->buf[rb->ird];
}
uint16_t rbuf16_peek(volatile ringbuf16 * rb)
{
return rb->buf[rb->ird];
}
bool rbuf_is_empty(volatile ringbuf * rb)
{
return rb->ird == rb->iwr;
}
bool rbuf16_is_empty(volatile ringbuf16 * rb)
{
return rb->ird == rb->iwr;
}
static bool __rbuf_is_full(volatile ringbuf * rb)
{
return rb->ird == (rb->iwr + 1) % RING_BUFLEN;
}
static bool __rbuf16_is_full(volatile ringbuf16 * rb)
{
return rb->ird == (rb->iwr + 1) % RING16_BUFLEN;
}
bool rbuf_is_full(volatile ringbuf * rb)
{
unsigned long state;
@@ -106,18 +72,6 @@ bool rbuf_is_full(volatile ringbuf * rb)
return rc;
}
bool rbuf16_is_full(volatile ringbuf16 * rb)
{
unsigned long state;
bool rc;
local_irq_save(state);
rc = rb->ird == (rb->iwr + 1) % RING16_BUFLEN;
local_irq_restore(state);
return rc;
}
int rbuf_write(volatile ringbuf * rb, uint8_t item)
{
unsigned long state;
@@ -134,18 +88,4 @@ int rbuf_write(volatile ringbuf * rb, uint8_t item)
}
}
int rbuf16_write(volatile ringbuf16 * rb, uint16_t item)
{
unsigned long state;
local_irq_save(state);
if (!__rbuf16_is_full(rb)) {
rb->buf[rb->iwr] = item;
rb->iwr = (rb->iwr + 1) % RING16_BUFLEN;
local_irq_restore(state);
return 0;
} else {
local_irq_restore(state);
return -1;
}
}

View File

@@ -1,6 +1,6 @@
/* SIMtrace 2 sniffer mode
*
* (C) 2016-2022 by Harald Welte <hwelte@hmw-consulting.de>
* (C) 2016-2017 by Harald Welte <hwelte@hmw-consulting.de>
* (C) 2018 by sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de>
*
* This program is free software; you can redistribute it and/or modify
@@ -12,6 +12,10 @@
* 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
*/
/* This code implement the Sniffer mode to sniff the communication between a
* SIM card (or any ISO 7816 smart card) and a phone (or any ISO 7816 card
@@ -111,14 +115,6 @@ enum tpdu_sniff_state {
TPDU_S_SW2, /*!< second status word */
};
/*! Error flags we use to report USART errors via the ringbuffer */
#define RBUF16_F_OVERRUN 0x0100
#define RBUF16_F_FRAMING 0x0200
#define RBUF16_F_PARITY 0x0400
#define RBUF16_F_TIMEOUT_WT 0x0800
#define RBUF16_F_BREAK 0x1000
#define RBUF16_F_DATA_BYTE 0x8000
/*------------------------------------------------------------------------------
* Internal variables
*------------------------------------------------------------------------------*/
@@ -146,61 +142,50 @@ static struct Usart_info sniff_usart = {
.state = USART_RCV,
};
/*! Ring buffer to store sniffer communication data */
static struct ringbuf16 sniff_buffer;
static struct ringbuf sniff_buffer;
/* Flags to know is the card status changed (see SIMTRACE_MSGT_DT_SNIFF_CHANGE flags) */
static volatile uint32_t change_flags = 0;
/* statistics for SIMTRACE_MSGT_DO_SNIFF_STATS */
static struct st_sniff_stats g_stats;
volatile uint32_t change_flags = 0;
/* ISO 7816 variables */
/*! ISO 7816-3 state */
static enum iso7816_3_sniff_state iso_state = ISO7816_S_RESET;
static struct {
/*! ATR state */
enum atr_sniff_state state;
/*! ATR data
* @remark can be used to check later protocol changes
*/
uint8_t atr[MAX_ATR_SIZE];
/*! Current index in the ATR data */
uint8_t atr_i;
} g_atr;
enum iso7816_3_sniff_state iso_state = ISO7816_S_RESET;
/*! ATR state */
enum atr_sniff_state atr_state;
/*! ATR data
* @remark can be used to check later protocol changes
*/
uint8_t atr[MAX_ATR_SIZE];
/*! Current index in the ATR data */
uint8_t atr_i = 0;
/*! If convention conversion is needed */
static bool convention_convert = false;
bool convention_convert = false;
/*! The supported T protocols */
static uint16_t t_protocol_support = 0;
static struct {
/*! PPS state
* @remark it is shared between request and response since they aren't simultaneous but
* follow the same procedure */
enum pps_sniff_state state;
/*! PPS request data
* @remark can be used to check PPS response */
uint8_t req[MAX_PPS_SIZE];
/*! PPS response data */
uint8_t rsp[MAX_PPS_SIZE];
} g_pps;
static struct {
/*! TPDU state */
enum tpdu_sniff_state state;
/*! Final TPDU packet
* @note this is the complete command+response TPDU, including header, data, and status words
* @remark this does not include the procedure bytes */
uint8_t packet[5+256+2];
/*! Current index in TPDU packet */
uint16_t packet_i;
} g_tpdu;
uint16_t t_protocol_support = 0;
/*! PPS state
* @remark it is shared between request and response since they aren't simultaneous but follow the same procedure
*/
enum pps_sniff_state pps_state;
/*! PPS request data
* @remark can be used to check PPS response
*/
uint8_t pps_req[MAX_PPS_SIZE];
/*! PPS response data */
uint8_t pps_rsp[MAX_PPS_SIZE];
/*! TPDU state */
enum tpdu_sniff_state tpdu_state;
/*! Final TPDU packet
* @note this is the complete command+response TPDU, including header, data, and status words
* @remark this does not include the procedure bytes
*/
uint8_t tpdu_packet[5+256+2];
/*! Current index in TPDU packet */
uint16_t tpdu_packet_i = 0;
/*! Waiting Time (WT)
* @note defined in ISO/IEC 7816-3:2006(E) section 8.1 and 10.2
*/
static uint32_t g_wt = 9600;
uint32_t wt = 9600;
/*------------------------------------------------------------------------------
* Internal functions
@@ -215,11 +200,10 @@ static const uint8_t convention_convert_lut[256] = { 0xff, 0x7f, 0xbf, 0x3f, 0xd
/*! Update Waiting Time (WT)
* @param[in] wi Waiting Integer (0 if unchanged)
* @param[in] d Baud Rate divider (0 if unchanged)
* @param[in] cause String describing the source of the change
* @note set wt to be used by the receiver timeout
* @note defined in ISO/IEC 7816-3:2006(E) section 8.1 and 10.2
*/
static void update_wt(uint8_t wi, uint8_t d, const char *cause)
static void update_wt(uint8_t wi, uint8_t d)
{
static uint8_t wt_wi = 10; /* Waiting time Integer (WI), used to calculate the Waiting Time (WT) */
static uint8_t wt_d = 1; /* baud rate adjustment integer (the actual value, not the table index) */
@@ -230,8 +214,8 @@ static void update_wt(uint8_t wi, uint8_t d, const char *cause)
if (0 != d) {
wt_d = d;
}
g_wt = wt_wi * 960UL * wt_d;
TRACE_INFO("WT updated (wi=%u, d=%u, cause=%s) to %lu ETU\n\r", wi, d, cause, g_wt);
wt = wt_wi * 960UL * wt_d;
TRACE_INFO("WT updated to %lu ETU\n\r", wt);
}
/*! Allocate USB buffer and push + initialize simtrace_msg_hdr
@@ -275,15 +259,6 @@ void usb_msg_upd_len_and_submit(struct msgb *usb_msg)
usb_buf_submit(usb_msg);
}
/*! Update the TPDU state
* @param[in] tpdu_state_new new TPDU state to update to
*/
static void change_tpdu_state(enum tpdu_sniff_state tpdu_state_new)
{
//TRACE_ERROR("TPDU state %u->%u\n\r", g_tpdu.state, tpdu_state_new);
g_tpdu.state = tpdu_state_new;
}
/*! Update the ISO 7816-3 state
* @param[in] iso_state_new new ISO 7816-3 state to update to
*/
@@ -299,33 +274,32 @@ static void change_state(enum iso7816_3_sniff_state iso_state_new)
switch (iso_state_new) {
case ISO7816_S_RESET:
update_fidi(&sniff_usart, 0x11); /* reset baud rate to default Di/Fi values */
update_wt(10, 1, "RESET"); /* reset WT time-out */
update_wt(10, 1); /* reset WT time-out */
break;
case ISO7816_S_WAIT_ATR:
rbuf16_reset(&sniff_buffer); /* reset buffer for new communication */
rbuf_reset(&sniff_buffer); /* reset buffer for new communication */
break;
case ISO7816_S_IN_ATR:
g_atr.atr_i = 0;
atr_i = 0;
convention_convert = false;
t_protocol_support = 0;
g_atr.state = ATR_S_WAIT_TS;
atr_state = ATR_S_WAIT_TS;
break;
case ISO7816_S_IN_PPS_REQ:
case ISO7816_S_IN_PPS_RSP:
g_pps.state = PPS_S_WAIT_PPSS;
pps_state = PPS_S_WAIT_PPSS;
break;
case ISO7816_S_WAIT_TPDU:
change_tpdu_state(TPDU_S_CLA);
g_tpdu.packet_i = 0;
tpdu_state = TPDU_S_CLA;
tpdu_packet_i = 0;
break;
default:
break;
}
TRACE_INFO("ISO 7816-3 state %u->%u\n\r", iso_state, iso_state_new);
/* save new state */
iso_state = iso_state_new;
TRACE_INFO("Changed to ISO 7816-3 state %u\n\r", iso_state);
}
const struct value_string data_flags[] = {
@@ -410,13 +384,13 @@ static void usb_send_atr(uint32_t flags)
TRACE_WARNING("Can't print ATR in ISO 7816-3 state %u\n\r", iso_state);
return;
}
if (g_atr.atr_i >= ARRAY_SIZE(g_atr.atr)) {
if (atr_i >= ARRAY_SIZE(atr)) {
TRACE_ERROR("ATR buffer overflow\n\r");
return;
}
/* Send ATR over USB */
usb_send_data(SIMTRACE_MSGT_SNIFF_ATR, g_atr.atr, g_atr.atr_i, flags);
usb_send_data(SIMTRACE_MSGT_SNIFF_ATR, atr, atr_i, flags);
}
/*! Process ATR byte
@@ -434,16 +408,16 @@ static void process_byte_atr(uint8_t byte)
TRACE_ERROR("Processing ATR data in wrong ISO 7816-3 state %u\n\r", iso_state);
return;
}
if (g_atr.atr_i >= ARRAY_SIZE(g_atr.atr)) {
if (atr_i >= ARRAY_SIZE(atr)) {
TRACE_ERROR("ATR data overflow\n\r");
return;
}
/* save data for use by other functions */
g_atr.atr[g_atr.atr_i++] = byte;
atr[atr_i++] = byte;
/* handle ATR byte depending on current state */
switch (g_atr.state) {
switch (atr_state) {
case ATR_S_WAIT_TS: /* see ISO/IEC 7816-3:2006 section 8.1 */
flags = 0;
switch (byte) {
@@ -452,12 +426,11 @@ static void process_byte_atr(uint8_t byte)
convention_convert = !convention_convert;
case 0x3b: /* direct convention used and correctly decoded */
case 0x3f: /* inverse convention used and correctly decoded */
g_atr.state = ATR_S_WAIT_T0; /* wait for format byte */
atr_state = ATR_S_WAIT_T0; /* wait for format byte */
break;
default:
TRACE_WARNING("Invalid TS received\n\r");
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
g_stats.num_tpdu_malformed++;
usb_send_atr(SNIFF_DATA_FLAG_ERROR_MALFORMED); /* send ATR to host software using USB */
change_state(ISO7816_S_WAIT_ATR); /* reset state */
break;
@@ -466,41 +439,41 @@ static void process_byte_atr(uint8_t byte)
break;
case ATR_S_WAIT_T0: /* see ISO/IEC 7816-3:2006 section 8.2.2 */
case ATR_S_WAIT_TD: /* see ISO/IEC 7816-3:2006 section 8.2.3 */
if (ATR_S_WAIT_T0 == g_atr.state) {
if (ATR_S_WAIT_T0 == atr_state) {
atr_hist_len = (byte & 0x0f); /* save the number of historical bytes */
} else if (ATR_S_WAIT_TD == g_atr.state) {
} else if (ATR_S_WAIT_TD == atr_state) {
t_protocol_support |= (1<<(byte & 0x0f)); /* remember supported protocol to know if TCK will be present */
}
y = (byte & 0xf0); /* remember upcoming interface bytes */
i++; /* next interface byte sub-group is coming */
if (y & 0x10) {
g_atr.state = ATR_S_WAIT_TA; /* wait for interface byte TA */
atr_state = ATR_S_WAIT_TA; /* wait for interface byte TA */
break;
}
case ATR_S_WAIT_TA: /* see ISO/IEC 7816-3:2006 section 8.2.3 */
if (y & 0x20) {
g_atr.state = ATR_S_WAIT_TB; /* wait for interface byte TB */
atr_state = ATR_S_WAIT_TB; /* wait for interface byte TB */
break;
}
case ATR_S_WAIT_TB: /* see ISO/IEC 7816-3:2006 section 8.2.3 */
if (y & 0x40) {
g_atr.state = ATR_S_WAIT_TC; /* wait for interface byte TC */
atr_state = ATR_S_WAIT_TC; /* wait for interface byte TC */
break;
}
case ATR_S_WAIT_TC: /* see ISO/IEC 7816-3:2006 section 8.2.3 */
/* retrieve WI encoded in TC2*/
if (ATR_S_WAIT_TC == g_atr.state && 2 == i) {
if (ATR_S_WAIT_TC==atr_state && 2==i) {
if (0 == byte) {
update_wt(10, 0, "TC2=0");
update_wt(10, 0);
} else {
update_wt(byte, 0, "TC2");
update_wt(byte, 0);
}
}
if (y & 0x80) {
g_atr.state = ATR_S_WAIT_TD; /* wait for interface byte TD */
atr_state = ATR_S_WAIT_TD; /* wait for interface byte TD */
break;
} else if (atr_hist_len) {
g_atr.state = ATR_S_WAIT_HIST; /* wait for historical bytes */
atr_state = ATR_S_WAIT_HIST; /* wait for historical bytes */
break;
}
case ATR_S_WAIT_HIST: /* see ISO/IEC 7816-3:2006 section 8.2.4 */
@@ -509,7 +482,7 @@ static void process_byte_atr(uint8_t byte)
}
if (0 == atr_hist_len) {
if (t_protocol_support > 1) {
g_atr.state = ATR_S_WAIT_TCK; /* wait for check bytes */
atr_state = ATR_S_WAIT_TCK; /* wait for check bytes */
break;
}
} else {
@@ -517,26 +490,24 @@ static void process_byte_atr(uint8_t byte)
}
case ATR_S_WAIT_TCK: /* see ISO/IEC 7816-3:2006 section 8.2.5 */
/* verify checksum if present */
if (ATR_S_WAIT_TCK == g_atr.state) {
if (ATR_S_WAIT_TCK == atr_state) {
uint8_t ui;
uint8_t checksum = 0;
for (ui = 1; ui < g_atr.atr_i; ui++) {
checksum ^= g_atr.atr[ui];
for (ui = 1; ui < atr_i; ui++) {
checksum ^= atr[ui];
}
if (checksum) {
flags |= SNIFF_DATA_FLAG_ERROR_CHECKSUM;
/* We still consider the data as valid (e.g. for WT) even is the checksum is wrong.
* It is up to the reader to handle this error (e.g. by resetting)
*/
g_stats.num_csum_errors++;
}
}
usb_send_atr(flags); /* send ATR to host software using USB */
g_stats.num_atr++;
change_state(ISO7816_S_WAIT_TPDU); /* go to next state */
break;
default:
TRACE_INFO("Unknown ATR state %u\n\r", g_atr.state);
TRACE_INFO("Unknown ATR state %u\n\r", atr_state);
}
}
@@ -550,9 +521,9 @@ static void usb_send_pps(uint32_t flags)
/* Sanity check */
if (ISO7816_S_IN_PPS_REQ == iso_state) {
pps_cur = g_pps.req;
pps_cur = pps_req;
} else if (ISO7816_S_IN_PPS_RSP == iso_state) {
pps_cur = g_pps.rsp;
pps_cur = pps_rsp;
} else {
TRACE_ERROR("Can't print PPS in ISO 7816-3 state %u\n\r", iso_state);
return;
@@ -561,22 +532,22 @@ static void usb_send_pps(uint32_t flags)
/* Get only relevant data */
uint8_t pps[6];
uint8_t pps_i = 0;
if (g_pps.state > PPS_S_WAIT_PPSS) {
if (pps_state > PPS_S_WAIT_PPSS) {
pps[pps_i++] = pps_cur[0];
}
if (g_pps.state > PPS_S_WAIT_PPS0) {
if (pps_state > PPS_S_WAIT_PPS0) {
pps[pps_i++] = pps_cur[1];
}
if (g_pps.state > PPS_S_WAIT_PPS1 && pps_cur[1] & 0x10) {
if (pps_state > PPS_S_WAIT_PPS1 && pps_cur[1] & 0x10) {
pps[pps_i++] = pps_cur[2];
}
if (g_pps.state > PPS_S_WAIT_PPS2 && pps_cur[1] & 0x20) {
if (pps_state > PPS_S_WAIT_PPS2 && pps_cur[1] & 0x20) {
pps[pps_i++] = pps_cur[3];
}
if (g_pps.state > PPS_S_WAIT_PPS3 && pps_cur[1] & 0x40) {
if (pps_state > PPS_S_WAIT_PPS3 && pps_cur[1] & 0x40) {
pps[pps_i++] = pps_cur[4];
}
if (g_pps.state > PPS_S_WAIT_PCK) {
if (pps_state > PPS_S_WAIT_PCK) {
pps[pps_i++] = pps_cur[5];
}
@@ -606,25 +577,24 @@ static void process_byte_pps(uint8_t byte)
/* sanity check */
if (ISO7816_S_IN_PPS_REQ == iso_state) {
pps_cur = g_pps.req;
pps_cur = pps_req;
} else if (ISO7816_S_IN_PPS_RSP == iso_state) {
pps_cur = g_pps.rsp;
pps_cur = pps_rsp;
} else {
TRACE_ERROR("Processing PPS data in wrong ISO 7816-3 state %u\n\r", iso_state);
return;
}
/* handle PPS byte depending on current state */
switch (g_pps.state) { /* see ISO/IEC 7816-3:2006 section 9.2 */
switch (pps_state) { /* see ISO/IEC 7816-3:2006 section 9.2 */
case PPS_S_WAIT_PPSS: /*!< initial byte */
flags = 0;
if (byte == 0xff) {
if (0xff) {
pps_cur[0] = byte;
g_pps.state = PPS_S_WAIT_PPS0; /* go to next state */
pps_state = PPS_S_WAIT_PPS0; /* go to next state */
} else {
TRACE_INFO("Invalid PPSS received\n\r");
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
g_stats.num_tpdu_malformed++;
usb_send_pps(SNIFF_DATA_FLAG_ERROR_MALFORMED); /* send ATR to host software using USB */
change_state(ISO7816_S_WAIT_TPDU); /* go back to TPDU state */
}
@@ -632,24 +602,24 @@ static void process_byte_pps(uint8_t byte)
case PPS_S_WAIT_PPS0: /*!< format byte */
pps_cur[1] = byte;
if (pps_cur[1] & 0x10) {
g_pps.state = PPS_S_WAIT_PPS1; /* go to next state */
pps_state = PPS_S_WAIT_PPS1; /* go to next state */
break;
}
case PPS_S_WAIT_PPS1: /*!< first parameter byte */
pps_cur[2] = byte; /* not always right but doesn't affect the process */
if (pps_cur[1] & 0x20) {
g_pps.state = PPS_S_WAIT_PPS2; /* go to next state */
pps_state = PPS_S_WAIT_PPS2; /* go to next state */
break;
}
case PPS_S_WAIT_PPS2: /*!< second parameter byte */
pps_cur[3] = byte; /* not always right but doesn't affect the process */
if (pps_cur[1] & 0x40) {
g_pps.state = PPS_S_WAIT_PPS3; /* go to next state */
pps_state = PPS_S_WAIT_PPS3; /* go to next state */
break;
}
case PPS_S_WAIT_PPS3: /*!< third parameter byte */
pps_cur[4] = byte; /* not always right but doesn't affect the process */
g_pps.state = PPS_S_WAIT_PCK; /* go to next state */
pps_state = PPS_S_WAIT_PCK; /* go to next state */
break;
case PPS_S_WAIT_PCK: /*!< check byte */
pps_cur[5] = byte; /* not always right but doesn't affect the process */
@@ -670,13 +640,12 @@ static void process_byte_pps(uint8_t byte)
if (check) {
flags |= SNIFF_DATA_FLAG_ERROR_CHECKSUM;
}
g_pps.state = PPS_S_WAIT_END;
pps_state = PPS_S_WAIT_END;
usb_send_pps(flags); /* send PPS to host software using USB */
if (ISO7816_S_IN_PPS_REQ == iso_state) {
if (0 == check) { /* checksum is valid */
change_state(ISO7816_S_WAIT_PPS_RSP); /* go to next state */
} else { /* checksum is invalid */
g_stats.num_csum_errors++;
change_state(ISO7816_S_WAIT_TPDU); /* go to next state */
}
} else if (ISO7816_S_IN_PPS_RSP == iso_state) {
@@ -692,21 +661,19 @@ static void process_byte_pps(uint8_t byte)
TRACE_INFO("PPS negotiation successful: Fn=%u Dn=%u\n\r",
iso7816_3_fi_table[fn], iso7816_3_di_table[dn]);
update_fidi(&sniff_usart, pps_cur[2]);
update_wt(0, iso7816_3_di_table[dn], "PPS");
update_wt(0, iso7816_3_di_table[dn]);
usb_send_fidi(pps_cur[2]); /* send Fi/Di change notification to host software over USB */
} else { /* checksum is invalid */
TRACE_INFO("PPS negotiation failed\n\r");
g_stats.num_csum_errors++;
}
g_stats.num_pps++;
change_state(ISO7816_S_WAIT_TPDU); /* go to next state */
}
break;
case PPS_S_WAIT_END:
TRACE_WARNING("Unexpected PPS received %u\n\r", g_pps.state);
TRACE_WARNING("Unexpected PPS received %u\n\r", pps_state);
break;
default:
TRACE_WARNING("Unknown PPS state %u\n\r", g_pps.state);
TRACE_WARNING("Unknown PPS state %u\n\r", pps_state);
break;
}
}
@@ -724,7 +691,7 @@ static void usb_send_tpdu(uint32_t flags)
}
/* Send ATR over USB */
usb_send_data(SIMTRACE_MSGT_SNIFF_TPDU, g_tpdu.packet, g_tpdu.packet_i, flags);
usb_send_data(SIMTRACE_MSGT_SNIFF_TPDU, tpdu_packet, tpdu_packet_i, flags);
}
static void process_byte_tpdu(uint8_t byte)
@@ -734,102 +701,97 @@ static void process_byte_tpdu(uint8_t byte)
TRACE_ERROR("Processing TPDU data in wrong ISO 7816-3 state %u\n\r", iso_state);
return;
}
if (g_tpdu.packet_i >= ARRAY_SIZE(g_tpdu.packet)) {
g_stats.num_tpdu_overflows++;
if (tpdu_packet_i >= ARRAY_SIZE(tpdu_packet)) {
TRACE_ERROR("TPDU data overflow\n\r");
return;
}
/* handle TPDU byte depending on current state */
switch (g_tpdu.state) {
switch (tpdu_state) {
case TPDU_S_CLA:
if (0xff == byte) {
TRACE_WARNING("0xff is not a valid class byte\n\r");
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
g_stats.num_tpdu_malformed++;
usb_send_tpdu(SNIFF_DATA_FLAG_ERROR_MALFORMED); /* send ATR to host software using USB */
change_state(ISO7816_S_WAIT_TPDU); /* go back to TPDU state */
return;
}
g_tpdu.packet_i = 0;
g_tpdu.packet[g_tpdu.packet_i++] = byte;
change_tpdu_state(TPDU_S_INS);
tpdu_packet_i = 0;
tpdu_packet[tpdu_packet_i++] = byte;
tpdu_state = TPDU_S_INS;
break;
case TPDU_S_INS:
if ((0x60 == (byte & 0xf0)) || (0x90 == (byte & 0xf0))) {
TRACE_WARNING("invalid INS 0x%02x\n\r", byte);
TRACE_WARNING("invalid CLA 0x%02x\n\r", byte);
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
g_stats.num_tpdu_malformed++;
usb_send_tpdu(SNIFF_DATA_FLAG_ERROR_MALFORMED); /* send ATR to host software using USB */
change_state(ISO7816_S_WAIT_TPDU); /* go back to TPDU state */
return;
}
g_tpdu.packet_i = 1;
g_tpdu.packet[g_tpdu.packet_i++] = byte;
change_tpdu_state(TPDU_S_P1);
tpdu_packet_i = 1;
tpdu_packet[tpdu_packet_i++] = byte;
tpdu_state = TPDU_S_P1;
break;
case TPDU_S_P1:
g_tpdu.packet_i = 2;
g_tpdu.packet[g_tpdu.packet_i++] = byte;
change_tpdu_state(TPDU_S_P2);
tpdu_packet_i = 2;
tpdu_packet[tpdu_packet_i++] = byte;
tpdu_state = TPDU_S_P2;
break;
case TPDU_S_P2:
g_tpdu.packet_i = 3;
g_tpdu.packet[g_tpdu.packet_i++] = byte;
change_tpdu_state(TPDU_S_P3);
tpdu_packet_i = 3;
tpdu_packet[tpdu_packet_i++] = byte;
tpdu_state = TPDU_S_P3;
break;
case TPDU_S_P3:
g_tpdu.packet_i = 4;
g_tpdu.packet[g_tpdu.packet_i++] = byte;
change_tpdu_state(TPDU_S_PROCEDURE);
tpdu_packet_i = 4;
tpdu_packet[tpdu_packet_i++] = byte;
tpdu_state = TPDU_S_PROCEDURE;
break;
case TPDU_S_PROCEDURE:
if (0x60 == byte) { /* wait for next procedure byte */
break;
} else if (g_tpdu.packet[1] == byte) { /* get all remaining data bytes */
change_tpdu_state(TPDU_S_DATA_REMAINING);
} else if (tpdu_packet[1] == byte) { /* get all remaining data bytes */
tpdu_state = TPDU_S_DATA_REMAINING;
break;
} else if ((~g_tpdu.packet[1]) == byte) { /* get single data byte */
change_tpdu_state(TPDU_S_DATA_SINGLE);
} else if ((~tpdu_packet[1]) == byte) { /* get single data byte */
tpdu_state = TPDU_S_DATA_SINGLE;
break;
}
case TPDU_S_SW1:
if ((0x60 == (byte & 0xf0)) || (0x90 == (byte & 0xf0))) { /* this procedure byte is SW1 */
g_tpdu.packet[g_tpdu.packet_i++] = byte;
change_tpdu_state(TPDU_S_SW2);
tpdu_packet[tpdu_packet_i++] = byte;
tpdu_state = TPDU_S_SW2;
} else {
TRACE_WARNING("invalid SW1 0x%02x\n\r", byte);
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
g_stats.num_tpdu_malformed++;
usb_send_tpdu(SNIFF_DATA_FLAG_ERROR_MALFORMED); /* send ATR to host software using USB */
change_state(ISO7816_S_WAIT_TPDU); /* go back to TPDU state */
return;
}
break;
case TPDU_S_SW2:
g_tpdu.packet[g_tpdu.packet_i++] = byte;
tpdu_packet[tpdu_packet_i++] = byte;
usb_send_tpdu(0); /* send TPDU to host software using USB */
g_stats.num_tpdu++;
change_state(ISO7816_S_WAIT_TPDU); /* this is the end of the TPDU */
break;
case TPDU_S_DATA_SINGLE:
case TPDU_S_DATA_REMAINING:
g_tpdu.packet[g_tpdu.packet_i++] = byte;
if (0 == g_tpdu.packet[4]) {
if (5+256 <= g_tpdu.packet_i) {
change_tpdu_state(TPDU_S_PROCEDURE);
tpdu_packet[tpdu_packet_i++] = byte;
if (0 == tpdu_packet[4]) {
if (5+256 <= tpdu_packet_i) {
tpdu_state = TPDU_S_PROCEDURE;
}
} else {
if (5+g_tpdu.packet[4] <= g_tpdu.packet_i) {
change_tpdu_state(TPDU_S_PROCEDURE);
if (5+tpdu_packet[4] <= tpdu_packet_i) {
tpdu_state = TPDU_S_PROCEDURE;
}
}
if (TPDU_S_DATA_SINGLE == g_tpdu.state) {
change_tpdu_state(TPDU_S_PROCEDURE);
if (TPDU_S_DATA_SINGLE == tpdu_state) {
tpdu_state = TPDU_S_PROCEDURE;
}
break;
default:
TRACE_ERROR("unhandled TPDU state %u\n\r", g_tpdu.state);
TRACE_ERROR("unhandled TPDU state %u\n\r", tpdu_state);
}
}
@@ -841,49 +803,37 @@ void Sniffer_usart_isr(void)
/* Read channel status register */
uint32_t csr = sniff_usart.base->US_CSR;
uint16_t byte = 0;
/* Verify if there was an error */
if (csr & US_CSR_OVRE) {
TRACE_WARNING("USART overrun error\n\r");
sniff_usart.base->US_CR |= US_CR_RSTSTA;
}
if (csr & US_CSR_FRAME) {
TRACE_WARNING("USART framing error\n\r");
sniff_usart.base->US_CR |= US_CR_RSTSTA;
}
/* Verify if character has been received */
if (csr & US_CSR_RXRDY) {
/* Read communication data byte between phone and SIM */
byte = RBUF16_F_DATA_BYTE | (sniff_usart.base->US_RHR & 0xff);
g_stats.num_bytes++;
uint8_t byte = sniff_usart.base->US_RHR;
/* Reset WT timer */
wt_remaining = g_wt;
wt_remaining = wt;
/* Store sniffed data into buffer (also clear interrupt */
if (rbuf_is_full(&sniff_buffer)) {
TRACE_ERROR("USART buffer full\n\r");
} else {
rbuf_write(&sniff_buffer, byte);
}
}
/* Verify if there was an error */
if (csr & US_CSR_OVRE) {
g_stats.num_usart.overruns++;
byte |= RBUF16_F_OVERRUN;
}
if (csr & US_CSR_FRAME) {
g_stats.num_usart.framing_errs++;
byte |= RBUF16_F_FRAMING;
}
if (csr & US_CSR_PARE) {
g_stats.num_usart.parity_errs++;
byte |= RBUF16_F_PARITY;
}
if (csr & US_CSR_RXBRK) {
g_stats.num_usart.breaks++;
byte |= RBUF16_F_BREAK;
};
if (csr & (US_CSR_OVRE|US_CSR_FRAME|US_CSR_PARE))
sniff_usart.base->US_CR |= US_CR_RSTSTA;
/* Verify it WT timeout occurred, to detect unresponsive card */
if (csr & US_CSR_TIMEOUT) {
if (wt_remaining <= (sniff_usart.base->US_RTOR & 0xffff)) {
/* ensure the timeout is enqueued in the ring-buffer */
byte |= RBUF16_F_TIMEOUT_WT;
/* Just set the flag and let the main loop handle it */
change_flags |= SNIFF_CHANGE_FLAG_TIMEOUT_WT;
/* Reset timeout value */
wt_remaining = g_wt;
g_stats.num_waiting_time_exp++;
wt_remaining = wt;
} else {
wt_remaining -= (sniff_usart.base->US_RTOR & 0xffff); /* be sure to subtract the actual timeout since the new might not have been set and reloaded yet */
}
@@ -899,14 +849,6 @@ void Sniffer_usart_isr(void)
sniff_usart.base->US_CR |= US_CR_RETTO;
}
}
/* Store sniffed data (or error flags, or both) into buffer */
if (byte) {
if (rbuf16_write(&sniff_buffer, byte) != 0) {
g_stats.num_ringbuf_overflows++;
TRACE_ERROR("USART buffer full\n\r");
}
}
}
/** PIO interrupt service routine to checks if the card reset line has changed
@@ -921,7 +863,6 @@ static void Sniffer_reset_isr(const Pin* pPin)
/* Update the ISO state according to the reset change (reset is active low) */
if (PIO_Get(&pin_rst)) {
change_flags |= SNIFF_CHANGE_FLAG_RESET_DEASSERT; /* set flag and let main loop send it */
g_stats.num_reset++;
} else {
change_flags |= SNIFF_CHANGE_FLAG_RESET_ASSERT; /* set flag and let main loop send it */
}
@@ -949,9 +890,6 @@ void Sniffer_usart0_irq(void)
* Initialization routine
*-----------------------------------------------------------------------------*/
#define SNIFFER_IER (US_IER_RXRDY | US_IER_TIMEOUT | US_IER_OVRE | US_IER_FRAME | US_IER_PARE | \
US_CSR_RXBRK)
/* Called during USB enumeration after device is enumerated by host */
void Sniffer_configure(void)
{
@@ -963,7 +901,7 @@ void Sniffer_exit(void)
{
TRACE_INFO("Sniffer exit\n\r");
/* Disable USART */
USART_DisableIt(sniff_usart.base, SNIFFER_IER);
USART_DisableIt(sniff_usart.base, US_IER_RXRDY);
/* NOTE: don't forget to set the IRQ according to the USART peripheral used */
NVIC_DisableIRQ(IRQ_USART_SIM);
USART_SetReceiverEnabled(sniff_usart.base, 0);
@@ -977,8 +915,6 @@ void Sniffer_init(void)
{
TRACE_INFO("Sniffer Init\n\r");
memset(&g_stats, 0, sizeof(g_stats));
/* Configure pins to sniff communication between phone and card */
PIO_Configure(pins_sniff, PIO_LISTSIZE(pins_sniff));
/* Configure pins to connect phone to card */
@@ -993,15 +929,15 @@ void Sniffer_init(void)
PIO_EnableIt(&pin_rst);
/* Clear ring buffer containing the sniffed data */
rbuf16_reset(&sniff_buffer);
rbuf_reset(&sniff_buffer);
/* Configure USART to as ISO-7816 slave communication to sniff communication */
ISO7816_Init(&sniff_usart, CLK_SLAVE);
/* Only receive data when sniffing */
USART_SetReceiverEnabled(sniff_usart.base, 1);
/* Enable Receiver time-out to detect waiting time (WT) time-out (e.g. unresponsive cards) */
sniff_usart.base->US_RTOR = g_wt;
sniff_usart.base->US_RTOR = wt;
/* Enable interrupt to indicate when data has been received or timeout occurred */
USART_EnableIt(sniff_usart.base, SNIFFER_IER);
USART_EnableIt(sniff_usart.base, US_IER_RXRDY | US_IER_TIMEOUT);
/* Set USB priority lower than USART to not miss sniffing data (both at 0 per default) */
if (NVIC_GetPriority(IRQ_USART_SIM) >= NVIC_GetPriority(UDP_IRQn)) {
NVIC_SetPriority(UDP_IRQn, NVIC_GetPriority(IRQ_USART_SIM) + 2);
@@ -1059,84 +995,45 @@ void Sniffer_run(void)
* is remaining
*/
/* Handle sniffed data */
if (!rbuf16_is_empty(&sniff_buffer)) { /* use if instead of while to let the main loop restart the watchdog */
uint16_t entry = rbuf16_read(&sniff_buffer);
if (entry & RBUF16_F_DATA_BYTE) {
uint8_t byte = entry & 0xff;
/* Convert convention if required */
if (convention_convert) {
byte = convention_convert_lut[byte];
}
//TRACE_ERROR_WP(">%02x", byte);
switch (iso_state) { /* Handle byte depending on state */
case ISO7816_S_RESET: /* During reset we shouldn't receive any data */
break;
case ISO7816_S_WAIT_ATR: /* After a reset we expect the ATR */
change_state(ISO7816_S_IN_ATR); /* go to next state */
case ISO7816_S_IN_ATR: /* More ATR data incoming */
process_byte_atr(byte);
break;
case ISO7816_S_WAIT_TPDU: /* After the ATR we expect TPDU or PPS data */
case ISO7816_S_WAIT_PPS_RSP:
if (0xff == byte) {
if (ISO7816_S_WAIT_PPS_RSP == iso_state) {
change_state(ISO7816_S_IN_PPS_RSP); /* Go to PPS state */
} else {
change_state(ISO7816_S_IN_PPS_REQ); /* Go to PPS state */
}
process_byte_pps(byte);
break;
if (!rbuf_is_empty(&sniff_buffer)) { /* use if instead of while to let the main loop restart the watchdog */
uint8_t byte = rbuf_read(&sniff_buffer);
/* Convert convention if required */
if (convention_convert) {
byte = convention_convert_lut[byte];
}
//TRACE_ERROR_WP(">%02x", byte);
switch (iso_state) { /* Handle byte depending on state */
case ISO7816_S_RESET: /* During reset we shouldn't receive any data */
break;
case ISO7816_S_WAIT_ATR: /* After a reset we expect the ATR */
change_state(ISO7816_S_IN_ATR); /* go to next state */
case ISO7816_S_IN_ATR: /* More ATR data incoming */
process_byte_atr(byte);
break;
case ISO7816_S_WAIT_TPDU: /* After the ATR we expect TPDU or PPS data */
case ISO7816_S_WAIT_PPS_RSP:
if (0xff == byte) {
if (ISO7816_S_WAIT_PPS_RSP == iso_state) {
change_state(ISO7816_S_IN_PPS_RSP); /* Go to PPS state */
} else {
change_state(ISO7816_S_IN_PPS_REQ); /* Go to PPS state */
}
case ISO7816_S_IN_TPDU: /* More TPDU data incoming */
if (ISO7816_S_WAIT_TPDU == iso_state) {
change_state(ISO7816_S_IN_TPDU);
}
process_byte_tpdu(byte);
break;
case ISO7816_S_IN_PPS_REQ:
case ISO7816_S_IN_PPS_RSP:
process_byte_pps(byte);
break;
default:
TRACE_ERROR("Data received in unknown state %u\n\r", iso_state);
}
}
/* Use timeout to detect interrupted data transmission */
if (entry & RBUF16_F_TIMEOUT_WT) {
TRACE_ERROR("USART TIMEOUT Error\n\r");
switch (iso_state) {
case ISO7816_S_IN_ATR:
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
usb_send_atr(SNIFF_DATA_FLAG_ERROR_INCOMPLETE); /* send incomplete ATR to host software using USB */
change_state(ISO7816_S_WAIT_ATR);
break;
case ISO7816_S_IN_TPDU:
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
usb_send_tpdu(SNIFF_DATA_FLAG_ERROR_INCOMPLETE); /* send incomplete PPS to host software using USB */
change_state(ISO7816_S_WAIT_TPDU);
break;
case ISO7816_S_IN_PPS_REQ:
case ISO7816_S_IN_PPS_RSP:
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
usb_send_pps(SNIFF_DATA_FLAG_ERROR_INCOMPLETE); /* send incomplete TPDU to host software using USB */
change_state(ISO7816_S_WAIT_TPDU);
break;
default:
break;
case ISO7816_S_IN_TPDU: /* More TPDU data incoming */
if (ISO7816_S_WAIT_TPDU == iso_state) {
change_state(ISO7816_S_IN_TPDU);
}
process_byte_tpdu(byte);
break;
case ISO7816_S_IN_PPS_REQ:
case ISO7816_S_IN_PPS_RSP:
process_byte_pps(byte);
break;
default:
TRACE_ERROR("Data received in unknown state %u\n\r", iso_state);
}
if (entry & RBUF16_F_PARITY)
TRACE_ERROR("USART PARITY Error\r\n");
if (entry & RBUF16_F_FRAMING)
TRACE_ERROR("USART FRAMING Error\r\n");
if (entry & RBUF16_F_OVERRUN)
TRACE_ERROR("USART OVERRUN Error\r\n");
if (entry & RBUF16_F_BREAK)
TRACE_ERROR("USART BREAK Error\r\n");
}
/* Handle flags */
@@ -1170,6 +1067,30 @@ void Sniffer_run(void)
printf("reset de-asserted\n\r");
}
}
if (change_flags & SNIFF_CHANGE_FLAG_TIMEOUT_WT) {
/* Use timeout to detect interrupted data transmission */
switch (iso_state) {
case ISO7816_S_IN_ATR:
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
usb_send_atr(SNIFF_DATA_FLAG_ERROR_INCOMPLETE); /* send incomplete ATR to host software using USB */
change_state(ISO7816_S_WAIT_ATR);
break;
case ISO7816_S_IN_TPDU:
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
usb_send_tpdu(SNIFF_DATA_FLAG_ERROR_INCOMPLETE); /* send incomplete PPS to host software using USB */
change_state(ISO7816_S_WAIT_TPDU);
break;
case ISO7816_S_IN_PPS_REQ:
case ISO7816_S_IN_PPS_RSP:
led_blink(LED_RED, BLINK_2F_O); /* indicate error to user */
usb_send_pps(SNIFF_DATA_FLAG_ERROR_INCOMPLETE); /* send incomplete TPDU to host software using USB */
change_state(ISO7816_S_WAIT_TPDU);
break;
default:
change_flags &= ~SNIFF_CHANGE_FLAG_TIMEOUT_WT; /* We don't care about the timeout is all other cases */
break;
}
}
if (change_flags) {
usb_send_change(change_flags); /* send timeout to host software over USB */
change_flags = 0; /* Reset flags */

View File

@@ -11,6 +11,10 @@
* 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>

View File

@@ -206,7 +206,7 @@ static const SIMTraceDriverConfigurationDescriptorSniffer
SIMTRACE_USB_EP_CARD_INT),
.bmAttributes = USBEndpointDescriptor_INTERRUPT,
.wMaxPacketSize = USBEndpointDescriptor_MAXINTERRUPTSIZE_FS,
.bInterval = 1,
.bInterval = 0x10,
},
DFURT_IF_DESCRIPTOR(1, 0),
};
@@ -382,7 +382,7 @@ static const SIMTraceDriverConfigurationDescriptorPhone
SIMTRACE_CARDEM_USB_EP_USIM1_INT),
.bmAttributes = USBEndpointDescriptor_INTERRUPT,
.wMaxPacketSize = USBEndpointDescriptor_MAXINTERRUPTSIZE_FS,
.bInterval = 1
.bInterval = 0x10
},
#ifdef CARDEMU_SECOND_UART
/* Communication class interface standard descriptor */
@@ -429,7 +429,7 @@ static const SIMTraceDriverConfigurationDescriptorPhone
SIMTRACE_CARDEM_USB_EP_USIM2_INT),
.bmAttributes = USBEndpointDescriptor_INTERRUPT,
.wMaxPacketSize = USBEndpointDescriptor_MAXINTERRUPTSIZE_FS,
.bInterval = 1,
.bInterval = 0x10,
},
DFURT_IF_DESCRIPTOR(2, 0),
#else
@@ -547,7 +547,7 @@ static const SIMTraceDriverConfigurationDescriptorMITM
CCID_EPT_NOTIFICATION),
.bmAttributes = USBEndpointDescriptor_INTERRUPT,
.wMaxPacketSize = USBEndpointDescriptor_MAXINTERRUPTSIZE_FS,
.bInterval = 1,
.bInterval = 0x10,
},
/* Communication class interface standard descriptor */
@@ -593,7 +593,7 @@ static const SIMTraceDriverConfigurationDescriptorMITM
SIMTRACE_USB_EP_PHONE_INT),
.bmAttributes = USBEndpointDescriptor_INTERRUPT,
.wMaxPacketSize = USBEndpointDescriptor_MAXINTERRUPTSIZE_FS,
.bInterval = 1
.bInterval = 0x10
},
DFURT_IF_DESCRIPTOR(2, 0),
};
@@ -689,7 +689,6 @@ void SIMtrace_USB_Initialize(void)
{
unsigned int i;
/* Signal USB reset by disabling the pull-up on USB D+ for at least 10 ms */
USBD_HAL_Disconnect();
USBD_HAL_Suspend();
mdelay(500);
USBD_HAL_Activate();

View File

@@ -9,6 +9,10 @@
* 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 "board.h"
#include "trace.h"

View File

@@ -14,6 +14,10 @@
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#pragma once

View File

@@ -14,6 +14,10 @@
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#pragma once

View File

@@ -14,6 +14,10 @@
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#pragma once

View File

@@ -11,6 +11,10 @@
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., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
linux/include/linux/rbtree.h

View File

@@ -13,6 +13,10 @@
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
#include <stdint.h>

Some files were not shown because too many files have changed in this diff Show More