From 5876fc9121053a911e9fe94675a2c7b6f9659e6b Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 9 Mar 2019 15:25:53 -0800 Subject: [PATCH 01/26] CPLD: Remove SVF file I'd intended to use in PortaPack... The situation's changed. --- firmware/cpld/sgpio_if/default.svf | 2079 ---------------------------- 1 file changed, 2079 deletions(-) delete mode 100644 firmware/cpld/sgpio_if/default.svf diff --git a/firmware/cpld/sgpio_if/default.svf b/firmware/cpld/sgpio_if/default.svf deleted file mode 100644 index 2f98c5a9..00000000 --- a/firmware/cpld/sgpio_if/default.svf +++ /dev/null @@ -1,2079 +0,0 @@ -// Created using Xilinx Cse Software [ISE - 14.7] -// Date: Mon Jan 21 16:18:31 2019 - -TRST OFF; -ENDIR IDLE; -ENDDR IDLE; -STATE RESET; -STATE IDLE; -FREQUENCY 1E6 HZ; -//Operation: Erase -p 0 -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -//Loading device with 'idcode' instruction. -SIR 8 TDI (01) SMASK (ff) ; -SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f6e5f093) MASK (0fff8fff) ; -//Check for Read/Write Protect. -SIR 8 TDI (ff) TDO (01) MASK (03) ; -//Boundary Scan Chain Contents -//Position 1: xc2c64a -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -//Loading device with 'idcode' instruction. -SIR 8 TDI (01) ; -SDR 32 TDI (00000000) TDO (f6e5f093) ; -//Check for Read/Write Protect. -SIR 8 TDI (ff) TDO (01) MASK (03) ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -// Loading devices with 'enable' or 'bypass' instruction. -SIR 8 TDI (e8) ; -// Loading devices with 'erase' or 'bypass' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (ed) SMASK (ff) ; -ENDIR IDLE; -STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRPAUSE; -RUNTEST DRPAUSE 20 TCK; -STATE IDLE; -RUNTEST IDLE 100000 TCK; -STATE DRPAUSE; -RUNTEST DRPAUSE 5000 TCK; -RUNTEST IDLE 1 TCK; -// Loading devices with 'init' or 'bypass' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IDLE; -RUNTEST IDLE 20 TCK; -// Loading devices with 'init' or 'bypass' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRUPDATE IDLE; -RUNTEST 800 TCK; -ENDIR IDLE; -// Loading devices with 'conld' or 'bypass' instruction. -SIR 8 TDI (c0) ; -RUNTEST 100 TCK; -// Loading devices with 'conld' or 'bypass' instruction. -SIR 8 TDI (c0) ; -RUNTEST 100 TCK; -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -SIR 8 TDI (ff) ; -SDR 1 TDI (00) SMASK (01) ; -//Operation: Program -p 0 -e -v -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -//Loading device with 'idcode' instruction. -SIR 8 TDI (01) ; -SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f6e5f093) MASK (0fff8fff) ; -//Check for Read/Write Protect. -SIR 8 TDI (ff) TDO (01) MASK (03) ; -//Boundary Scan Chain Contents -//Position 1: xc2c64a -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -//Loading device with 'idcode' instruction. -SIR 8 TDI (01) ; -SDR 32 TDI (00000000) TDO (f6e5f093) ; -//Check for Read/Write Protect. -SIR 8 TDI (ff) TDO (01) MASK (03) ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -// Loading devices with 'enable' or 'bypass' instruction. -SIR 8 TDI (e8) ; -// Loading devices with 'erase' or 'bypass' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (ed) SMASK (ff) ; -ENDIR IDLE; -STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRPAUSE; -RUNTEST DRPAUSE 20 TCK; -STATE IDLE; -RUNTEST IDLE 100000 TCK; -STATE DRPAUSE; -RUNTEST DRPAUSE 5000 TCK; -RUNTEST IDLE 1 TCK; -// Loading devices with 'init' or 'bypass' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IDLE; -RUNTEST IDLE 20 TCK; -// Loading devices with 'init' or 'bypass' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRUPDATE IDLE; -RUNTEST 800 TCK; -ENDIR IDLE; -// Loading devices with 'conld' or 'bypass' instruction. -SIR 8 TDI (c0) ; -RUNTEST 100 TCK; -// Loading devices with 'conld' or 'bypass' instruction. -SIR 8 TDI (c0) ; -RUNTEST 100 TCK; -// Loading devices with 'enable' or 'bypass' instruction. -SIR 8 TDI (e8) ; -// Programming. -// Loading devices with 'program' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (ea) ; -SDR 281 TDI (0003c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) SMASK (01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -ENDIR IDLE; -RUNTEST 10000 TCK; -SDR 281 TDI (0103f9fffffffffffffffff7fffffffffffbbe777fffffffffffffffffffffffffffba7f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0180f9ffffffffffffffffffdffffffffffbbe777ffffffffffffffff7fffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0083c1fffffffffffffffffffffdfffffffbbe777ffffffffdfffffffffffffffffffe0f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00c3f9ffffffffffffffffffff7ffffffffbbefffffffffffffffffffffffffffffffe7f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01c0f9fffffffffffffffffffffffffffffddf7fffffefbefbffbfffefbefffffffff27c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0143c1ffffffffffffffffffffffffffffffff777fffffdffffffffffffffffffffffe0f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0043f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0060f9ffffffffffffffffffffffffffffffff777ffff7fffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0163c1fffffffffffffffffffffff7fffffbbe777fffffffffffdffffffffffffffffecf) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01e3f9ffffffffffffffffffffffffdffffafe777fffffff7ffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00e0f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe83) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00a3c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01a3f9ffffffffffffffffffffffffffffffff5f7fffffffffffffffffff7ffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0120f9fffffffffffffffdfffffffffffffafeffffffffffffffffffffffffffffffff03) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0023c1fffffffffffffffffffffffffffdebfefffffffffffffffffffffffffffffffecf) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0033f9ffffffffffffffffffffffffff7ffafe5f7fffffffffffffffffdffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0130f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01b3c1fffffffffffffffffffffffffffffddf7fffffffffffffffffffffffffffffba0f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00b3f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00f0f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01f3cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0173d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0072fdffffffffffffffffffffffffffffffe607fffffffffffffffffffffffffffffe79) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0053cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffccf) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0153d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01d2fdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff903) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00d3cdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0093d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7d) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0192fdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe78) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0113cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0013d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (001afdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) ; -RUNTEST 10000 TCK; -SDR 281 TDI (011bcdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) ; -RUNTEST 10000 TCK; -SDR 281 TDI (019bd9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (009afdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00dbcdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01dbd9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (015afdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) ; -RUNTEST 10000 TCK; -SDR 281 TDI (005bcdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) ; -RUNTEST 10000 TCK; -SDR 281 TDI (007bd9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (017afdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01fbcdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00fbd9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00bafdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01bbcdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) ; -RUNTEST 10000 TCK; -SDR 281 TDI (013bd9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (003afdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03) ; -RUNTEST 10000 TCK; -SDR 281 TDI (002bc9fffffffffffffffff7fffffffffffffefefbfffffffffffffffffffffffffffe4f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0128d9fffffffffff7fffffffffffffffffffefefbfffffffffffffffffffffffffffe69) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01ab01ffffffff7ffffffffffffffffffffffefefbfffffffffffffffffffffffffffe79) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00abc1fffffffffffffefffffffffffffffffefeeffffffffffffffffffffffffffffe4f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00eae1ffffffffffffffffffffffffdffffffefeeffffffffffffffffffffffffffffe69) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01e879332b5554ffeffeffefbfffffbefbfbbefffffffffffffffffffffffffffffffe79) ; -RUNTEST 10000 TCK; -SDR 281 TDI (016bc9fffffff7fffffffffffffffffffffd7e7eeffff7ffffffffffffffffffffeffe4f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0068c1f5fffffffffffffffffffffffffffdf67efbfffffffffffffffffffffffffbfe69) ; -RUNTEST 10000 TCK; -SDR 281 TDI (004b45ffeffffffffffffffffffffffffffbbefffffffffffffffffffffffffffffffe79) ; -RUNTEST 10000 TCK; -SDR 281 TDI (014bc1fffffffffffffffffffffffffffdfffefeeffffffffffffffffffffffffffffe4f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01cbf9fffffffdfffffffffffffffffffffffefebffffffffffffffffffffffffffffe69) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00c8f9ddaffffffffffffffffffffffffffffefafffffffffffffffffffffffffffffe79) ; -RUNTEST 10000 TCK; -SDR 281 TDI (008bc9ffffffffffffffffffdffffffffffffefeeffffffffffffffffffffffffffffe4f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0188c1ffffffffffffffffffffffffff7ffffefeeffffffffffffffffffffffffffffe69) ; -RUNTEST 10000 TCK; -SDR 281 TDI (010b45ff5ffffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe79) ; -RUNTEST 10000 TCK; -SDR 281 TDI (000bc1ffffdffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe4f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (000ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe69) ; -RUNTEST 10000 TCK; -SDR 281 TDI (010cf9ffffff7ffffffffffffffffffffffffefeeffffffffffffffffffffffffffffe79) ; -RUNTEST 10000 TCK; -SDR 281 TDI (018fc9fffffdfffffffffffffffffffffffffefebffffffffffffffffffffffffffffe4f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (008cc1ffff7ffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe69) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00cf44aabffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe79) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01cfc1ffeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (014ee1ffefbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe69) ; -RUNTEST 10000 TCK; -SDR 281 TDI (004c79ffeffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffe79) ; -RUNTEST 10000 TCK; -SDR 281 TDI (006fc9ffe7edfffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (016cc1fffffffffffffffffffffffffffffff9fffffffffffffffffffffffffffffffe7f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01ef45fff7ff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00efc9ffe7ffb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00acc1ffffffdffffffffffffffffffffffffefeeffffffffffffffffffffffffffffe7f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01af45fffff7fffffffffffffffffffffffffefebffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (012fc1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (002ee1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (003c79fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (013fc1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01bee1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00bc79fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00ffc1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01fff8bffffffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe09) ; -RUNTEST 10000 TCK; -SDR 281 TDI (017cf9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7d) ; -RUNTEST 10000 TCK; -SDR 281 TDI (007fc976fffffffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe0f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (005cc0abfffffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe7d) ; -RUNTEST 10000 TCK; -SDR 281 TDI (015f45fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe83) ; -RUNTEST 10000 TCK; -SDR 281 TDI (01dfc9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (00dcc1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (009f45fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (019fc9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (011cc1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; -RUNTEST 10000 TCK; -SDR 281 TDI (001f45fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 10000 TCK; -SDR 281 TDI (0117ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 10000 TCK; -// Loading devices with 'init' or 'bypass' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IDLE; -RUNTEST IDLE 20 TCK; -// Loading devices with 'init' or 'bypass' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRUPDATE IDLE; -RUNTEST 800 TCK; -ENDIR IDLE; -// Loading devices with 'conld' or 'bypass' instruction. -SIR 8 TDI (c0) ; -RUNTEST 100 TCK; -// Loading devices with 'conld' or 'bypass' instruction. -SIR 8 TDI (c0) ; -RUNTEST 100 TCK; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -//Loading device with 'enable' instruction. -SIR 8 TDI (e8) ; -//Loading device with 'enable' instruction. -SIR 8 TDI (e8) ; -// Verification. -// Loading device with a 'verify' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (ee) ; -ENDDR DRPAUSE; -SDR 7 TDI (00) SMASK (7f) ; -ENDIR IDLE; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (40) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffff7fffffffffffbbe777fffffffffffffffffffffffffffba7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (60) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffdffffffffffbbe777ffffffffffffffff7fffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (20) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffdfffffffbbe777ffffffffdfffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (30) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9ffffffffffffffffffff7ffffffffbbefffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (70) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffddf7fffffefbefbffbfffefbefffffffff27c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (50) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffffffffffffffffffffffffffffffff777fffffdffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (10) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (18) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffffffffffffffff777ffff7fffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (58) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffff7fffffbbe777fffffffffffdffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (78) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9ffffffffffffffffffffffffdffffafe777fffffff7ffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (38) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe83) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (28) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (68) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9ffffffffffffffffffffffffffffffff5f7fffffffffffffffffff7ffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (48) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffdfffffffffffffafeffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (08) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffdebfefffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (0c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9ffffffffffffffffffffffffff7ffafe5f7fffffffffffffffffdffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (4c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (6c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffddf7fffffffffffffffffffffffffffffba0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (2c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (3c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (7c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4f) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (5c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (1c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffe607fffffffffffffffffffffffffffffe79) MASK ( -03fffffffffffffffffffffffffffffe001ff801ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (14) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffccf) MASK ( -03fffffffffffffffffffffffffffffe001f8001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (54) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87c) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (74) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff903) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (34) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860f) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (24) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7d) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (64) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe78) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (44) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (04) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (06) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (46) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (66) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (26) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (36) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (76) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (56) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (16) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (1e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (5e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (7e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (3e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (2e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (6e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (4e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (0e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (0a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffff7fffffffffffffefefbfffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (4a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00d9fffffffffff7fffffffffffffffffffefefbfffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (6a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0301ffffffff7ffffffffffffffffffffffefefbfffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (2a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffefffffffffffffffffefeeffffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (3a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1ffffffffffffffffffffffffdffffffefeeffffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (7a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0079332b5554ffeffeffefbfffffbefbfbbefffffffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (5a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffff7fffffffffffffffffffffd7e7eeffff7ffffffffffffffffffffeffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (1a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1f5fffffffffffffffffffffffffffdf67efbfffffffffffffffffffffffffbfe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (12) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345ffeffffffffffffffffffffffffffbbefffffffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (52) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffdfffefeeffffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (72) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffdfffffffffffffffffffffffefebffffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (32) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ddaffffffffffffffffffffffffffffefafffffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (22) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9ffffffffffffffffffdffffffffffffefeeffffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (62) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1ffffffffffffffffffffffffff7ffffefeeffffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (42) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345ff5ffffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (02) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffffdffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (03) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (43) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffff7ffffffffffffffffffffffffefeeffffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (63) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffdfffffffffffffffffffffffffefebffffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (23) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1ffff7ffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (33) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0344aabffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe79) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (73) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (53) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1ffefbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe69) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (13) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0079ffeffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffe79) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (1b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9ffe7edfffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (5b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1fffffffffffffffffffffffffffffff9fffffffffffffffffffffffffffffffe7f) MASK ( -03fffffffffffffffffffffffffffffe00078001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (7b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345fff7ff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (3b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9ffe7ffb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (2b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1ffffffdffffffffffffffffffffffffefeeffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (6b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345fffff7fffffffffffffffffffffffffefebffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (4b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (0b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (0f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0079fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (4f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (6f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (2f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0079fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (3f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (7f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f8bffffffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe09) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (5f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7d) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (1f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c976fffffffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (17) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c0abfffffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe7d) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (57) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe83) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (77) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (37) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (27) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (67) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (47) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (07) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (05) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) MASK ( -0000000000000000000000000000000000000000000000000000000000000000000000) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (45) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -// masking lower UES bits. -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) MASK ( -0000000000000000000000000000000000000000000000000000000000000000000000) ; -RUNTEST 100 TCK; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IDLE; -RUNTEST IDLE 20 TCK; -ENDIR IRPAUSE; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRUPDATE IDLE; -RUNTEST 800 TCK; -ENDIR IDLE; -//Loading device with 'conld' instruction. -SIR 8 TDI (c0) ; -RUNTEST IDLE 100 TCK; -//Loading device with 'enable' instruction. -SIR 8 TDI (e8) ; -// Setting Done bit ... -// Loading device with a 'program' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (ea) ; -SDR 281 TDI (0017fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -ENDIR IDLE; -RUNTEST 10000 TCK; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IDLE; -RUNTEST IDLE 20 TCK; -ENDIR IRPAUSE; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRUPDATE IDLE; -RUNTEST 800 TCK; -ENDIR IDLE; -//Loading device with 'conld' instruction. -SIR 8 TDI (c0) ; -RUNTEST IDLE 100 TCK; -//Loading device with 'idcode' instruction. -SIR 8 TDI (01) ; -SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f6e5f093) MASK (0fff8fff) ; -//Check for Done bit. -SIR 8 TDI (ff) TDO (05) MASK (07) ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -SIR 8 TDI (ff) ; -SDR 1 TDI (00) SMASK (01) ; -//Operation: Verify -p 0 -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -//Loading device with 'idcode' instruction. -SIR 8 TDI (01) ; -SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f6e5f093) MASK (0fff8fff) ; -//Check for Read/Write Protect. -SIR 8 TDI (ff) TDO (01) MASK (03) ; -//Boundary Scan Chain Contents -//Position 1: xc2c64a -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -//Loading device with 'idcode' instruction. -SIR 8 TDI (01) ; -SDR 32 TDI (00000000) TDO (f6e5f093) ; -//Check for Read/Write Protect. -SIR 8 TDI (ff) TDO (01) MASK (03) ; -//Loading device with 'bypass' instruction. -SIR 8 TDI (ff) ; -//Loading device with 'enable' instruction. -SIR 8 TDI (e8) ; -//Loading device with 'enable' instruction. -SIR 8 TDI (e8) ; -//Loading device with 'enable' instruction. -SIR 8 TDI (e8) ; -// Verification. -// Loading device with a 'verify' instruction. -ENDIR IRPAUSE; -SIR 8 TDI (ee) ; -ENDDR DRPAUSE; -SDR 7 TDI (00) SMASK (7f) ; -ENDIR IDLE; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (40) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffff7fffffffffffbbe777fffffffffffffffffffffffffffba7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (60) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffdffffffffffbbe777ffffffffffffffff7fffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (20) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffdfffffffbbe777ffffffffdfffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (30) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9ffffffffffffffffffff7ffffffffbbefffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (70) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffddf7fffffefbefbffbfffefbefffffffff27c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (50) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffffffffffffffffffffffffffffffff777fffffdffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (10) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (18) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffffffffffffffff777ffff7fffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (58) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffff7fffffbbe777fffffffffffdffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (78) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9ffffffffffffffffffffffffdffffafe777fffffff7ffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (38) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe83) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (28) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (68) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9ffffffffffffffffffffffffffffffff5f7fffffffffffffffffff7ffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (48) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffdfffffffffffffafeffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (08) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffdebfefffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (0c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9ffffffffffffffffffffffffff7ffafe5f7fffffffffffffffffdffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (4c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (6c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffddf7fffffffffffffffffffffffffffffba0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (2c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (3c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (7c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4f) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (5c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (1c) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffe607fffffffffffffffffffffffffffffe79) MASK ( -03fffffffffffffffffffffffffffffe001ff801ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (14) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffccf) MASK ( -03fffffffffffffffffffffffffffffe001f8001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (54) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87c) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (74) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff903) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (34) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860f) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (24) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7d) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (64) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe78) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (44) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (04) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (06) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (46) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (66) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (26) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (36) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (76) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (56) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (16) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (1e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (5e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (7e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (3e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (2e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (6e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecf) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (4e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (0e) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (0a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffff7fffffffffffffefefbfffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (4a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00d9fffffffffff7fffffffffffffffffffefefbfffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (6a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0301ffffffff7ffffffffffffffffffffffefefbfffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (2a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffefffffffffffffffffefeeffffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (3a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1ffffffffffffffffffffffffdffffffefeeffffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (7a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0079332b5554ffeffeffefbfffffbefbfbbefffffffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (5a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffff7fffffffffffffffffffffd7e7eeffff7ffffffffffffffffffffeffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (1a) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1f5fffffffffffffffffffffffffffdf67efbfffffffffffffffffffffffffbfe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (12) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345ffeffffffffffffffffffffffffffbbefffffffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (52) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffdfffefeeffffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (72) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffdfffffffffffffffffffffffefebffffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (32) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ddaffffffffffffffffffffffffffffefafffffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (22) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9ffffffffffffffffffdffffffffffffefeeffffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (62) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1ffffffffffffffffffffffffff7ffffefeeffffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (42) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345ff5ffffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (02) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffffdffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (03) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (43) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffff7ffffffffffffffffffffffffefeeffffffffffffffffffffffffffffe79) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (63) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffdfffffffffffffffffffffffffefebffffffffffffffffffffffffffffe4f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (23) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1ffff7ffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe69) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (33) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0344aabffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe79) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (73) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (53) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1ffefbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe69) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (13) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0079ffeffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffe79) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (1b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9ffe7edfffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (5b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1fffffffffffffffffffffffffffffff9fffffffffffffffffffffffffffffffe7f) MASK ( -03fffffffffffffffffffffffffffffe00078001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (7b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345fff7ff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (3b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9ffe7ffb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (2b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1ffffffdffffffffffffffffffffffffefeeffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (6b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345fffff7fffffffffffffffffffffffffefebffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (4b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (0b) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (0f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0079fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (4f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (6f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (2f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0079fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (3f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (7f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f8bffffffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe09) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (5f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7d) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (1f) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c976fffffffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (17) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c0abfffffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe7d) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (57) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe83) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (77) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (37) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (27) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (67) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (47) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (07) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0345fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( -03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (05) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) MASK ( -0000000000000000000000000000000000000000000000000000000000000000000000) ; -RUNTEST 100 TCK; -ENDDR DRPAUSE; -SDR 7 TDI (45) SMASK (7f) ; -RUNTEST DRPAUSE 20 TCK; -ENDDR IDLE; -RUNTEST IDLE 100 TCK; -// masking lower UES bits. -SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) MASK ( -0000000000000000000000000000000000000000000000000000000000000000000000) ; -RUNTEST 100 TCK; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IDLE; -RUNTEST IDLE 20 TCK; -ENDIR IRPAUSE; -SIR 8 TDI (f0) SMASK (ff) ; -STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRUPDATE IDLE; -RUNTEST 800 TCK; -ENDIR IDLE; -//Loading device with 'conld' instruction. -SIR 8 TDI (c0) ; -RUNTEST IDLE 100 TCK; -//Loading device with 'idcode' instruction. -SIR 8 TDI (01) ; -SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f6e5f093) MASK (0fff8fff) ; -//Check for Done bit. -SIR 8 TDI (ff) TDO (05) MASK (07) ; -//Loading device with 'conld' instruction. -SIR 8 TDI (c0) ; -RUNTEST IDLE 100 TCK; -//Loading device with 'bypass' instruction. -SIR 8 TDI (ff) ; -TIR 0 ; -HIR 0 ; -HDR 0 ; -TDR 0 ; -TIR 0 ; -HIR 0 ; -TDR 0 ; -HDR 0 ; -SIR 8 TDI (ff) ; -SDR 1 TDI (00) SMASK (01) ; From 16d36c54aab3b14d580fec51e4646f4f62314c20 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 9 Mar 2019 16:34:14 -0800 Subject: [PATCH 02/26] CPLD: Extract row addresses so I can output to C file. --- firmware/tools/cpld_bitstream.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/firmware/tools/cpld_bitstream.py b/firmware/tools/cpld_bitstream.py index ac70742f..81c8c944 100755 --- a/firmware/tools/cpld_bitstream.py +++ b/firmware/tools/cpld_bitstream.py @@ -6,6 +6,7 @@ bits_of_address = 7 bits_of_data = 274 bytes_of_data = (bits_of_data + 7) // 8 bits_in_program_row = bits_of_address + bits_of_data +address_sequence = (0x00, 0x40, 0x60, 0x20, 0x30, 0x70, 0x50, 0x10, 0x18, 0x58, 0x78, 0x38, 0x28, 0x68, 0x48, 0x08, 0x0c, 0x4c, 0x6c, 0x2c, 0x3c, 0x7c, 0x5c, 0x1c, 0x14, 0x54, 0x74, 0x34, 0x24, 0x64, 0x44, 0x04, 0x06, 0x46, 0x66, 0x26, 0x36, 0x76, 0x56, 0x16, 0x1e, 0x5e, 0x7e, 0x3e, 0x2e, 0x6e, 0x4e, 0x0e, 0x0a, 0x4a, 0x6a, 0x2a, 0x3a, 0x7a, 0x5a, 0x1a, 0x12, 0x52, 0x72, 0x32, 0x22, 0x62, 0x42, 0x02, 0x03, 0x43, 0x63, 0x23, 0x33, 0x73, 0x53, 0x13, 0x1b, 0x5b, 0x7b, 0x3b, 0x2b, 0x6b, 0x4b, 0x0b, 0x0f, 0x4f, 0x6f, 0x2f, 0x3f, 0x7f, 0x5f, 0x1f, 0x17, 0x57, 0x77, 0x37, 0x27, 0x67, 0x47, 0x07, 0x05, 0x45,) def values_list_line_wrap(values): line_length = 16 @@ -102,8 +103,6 @@ def extract_programming_data(commands): } def validate_programming_data(programming_data): - expected_address_sequence = (0x00, 0x40, 0x60, 0x20, 0x30, 0x70, 0x50, 0x10, 0x18, 0x58, 0x78, 0x38, 0x28, 0x68, 0x48, 0x08, 0x0c, 0x4c, 0x6c, 0x2c, 0x3c, 0x7c, 0x5c, 0x1c, 0x14, 0x54, 0x74, 0x34, 0x24, 0x64, 0x44, 0x04, 0x06, 0x46, 0x66, 0x26, 0x36, 0x76, 0x56, 0x16, 0x1e, 0x5e, 0x7e, 0x3e, 0x2e, 0x6e, 0x4e, 0x0e, 0x0a, 0x4a, 0x6a, 0x2a, 0x3a, 0x7a, 0x5a, 0x1a, 0x12, 0x52, 0x72, 0x32, 0x22, 0x62, 0x42, 0x02, 0x03, 0x43, 0x63, 0x23, 0x33, 0x73, 0x53, 0x13, 0x1b, 0x5b, 0x7b, 0x3b, 0x2b, 0x6b, 0x4b, 0x0b, 0x0f, 0x4f, 0x6f, 0x2f, 0x3f, 0x7f, 0x5f, 0x1f, 0x17, 0x57, 0x77, 0x37, 0x27, 0x67, 0x47, 0x07, 0x05, 0x45,) - # Validate program blocks: # There should be two extracted program blocks. The first contains the @@ -113,7 +112,7 @@ def validate_programming_data(programming_data): # First program phase writes the bitstream to flash (or SRAM) with # special bit(s) not asserted, so the bitstream is not yet valid. - assert(extract_addresses(programming_data['program'][0]) == expected_address_sequence) + assert(extract_addresses(programming_data['program'][0]) == address_sequence) # Second program phase updates a single row to finish the programming # process. @@ -129,8 +128,8 @@ def validate_programming_data(programming_data): assert(programming_data['verify'][0] == programming_data['verify'][1]) # Check the row address order of the second verify block. - assert(extract_addresses(programming_data['verify'][0]) == expected_address_sequence) - assert(extract_addresses(programming_data['verify'][1]) == expected_address_sequence) + assert(extract_addresses(programming_data['verify'][0]) == address_sequence) + assert(extract_addresses(programming_data['verify'][1]) == address_sequence) # Checks across programming and verification: From 88dd1b2ad4787455b5b4d1f1dbdb330aaf88902c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 9 Mar 2019 16:35:10 -0800 Subject: [PATCH 03/26] CPLD: Output row address table to C file, use it in program/verify code. --- firmware/common/cpld_xc2c.c | 16 +++------------- firmware/common/cpld_xc2c.h | 5 +++++ firmware/tools/cpld_bitstream.py | 5 +++++ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/firmware/common/cpld_xc2c.c b/firmware/common/cpld_xc2c.c index d43221b4..4806fe43 100644 --- a/firmware/common/cpld_xc2c.c +++ b/firmware/common/cpld_xc2c.c @@ -26,16 +26,6 @@ #include #include -static const uint8_t cpld_xc2c64a_row_address[CPLD_XC2C64A_ROWS] = { - 0x00, 0x40, 0x60, 0x20, 0x30, 0x70, 0x50, 0x10, 0x18, 0x58, 0x78, 0x38, 0x28, 0x68, 0x48, 0x08, - 0x0c, 0x4c, 0x6c, 0x2c, 0x3c, 0x7c, 0x5c, 0x1c, 0x14, 0x54, 0x74, 0x34, 0x24, 0x64, 0x44, 0x04, - 0x06, 0x46, 0x66, 0x26, 0x36, 0x76, 0x56, 0x16, 0x1e, 0x5e, 0x7e, 0x3e, 0x2e, 0x6e, 0x4e, 0x0e, - 0x0a, 0x4a, 0x6a, 0x2a, 0x3a, 0x7a, 0x5a, 0x1a, 0x12, 0x52, 0x72, 0x32, 0x22, 0x62, 0x42, 0x02, - 0x03, 0x43, 0x63, 0x23, 0x33, 0x73, 0x53, 0x13, 0x1b, 0x5b, 0x7b, 0x3b, 0x2b, 0x6b, 0x4b, 0x0b, - 0x0f, 0x4f, 0x6f, 0x2f, 0x3f, 0x7f, 0x5f, 0x1f, 0x17, 0x57, 0x77, 0x37, 0x27, 0x67, 0x47, 0x07, - 0x05, 0x45, -}; - typedef enum { CPLD_XC2C_IR_INTEST = 0b00000010, CPLD_XC2C_IR_BYPASS = 0b11111111, @@ -292,7 +282,7 @@ bool cpld_xc2c64a_jtag_checksum( uint8_t dr[CPLD_XC2C64A_BYTES_IN_ROW]; for(size_t row=0; rowmask_index[row]; @@ -388,7 +378,7 @@ void cpld_xc2c64a_jtag_sram_write( cpld_xc2c_jtag_sram_write(jtag); for(size_t row=0; rowrow[row].data[0]); } @@ -416,7 +406,7 @@ bool cpld_xc2c64a_jtag_sram_verify( const size_t mask_index = (data_row >= 0) ? verify->mask_index[data_row] : 0; const uint8_t* const expected = (data_row >= 0) ? &program->row[data_row].data[0] : NULL; const uint8_t* const mask = (data_row >= 0) ? &verify->mask[mask_index].value[0] : NULL; - const uint8_t next_address = (address_row < CPLD_XC2C64A_ROWS) ? cpld_xc2c64a_row_address[address_row] : 0; + const uint8_t next_address = (address_row < CPLD_XC2C64A_ROWS) ? cpld_hackrf_row_addresses.address[address_row] : 0; matched &= cpld_xc2c64a_jtag_sram_compare_row(jtag, expected, mask, next_address); } diff --git a/firmware/common/cpld_xc2c.h b/firmware/common/cpld_xc2c.h index ccd3c5f1..0fed6d1d 100644 --- a/firmware/common/cpld_xc2c.h +++ b/firmware/common/cpld_xc2c.h @@ -49,6 +49,10 @@ typedef struct { uint8_t mask_index[CPLD_XC2C64A_ROWS]; } cpld_xc2c64a_verify_t; +typedef struct { + uint8_t address[CPLD_XC2C64A_ROWS]; +} cpld_xc2c64a_row_addresses_t; + bool cpld_xc2c64a_jtag_checksum( const jtag_t* const jtag, const cpld_xc2c64a_verify_t* const verify, @@ -66,5 +70,6 @@ bool cpld_xc2c64a_jtag_sram_verify( extern const cpld_xc2c64a_program_t cpld_hackrf_program_sram; extern const cpld_xc2c64a_verify_t cpld_hackrf_verify; +extern const cpld_xc2c64a_row_addresses_t cpld_hackrf_row_addresses; #endif/*__CPLD_XC2C_H__*/ diff --git a/firmware/tools/cpld_bitstream.py b/firmware/tools/cpld_bitstream.py index 81c8c944..30d779cd 100755 --- a/firmware/tools/cpld_bitstream.py +++ b/firmware/tools/cpld_bitstream.py @@ -236,5 +236,10 @@ if args.code: '\t}', '};', '', + 'const cpld_xc2c64a_row_addresses_t cpld_hackrf_row_addresses = { {', + )) + result.extend(['\t%s' % line for line in hex_lines(address_sequence)]) + result.extend(( + '} };' )) print('\n'.join(result)) From 16fab90d4f6879f9bb2cc1585959cec757731c46 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Mar 2019 12:20:14 -0700 Subject: [PATCH 04/26] CPLD: Line endings oops. --- firmware/tools/cpld_bitstream.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/firmware/tools/cpld_bitstream.py b/firmware/tools/cpld_bitstream.py index 30d779cd..7bfaa062 100755 --- a/firmware/tools/cpld_bitstream.py +++ b/firmware/tools/cpld_bitstream.py @@ -240,6 +240,7 @@ if args.code: )) result.extend(['\t%s' % line for line in hex_lines(address_sequence)]) result.extend(( - '} };' + '} };', + '', )) print('\n'.join(result)) From b8f255356c7b68b424a4932fc3929efa59a8ebe1 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Mar 2019 12:22:51 -0700 Subject: [PATCH 05/26] CPLD: Change tool interface to accept --xsvf and --hackrf-data args. More args coming shortly... --- firmware/hackrf_usb/CMakeLists.txt | 2 +- firmware/tools/cpld_bitstream.py | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/firmware/hackrf_usb/CMakeLists.txt b/firmware/hackrf_usb/CMakeLists.txt index cc895b6c..271bf434 100644 --- a/firmware/hackrf_usb/CMakeLists.txt +++ b/firmware/hackrf_usb/CMakeLists.txt @@ -27,7 +27,7 @@ include(../hackrf-common.cmake) add_custom_command( OUTPUT ${PATH_HACKRF_CPLD_DATA_C} - COMMAND ${PATH_CPLD_BITSTREAM_TOOL} --code ${PATH_HACKRF_CPLD_XSVF} >${PATH_HACKRF_CPLD_DATA_C} + COMMAND ${PATH_CPLD_BITSTREAM_TOOL} --xsvf ${PATH_HACKRF_CPLD_XSVF} --hackrf-data ${PATH_HACKRF_CPLD_DATA_C} DEPENDS ${PATH_CPLD_BITSTREAM_TOOL} ${PATH_HACKRF_CPLD_XSVF} ) diff --git a/firmware/tools/cpld_bitstream.py b/firmware/tools/cpld_bitstream.py index 7bfaa062..2e201361 100755 --- a/firmware/tools/cpld_bitstream.py +++ b/firmware/tools/cpld_bitstream.py @@ -151,10 +151,10 @@ import argparse parser = argparse.ArgumentParser() action_group = parser.add_mutually_exclusive_group(required=True) action_group.add_argument('--checksum', action='store_true', help='Calculate bitstream read-back CRC32 value') -action_group.add_argument('--code', action='store_true', help='Generate C code for bitstream loading/programming/verification') +action_group.add_argument('--hackrf-data', type=str, help='C data file for HackRF bitstream loading/programming/verification') parser.add_argument('--crcmod', action='store_true', help='Use Python crcmod library instead of built-in CRC32 code') parser.add_argument('--debug', action='store_true', help='Enable debug output') -parser.add_argument('hackrf_xc2c_cpld_xsvf', type=str, help='HackRF Xilinx XC2C64A CPLD XSVF file containing erase/program/verify phases') +parser.add_argument('--xsvf', required=True, type=str, help='HackRF Xilinx XC2C64A CPLD XSVF file containing erase/program/verify phases') args = parser.parse_args() ####################################################################### @@ -162,7 +162,7 @@ args = parser.parse_args() # against the CPLD. ####################################################################### -with open(args.hackrf_xc2c_cpld_xsvf, "rb") as f: +with open(args.xsvf, "rb") as f: from xsvf import XSVFParser commands = XSVFParser().parse(f, debug=args.debug) @@ -202,7 +202,7 @@ if args.checksum: print('0x%s' % crc.hexdigest().lower()) -if args.code: +if args.hackrf_data: program_sram = make_sram_program(program_blocks) verify_block = verify_blocks[1] verify_masks = tuple(frozenset(extract_mask(verify_block))) @@ -243,4 +243,5 @@ if args.code: '} };', '', )) - print('\n'.join(result)) + with open(args.hackrf_data, 'w') as f: + f.write('\n'.join(result)) From 6bcd994e9ecf6da5ffad55b8aa6e6f22e9d4bbc8 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sun, 10 Mar 2019 12:56:29 -0700 Subject: [PATCH 06/26] CPLD: Add output for PortaPack C++ CPLD data. --- firmware/tools/cpld_bitstream.py | 35 ++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/firmware/tools/cpld_bitstream.py b/firmware/tools/cpld_bitstream.py index 2e201361..4adcad43 100755 --- a/firmware/tools/cpld_bitstream.py +++ b/firmware/tools/cpld_bitstream.py @@ -149,9 +149,10 @@ def make_sram_program(program_blocks): import argparse parser = argparse.ArgumentParser() -action_group = parser.add_mutually_exclusive_group(required=True) -action_group.add_argument('--checksum', action='store_true', help='Calculate bitstream read-back CRC32 value') +action_group = parser.add_argument_group(title='outputs') +action_group.add_argument('--checksum', action='store_true', help='Print bitstream verification CRC32 value') action_group.add_argument('--hackrf-data', type=str, help='C data file for HackRF bitstream loading/programming/verification') +action_group.add_argument('--portapack-data', type=str, help='C++ data file for PortaPack bitstream loading/programming/verification') parser.add_argument('--crcmod', action='store_true', help='Use Python crcmod library instead of built-in CRC32 code') parser.add_argument('--debug', action='store_true', help='Enable debug output') parser.add_argument('--xsvf', required=True, type=str, help='HackRF Xilinx XC2C64A CPLD XSVF file containing erase/program/verify phases') @@ -245,3 +246,33 @@ if args.hackrf_data: )) with open(args.hackrf_data, 'w') as f: f.write('\n'.join(result)) + +if args.portapack_data: + program_sram = make_sram_program(program_blocks) + verify_block = verify_blocks[1] + verify_masks = extract_mask(verify_block) + + result = [] + result.extend(( + '/*', + ' * WARNING: Auto-generated file. Do not edit.', + '*/', + '#include "hackrf_cpld_data.hpp"', + 'namespace hackrf {', + 'namespace one {', + 'namespace cpld {', + 'const ::cpld::xilinx::XC2C64A::verify_blocks_t verify_blocks { {', + )) + data_lines = [', '.join(['0x%02x' % n for n in row['data'].to_bytes(bytes_of_data, byteorder='big')]) for row in program_sram] + mask_lines = [', '.join(['0x%02x' % n for n in mask.to_bytes(bytes_of_data, byteorder='big')]) for mask in verify_masks] + lines = ['{ 0x%02x, { { %s } }, { { %s } } }' % data for data in zip(address_sequence, data_lines, mask_lines)] + result.extend('\t%s,' % line for line in lines) + result.extend(( + '} };', + '} /* namespace hackrf */', + '} /* namespace one */', + '} /* namespace cpld */', + '', + )) + with open(args.portapack_data, 'w') as f: + f.write('\n'.join(result)) From 12bb516cc01b4ac6bdd6a6f72444eac2e9f9c7e0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 18 Mar 2019 15:09:11 -0700 Subject: [PATCH 07/26] PortaPack: Extract non-UI code into separate portapack.[ch] module. I'll be adding some non-UI API functions to the top-level PortaPack structure. --- firmware/common/hackrf-ui.c | 11 +-- firmware/common/portapack.c | 109 +++++++++++++++++++++++++++++ firmware/common/portapack.h | 33 +++++++++ firmware/common/ui_portapack.c | 78 +-------------------- firmware/common/ui_portapack.h | 2 - firmware/hackrf_usb/CMakeLists.txt | 1 + 6 files changed, 151 insertions(+), 83 deletions(-) create mode 100644 firmware/common/portapack.c create mode 100644 firmware/common/portapack.h diff --git a/firmware/common/hackrf-ui.c b/firmware/common/hackrf-ui.c index 8dd8715a..23974135 100644 --- a/firmware/common/hackrf-ui.c +++ b/firmware/common/hackrf-ui.c @@ -21,7 +21,7 @@ #include "hackrf-ui.h" -#include "ui_portapack.h" +#include "portapack.h" #include "ui_rad1o.h" #include @@ -60,7 +60,7 @@ static const hackrf_ui_t hackrf_ui_null = { &hackrf_ui_set_antenna_bias_null, }; -const hackrf_ui_t* portapack_detect(void) __attribute__((weak)); +const portapack_t* portapack_init(void) __attribute__((weak)); const hackrf_ui_t* rad1o_ui_setup(void) __attribute__((weak)); static const hackrf_ui_t* ui = NULL; @@ -69,8 +69,11 @@ const hackrf_ui_t* hackrf_ui(void) { /* Detect on first use. If no UI hardware is detected, use a stub function table. */ if( ui == NULL ) { #ifdef HACKRF_ONE - if( portapack_detect ) { - ui = portapack_detect(); + if( portapack_init ) { + const portapack_t* const portapack = portapack_init(); + if( portapack != NULL ) { + ui = portapack->hackrf_ui; + } } #endif #ifdef RAD1O diff --git a/firmware/common/portapack.c b/firmware/common/portapack.c new file mode 100644 index 00000000..4c4f3a9b --- /dev/null +++ b/firmware/common/portapack.c @@ -0,0 +1,109 @@ +/* + * Copyright 2018 Jared Boone + * + * This file is part of HackRF. + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "portapack.h" +#include "hackrf_core.h" + +static bool jtag_pp_tck(const bool tms_value) { + gpio_write(jtag_cpld.gpio->gpio_pp_tms, tms_value); + + // 8 ns TMS/TDI to TCK setup + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + + gpio_set(jtag_cpld.gpio->gpio_tck); + + // 15 ns TCK to TMS/TDI hold time + // 20 ns TCK high time + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + + gpio_clear(jtag_cpld.gpio->gpio_tck); + + // 20 ns TCK low time + // 25 ns TCK falling edge to TDO valid + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + + return gpio_read(jtag_cpld.gpio->gpio_pp_tdo); +} + +static uint32_t jtag_pp_shift(const uint32_t tms_bits, const size_t count) { + uint32_t result = 0; + size_t bit_in_index = count - 1; + size_t bit_out_index = 0; + while(bit_out_index < count) { + const uint32_t tdo = jtag_pp_tck((tms_bits >> bit_in_index) & 1) & 1; + result |= (tdo << bit_out_index); + + bit_in_index--; + bit_out_index++; + } + + return result; +} + +static uint32_t jtag_pp_idcode(void) { + cpld_jtag_take(&jtag_cpld); + + /* TODO: Check if PortaPack TMS is floating or driven by an external device. */ + gpio_output(jtag_cpld.gpio->gpio_pp_tms); + + /* Test-Logic/Reset -> Run-Test/Idle -> Select-DR/Scan -> Capture-DR */ + jtag_pp_shift(0b11111010, 8); + + /* Shift-DR */ + const uint32_t idcode = jtag_pp_shift(0, 32); + + /* Exit1-DR -> Update-DR -> Run-Test/Idle -> ... -> Test-Logic/Reset */ + jtag_pp_shift(0b11011111, 8); + + cpld_jtag_release(&jtag_cpld); + + return idcode; +} + +static bool portapack_detect(void) { + return jtag_pp_idcode() == 0x020A50DD; +} + +extern const hackrf_ui_t portapack_hackrf_ui; + +const portapack_t portapack = { + &portapack_hackrf_ui, +}; + +const portapack_t* portapack_init(void) { + if( portapack_detect() ) { + return &portapack; + } else { + return NULL; + } +} \ No newline at end of file diff --git a/firmware/common/portapack.h b/firmware/common/portapack.h new file mode 100644 index 00000000..cd0a8f7a --- /dev/null +++ b/firmware/common/portapack.h @@ -0,0 +1,33 @@ +/* + * Copyright 2018 Jared Boone + * + * This file is part of HackRF. + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __PORTAPACK_H__ +#define __PORTAPACK_H__ + +#include "hackrf-ui.h" + +typedef struct { + const hackrf_ui_t* const hackrf_ui; +} portapack_t; + +const portapack_t* portapack_init(void); + +#endif/*__PORTAPACK_H__*/ diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index e8430af1..018a8cdb 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -455,74 +455,6 @@ static void portapack_lcd_wake() { portapack_lcd_display_on(); } -static bool jtag_pp_tck(const bool tms_value) { - gpio_write(jtag_cpld.gpio->gpio_pp_tms, tms_value); - - // 8 ns TMS/TDI to TCK setup - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - - gpio_set(jtag_cpld.gpio->gpio_tck); - - // 15 ns TCK to TMS/TDI hold time - // 20 ns TCK high time - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - - gpio_clear(jtag_cpld.gpio->gpio_tck); - - // 20 ns TCK low time - // 25 ns TCK falling edge to TDO valid - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - - return gpio_read(jtag_cpld.gpio->gpio_pp_tdo); -} - -static uint32_t jtag_pp_shift(const uint32_t tms_bits, const size_t count) { - uint32_t result = 0; - size_t bit_in_index = count - 1; - size_t bit_out_index = 0; - while(bit_out_index < count) { - const uint32_t tdo = jtag_pp_tck((tms_bits >> bit_in_index) & 1) & 1; - result |= (tdo << bit_out_index); - - bit_in_index--; - bit_out_index++; - } - - return result; -} - -static uint32_t jtag_pp_idcode() { - cpld_jtag_take(&jtag_cpld); - - /* TODO: Check if PortaPack TMS is floating or driven by an external device. */ - gpio_output(jtag_cpld.gpio->gpio_pp_tms); - - /* Test-Logic/Reset -> Run-Test/Idle -> Select-DR/Scan -> Capture-DR */ - jtag_pp_shift(0b11111010, 8); - - /* Shift-DR */ - const uint32_t idcode = jtag_pp_shift(0, 32); - - /* Exit1-DR -> Update-DR -> Run-Test/Idle -> ... -> Test-Logic/Reset */ - jtag_pp_shift(0b11011111, 8); - - cpld_jtag_release(&jtag_cpld); - - return idcode; -} - static void portapack_if_init() { portapack_data_mask_set(); portapack_data_write_high(0); @@ -1019,7 +951,7 @@ static void portapack_ui_set_antenna_bias(bool antenna_bias) { (void)antenna_bias; } -static const hackrf_ui_t portapack_ui = { +const hackrf_ui_t portapack_hackrf_ui = { &portapack_ui_init, &portapack_ui_set_frequency, &portapack_ui_set_sample_rate, @@ -1033,11 +965,3 @@ static const hackrf_ui_t portapack_ui = { &portapack_ui_set_filter, &portapack_ui_set_antenna_bias, }; - -const hackrf_ui_t* portapack_detect(void) { - if( jtag_pp_idcode() == 0x020A50DD ) { - return &portapack_ui; - } else { - return NULL; - } -} diff --git a/firmware/common/ui_portapack.h b/firmware/common/ui_portapack.h index 0d2fc58e..d4ddda18 100644 --- a/firmware/common/ui_portapack.h +++ b/firmware/common/ui_portapack.h @@ -56,6 +56,4 @@ typedef struct ui_font_t { size_t data_stride; } ui_font_t; -const hackrf_ui_t* portapack_detect(void); - #endif/*__UI_PORTAPACK_H__*/ diff --git a/firmware/hackrf_usb/CMakeLists.txt b/firmware/hackrf_usb/CMakeLists.txt index 271bf434..7e124b1f 100644 --- a/firmware/hackrf_usb/CMakeLists.txt +++ b/firmware/hackrf_usb/CMakeLists.txt @@ -66,6 +66,7 @@ set(SRC_M4 if(BOARD STREQUAL "HACKRF_ONE") SET(SRC_M4 ${SRC_M4} + "${PATH_HACKRF_FIRMWARE_COMMON}/portapack.c" "${PATH_HACKRF_FIRMWARE_COMMON}/ui_portapack.c" ) endif() From 5df5ec109454c7ed6e34c6882f6aefb255b2991d Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 18 Mar 2019 15:11:34 -0700 Subject: [PATCH 08/26] PortaPack: Hide UI types that don't need to be exposed. --- firmware/common/ui_portapack.c | 32 ++++++++++++++++++++++++++++++++ firmware/common/ui_portapack.h | 34 ---------------------------------- 2 files changed, 32 insertions(+), 34 deletions(-) diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index 018a8cdb..aa29a088 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -30,6 +30,38 @@ #include +typedef struct ui_color_t { + uint16_t v; +} ui_color_t; + +typedef struct ui_point_t { + int16_t x; + int16_t y; +} ui_point_t; + +typedef struct ui_size_t { + int16_t width; + int16_t height; +} ui_size_t; + +typedef struct ui_rect_t { + ui_point_t point; + ui_size_t size; +} ui_rect_t; + +typedef struct ui_bitmap_t { + ui_size_t size; + const uint8_t* const data; +} ui_bitmap_t; + +typedef struct ui_font_t { + const ui_size_t glyph_size; + const uint8_t* const data; + char c_start; + size_t c_count; + size_t data_stride; +} ui_font_t; + /* Pixel data within a font or bitmap byte is "reversed": LSB is left-most pixel. */ static const uint8_t font_fixed_8x16_glyph_data[] = { diff --git a/firmware/common/ui_portapack.h b/firmware/common/ui_portapack.h index d4ddda18..69754c7e 100644 --- a/firmware/common/ui_portapack.h +++ b/firmware/common/ui_portapack.h @@ -22,38 +22,4 @@ #ifndef __UI_PORTAPACK_H__ #define __UI_PORTAPACK_H__ -#include - -typedef struct ui_color_t { - uint16_t v; -} ui_color_t; - -typedef struct ui_point_t { - int16_t x; - int16_t y; -} ui_point_t; - -typedef struct ui_size_t { - int16_t width; - int16_t height; -} ui_size_t; - -typedef struct ui_rect_t { - ui_point_t point; - ui_size_t size; -} ui_rect_t; - -typedef struct ui_bitmap_t { - ui_size_t size; - const uint8_t* const data; -} ui_bitmap_t; - -typedef struct ui_font_t { - const ui_size_t glyph_size; - const uint8_t* const data; - char c_start; - size_t c_count; - size_t data_stride; -} ui_font_t; - #endif/*__UI_PORTAPACK_H__*/ From c5e9b55b14d7214b8f0aedea6b1cc136283a766f Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Mon, 18 Mar 2019 16:22:14 -0700 Subject: [PATCH 09/26] PortaPack: Refactor general UI functions into separate PortaPack API. --- firmware/common/portapack.c | 459 +++++++++++++++++++++++++++++ firmware/common/portapack.h | 57 ++++ firmware/common/ui_portapack.c | 507 +-------------------------------- 3 files changed, 521 insertions(+), 502 deletions(-) diff --git a/firmware/common/portapack.c b/firmware/common/portapack.c index 4c4f3a9b..ff383fbb 100644 --- a/firmware/common/portapack.c +++ b/firmware/common/portapack.c @@ -20,7 +20,463 @@ */ #include "portapack.h" + #include "hackrf_core.h" +#include "gpio_lpc.h" + +#include + +static void portapack_sleep_milliseconds(const uint32_t milliseconds) { + /* NOTE: Naively assumes 204 MHz instruction cycle clock and five instructions per count */ + delay(milliseconds * 40800); +} + +static struct gpio_t gpio_io_stbx = GPIO(5, 0); /* P2_0 */ +static struct gpio_t gpio_addr = GPIO(5, 1); /* P2_1 */ +__attribute__((unused)) static struct gpio_t gpio_lcd_te = GPIO(5, 3); /* P2_3 */ +__attribute__((unused)) static struct gpio_t gpio_unused = GPIO(5, 7); /* P2_8 */ +static struct gpio_t gpio_lcd_rdx = GPIO(5, 4); /* P2_4 */ +static struct gpio_t gpio_lcd_wrx = GPIO(1, 10); /* P2_9 */ +static struct gpio_t gpio_dir = GPIO(1, 13); /* P2_13 */ + +typedef struct portapack_if_t { + gpio_t gpio_dir; + gpio_t gpio_lcd_rdx; + gpio_t gpio_lcd_wrx; + gpio_t gpio_io_stbx; + gpio_t gpio_addr; + gpio_port_t* const gpio_port_data; + uint8_t io_reg; +} portapack_if_t; + +static portapack_if_t portapack_if = { + .gpio_dir = &gpio_dir, + .gpio_lcd_rdx = &gpio_lcd_rdx, + .gpio_lcd_wrx = &gpio_lcd_wrx, + .gpio_io_stbx = &gpio_io_stbx, + .gpio_addr = &gpio_addr, + .gpio_port_data = GPIO_LPC_PORT(3), + .io_reg = 0x03, +}; + +/* NOTE: Code below assumes the shift value is "8". */ +#define GPIO_DATA_SHIFT (8) +static const uint32_t gpio_data_mask = 0xFFU << GPIO_DATA_SHIFT; + +static void portapack_data_mask_set() { + portapack_if.gpio_port_data->mask = ~gpio_data_mask; +} + +static void portapack_data_write_low(const uint32_t value) { + portapack_if.gpio_port_data->mpin = (value << GPIO_DATA_SHIFT); +} + +static void portapack_data_write_high(const uint32_t value) { + /* NOTE: Assumes no other bits in the port are masked. */ + /* NOTE: Assumes that bits 15 through 8 are masked. */ + portapack_if.gpio_port_data->mpin = value; +} + +static void portapack_dir_read() { + portapack_if.gpio_port_data->dir &= ~gpio_data_mask; + gpio_set(portapack_if.gpio_dir); +} + +static void portapack_dir_write() { + gpio_clear(portapack_if.gpio_dir); + portapack_if.gpio_port_data->dir |= gpio_data_mask; + /* TODO: Manipulating DIR[3] makes me queasy. The RFFC5072 DATA pin + * is also on port 3, and switches direction periodically... + * Time to resort to bit-banding to enforce atomicity? But then, how + * to change direction on eight bits efficiently? Or do I care, since + * the PortaPack data bus shouldn't change direction too frequently? + */ +} + +__attribute__((unused)) static void portapack_lcd_rd_assert() { + gpio_clear(portapack_if.gpio_lcd_rdx); +} + +static void portapack_lcd_rd_deassert() { + gpio_set(portapack_if.gpio_lcd_rdx); +} + +static void portapack_lcd_wr_assert() { + gpio_clear(portapack_if.gpio_lcd_wrx); +} + +static void portapack_lcd_wr_deassert() { + gpio_set(portapack_if.gpio_lcd_wrx); +} + +static void portapack_io_stb_assert() { + gpio_clear(portapack_if.gpio_io_stbx); +} + +static void portapack_io_stb_deassert() { + gpio_set(portapack_if.gpio_io_stbx); +} + +static void portapack_addr(const bool value) { + gpio_write(portapack_if.gpio_addr, value); +} + +static void portapack_lcd_command(const uint32_t value) { + portapack_data_write_high(0); /* Drive high byte (with zero -- don't care) */ + portapack_dir_write(); /* Turn around data bus, MCU->CPLD */ + portapack_addr(0); /* Indicate command */ + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + portapack_lcd_wr_assert(); /* Latch high byte */ + + portapack_data_write_low(value); /* Drive low byte (pass-through) */ + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + portapack_lcd_wr_deassert(); /* Complete write operation */ + + portapack_addr(1); /* Set up for data phase (most likely after a command) */ +} + +static void portapack_lcd_write_data(const uint32_t value) { + // NOTE: Assumes and DIR=0 and ADDR=1 from command phase. + portapack_data_write_high(value); /* Drive high byte */ + __asm__("nop"); + portapack_lcd_wr_assert(); /* Latch high byte */ + + portapack_data_write_low(value); /* Drive low byte (pass-through) */ + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + portapack_lcd_wr_deassert(); /* Complete write operation */ +} + +static void portapack_io_write(const bool address, const uint_fast16_t value) { + portapack_data_write_low(value); + portapack_dir_write(); + portapack_addr(address); + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + portapack_io_stb_assert(); + __asm__("nop"); + __asm__("nop"); + __asm__("nop"); + portapack_io_stb_deassert(); +} + +static void portapack_if_init() { + portapack_data_mask_set(); + portapack_data_write_high(0); + + portapack_dir_read(); + portapack_lcd_rd_deassert(); + portapack_lcd_wr_deassert(); + portapack_io_stb_deassert(); + portapack_addr(0); + + gpio_output(portapack_if.gpio_dir); + gpio_output(portapack_if.gpio_lcd_rdx); + gpio_output(portapack_if.gpio_lcd_wrx); + gpio_output(portapack_if.gpio_io_stbx); + gpio_output(portapack_if.gpio_addr); + /* gpio_input(portapack_if.gpio_rot_a); */ + /* gpio_input(portapack_if.gpio_rot_b); */ + + scu_pinmux(SCU_PINMUX_PP_D0, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); + scu_pinmux(SCU_PINMUX_PP_D1, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); + scu_pinmux(SCU_PINMUX_PP_D2, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); + scu_pinmux(SCU_PINMUX_PP_D3, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); + scu_pinmux(SCU_PINMUX_PP_D4, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); + scu_pinmux(SCU_PINMUX_PP_D5, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); + scu_pinmux(SCU_PINMUX_PP_D6, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); + scu_pinmux(SCU_PINMUX_PP_D7, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); + + scu_pinmux(SCU_PINMUX_PP_DIR, SCU_CONF_FUNCTION0 | SCU_GPIO_NOPULL); + scu_pinmux(SCU_PINMUX_PP_LCD_RDX, SCU_CONF_FUNCTION4 | SCU_GPIO_NOPULL); + scu_pinmux(SCU_PINMUX_PP_LCD_WRX, SCU_CONF_FUNCTION0 | SCU_GPIO_NOPULL); + scu_pinmux(SCU_PINMUX_PP_IO_STBX, SCU_CONF_FUNCTION4 | SCU_GPIO_NOPULL); + scu_pinmux(SCU_PINMUX_PP_ADDR, SCU_CONF_FUNCTION4 | SCU_GPIO_NOPULL); + /* scu_pinmux(SCU_PINMUX_PP_LCD_TE, SCU_CONF_FUNCTION4 | SCU_GPIO_NOPULL); */ + /* scu_pinmux(SCU_PINMUX_PP_UNUSED, SCU_CONF_FUNCTION4 | SCU_GPIO_NOPULL); */ +} + +static void portapack_lcd_reset_state(const bool active) { + portapack_if.io_reg = (portapack_if.io_reg & 0xfe) | (active ? (1 << 0) : 0); + portapack_io_write(1, portapack_if.io_reg); +} + +static void portapack_lcd_data_write_command_and_data( + const uint_fast8_t command, + const uint8_t* data, + const size_t data_count +) { + portapack_lcd_command(command); + for(size_t i=0; i> 8), (start & 0xff), + (end >> 8), (end & 0xff) + }; + portapack_lcd_data_write_command_and_data(command, data, ARRAY_SIZEOF(data)); +} + +static void portapack_lcd_caset(const uint_fast16_t start_column, const uint_fast16_t end_column) { + portapack_lcd_set(0x2a, start_column, end_column); +} + +static void portapack_lcd_paset(const uint_fast16_t start_page, const uint_fast16_t end_page) { + portapack_lcd_set(0x2b, start_page, end_page); +} + +static void portapack_lcd_start_ram_write( + const ui_rect_t rect +) { + portapack_lcd_caset(rect.point.x, rect.point.x + rect.size.width - 1); + portapack_lcd_paset(rect.point.y, rect.point.y + rect.size.height - 1); + portapack_lcd_ramwr_start(); +} + +static void portapack_lcd_write_pixel(const ui_color_t pixel) { + portapack_lcd_write_data(pixel.v); +} + +static void portapack_lcd_write_pixels_color(const ui_color_t c, size_t n) { + while(n--) { + portapack_lcd_write_data(c.v); + } +} + +static void portapack_lcd_wake() { + portapack_lcd_sleep_out(); + portapack_lcd_display_on(); +} + +static void portapack_lcd_reset() { + portapack_lcd_reset_state(false); + portapack_sleep_milliseconds(1); + portapack_lcd_reset_state(true); + portapack_sleep_milliseconds(10); + portapack_lcd_reset_state(false); + portapack_sleep_milliseconds(120); +} + +static void portapack_lcd_init() { + // LCDs are configured for IM[2:0] = 001 + // 8080-I system, 16-bit parallel bus + + // + // 0x3a: DBI[2:0] = 101 + // MDT[1:0] = XX (if not in 18-bit mode, right?) + + // Power control B + // 0 + // PCEQ=1, DRV_ena=0, Power control=3 + const uint8_t cmd_cf[] = { 0x00, 0xD9, 0x30 }; + portapack_lcd_data_write_command_and_data(0xCF, cmd_cf, ARRAY_SIZEOF(cmd_cf)); + + // Power on sequence control + const uint8_t cmd_ed[] = { 0x64, 0x03, 0x12, 0x81 }; + portapack_lcd_data_write_command_and_data(0xED, cmd_ed, ARRAY_SIZEOF(cmd_ed)); + + // Driver timing control A + const uint8_t cmd_e8[] = { 0x85, 0x10, 0x78 }; + portapack_lcd_data_write_command_and_data(0xE8, cmd_e8, ARRAY_SIZEOF(cmd_e8)); + + // Power control A + const uint8_t cmd_cb[] = { 0x39, 0x2C, 0x00, 0x34, 0x02 }; + portapack_lcd_data_write_command_and_data(0xCB, cmd_cb, ARRAY_SIZEOF(cmd_cb)); + + // Pump ratio control + const uint8_t cmd_f7[] = { 0x20 }; + portapack_lcd_data_write_command_and_data(0xF7, cmd_f7, ARRAY_SIZEOF(cmd_f7)); + + // Driver timing control B + const uint8_t cmd_ea[] = { 0x00, 0x00 }; + portapack_lcd_data_write_command_and_data(0xEA, cmd_ea, ARRAY_SIZEOF(cmd_ea)); + + const uint8_t cmd_b1[] = { 0x00, 0x1B }; + portapack_lcd_data_write_command_and_data(0xB1, cmd_b1, ARRAY_SIZEOF(cmd_b1)); + + // Blanking Porch Control + // VFP = 0b0000010 = 2 (number of HSYNC of vertical front porch) + // VBP = 0b0000010 = 2 (number of HSYNC of vertical back porch) + // HFP = 0b0001010 = 10 (number of DOTCLOCK of horizontal front porch) + // HBP = 0b0010100 = 20 (number of DOTCLOCK of horizontal back porch) + const uint8_t cmd_b5[] = { 0x02, 0x02, 0x0a, 0x14 }; + portapack_lcd_data_write_command_and_data(0xB5, cmd_b5, ARRAY_SIZEOF(cmd_b5)); + + // Display Function Control + // PT[1:0] = 0b10 + // PTG[1:0] = 0b10 + // ISC[3:0] = 0b0010 (scan cycle interval of gate driver: 5 frames) + // SM = 0 (gate driver pin arrangement in combination with GS) + // SS = 1 (source output scan direction S720 -> S1) + // GS = 0 (gate output scan direction G1 -> G320) + // REV = 1 (normally white) + // NL = 0b100111 (default) + // PCDIV = 0b000000 (default?) + const uint8_t cmd_b6[] = { 0x0A, 0xA2, 0x27, 0x00 }; + portapack_lcd_data_write_command_and_data(0xB6, cmd_b6, ARRAY_SIZEOF(cmd_b6)); + + // Power Control 1 + //VRH[5:0] + const uint8_t cmd_c0[] = { 0x1B }; + portapack_lcd_data_write_command_and_data(0xC0, cmd_c0, ARRAY_SIZEOF(cmd_c0)); + + // Power Control 2 + //SAP[2:0];BT[3:0] + const uint8_t cmd_c1[] = { 0x12 }; + portapack_lcd_data_write_command_and_data(0xC1, cmd_c1, ARRAY_SIZEOF(cmd_c1)); + + // VCOM Control 1 + const uint8_t cmd_c5[] = { 0x32, 0x3C }; + portapack_lcd_data_write_command_and_data(0xC5, cmd_c5, ARRAY_SIZEOF(cmd_c5)); + + // VCOM Control 2 + const uint8_t cmd_c7[] = { 0x9B }; + portapack_lcd_data_write_command_and_data(0xC7, cmd_c7, ARRAY_SIZEOF(cmd_c7)); + + // Memory Access Control + // Invert X and Y memory access order, so upper-left of + // screen is (0,0) when writing to display. + const uint8_t cmd_36[] = { + (1 << 7) | // MY=1 + (1 << 6) | // MX=1 + (0 << 5) | // MV=0 + (1 << 4) | // ML=1: reverse vertical refresh to simplify scrolling logic + (1 << 3) // BGR=1: For Kingtech LCD, BGR filter. + }; + portapack_lcd_data_write_command_and_data(0x36, cmd_36, ARRAY_SIZEOF(cmd_36)); + + // COLMOD: Pixel Format Set + // DPI=101 (16 bits/pixel), DBI=101 (16 bits/pixel) + const uint8_t cmd_3a[] = { 0x55 }; + portapack_lcd_data_write_command_and_data(0x3A, cmd_3a, ARRAY_SIZEOF(cmd_3a)); + + //portapack_lcd_data_write_command_and_data(0xF6, { 0x01, 0x30 }); + // WEMODE=1 (reset column and page number on overflow) + // MDT[1:0] + // EPF[1:0]=00 (use channel MSB for LSB) + // RIM=0 (If COLMOD[6:4]=101 (65k color), 16-bit RGB interface (1 transfer/pixel)) + // RM=0 (system interface/VSYNC interface) + // DM[1:0]=00 (internal clock operation) + // ENDIAN=0 (doesn't matter with 16-bit interface) + const uint8_t cmd_f6[] = { 0x01, 0x30, 0x00 }; + portapack_lcd_data_write_command_and_data(0xF6, cmd_f6, ARRAY_SIZEOF(cmd_f6)); + + // 3Gamma Function Disable + const uint8_t cmd_f2[] = { 0x00 }; + portapack_lcd_data_write_command_and_data(0xF2, cmd_f2, ARRAY_SIZEOF(cmd_f2)); + + // Gamma curve selected + const uint8_t cmd_26[] = { 0x01 }; + portapack_lcd_data_write_command_and_data(0x26, cmd_26, ARRAY_SIZEOF(cmd_26)); + + // Set Gamma + const uint8_t cmd_e0[] = { + 0x0F, 0x1D, 0x19, 0x0E, 0x10, 0x07, 0x4C, 0x63, + 0x3F, 0x03, 0x0D, 0x00, 0x26, 0x24, 0x04 + }; + portapack_lcd_data_write_command_and_data(0xE0, cmd_e0, ARRAY_SIZEOF(cmd_e0)); + + // Set Gamma + const uint8_t cmd_e1[] = { + 0x00, 0x1C, 0x1F, 0x02, 0x0F, 0x03, 0x35, 0x25, + 0x47, 0x04, 0x0C, 0x0B, 0x29, 0x2F, 0x05 + }; + portapack_lcd_data_write_command_and_data(0xE1, cmd_e1, ARRAY_SIZEOF(cmd_e1)); + + portapack_lcd_wake(); + + // Turn on Tearing Effect Line (TE) output signal. + const uint8_t cmd_35[] = { 0b00000000 }; + portapack_lcd_data_write_command_and_data(0x35, cmd_35, ARRAY_SIZEOF(cmd_35)); +} + +void portapack_backlight(const bool on) { + portapack_if.io_reg = (portapack_if.io_reg & 0x7f) | (on ? (1 << 7) : 0); + portapack_io_write(1, portapack_if.io_reg); +} + +void portapack_fill_rectangle( + const ui_rect_t rect, + const ui_color_t color +) { + portapack_lcd_start_ram_write(rect); + portapack_lcd_write_pixels_color(color, rect.size.width * rect.size.height); +} + +void portapack_clear_display(const ui_color_t color) { + const ui_rect_t rect_screen = { { 0, 0 }, { 240, 320 } }; + portapack_fill_rectangle(rect_screen, color); +} + +void portapack_draw_bitmap( + const ui_point_t point, + const ui_bitmap_t bitmap, + const ui_color_t foreground, + const ui_color_t background +) { + const ui_rect_t rect = { + .point = point, + .size = bitmap.size + }; + + portapack_lcd_start_ram_write(rect); + + const size_t count = bitmap.size.width * bitmap.size.height; + for(size_t i=0; i> 3] & (1U << (i & 0x7)); + portapack_lcd_write_pixel(pixel ? foreground : background); + } +} + +ui_bitmap_t portapack_font_glyph( + const ui_font_t* const font, + const char c +) { + if( c >= font->c_start ) { + const uint_fast8_t index = c - font->c_start; + if( index < font->c_count ) { + const ui_bitmap_t bitmap = { + .size = font->glyph_size, + .data = &font->data[index * font->data_stride] + }; + return bitmap; + } + } + + const ui_bitmap_t bitmap = { + .size = font->glyph_size, + .data = font->data, + }; + return bitmap; +} static bool jtag_pp_tck(const bool tms_value) { gpio_write(jtag_cpld.gpio->gpio_pp_tms, tms_value); @@ -102,6 +558,9 @@ const portapack_t portapack = { const portapack_t* portapack_init(void) { if( portapack_detect() ) { + portapack_if_init(); + portapack_lcd_reset(); + portapack_lcd_init(); return &portapack; } else { return NULL; diff --git a/firmware/common/portapack.h b/firmware/common/portapack.h index cd0a8f7a..0157b39c 100644 --- a/firmware/common/portapack.h +++ b/firmware/common/portapack.h @@ -22,12 +22,69 @@ #ifndef __PORTAPACK_H__ #define __PORTAPACK_H__ +#include + #include "hackrf-ui.h" +#define ARRAY_SIZEOF(x) (sizeof(x) / sizeof(x[0])) + +typedef struct ui_color_t { + uint16_t v; +} ui_color_t; + +typedef struct ui_point_t { + int16_t x; + int16_t y; +} ui_point_t; + +typedef struct ui_size_t { + int16_t width; + int16_t height; +} ui_size_t; + +typedef struct ui_rect_t { + ui_point_t point; + ui_size_t size; +} ui_rect_t; + +typedef struct ui_bitmap_t { + ui_size_t size; + const uint8_t* const data; +} ui_bitmap_t; + +typedef struct ui_font_t { + const ui_size_t glyph_size; + const uint8_t* const data; + char c_start; + size_t c_count; + size_t data_stride; +} ui_font_t; + typedef struct { const hackrf_ui_t* const hackrf_ui; } portapack_t; const portapack_t* portapack_init(void); +void portapack_backlight(const bool on); + +void portapack_fill_rectangle( + const ui_rect_t rect, + const ui_color_t color +); + +void portapack_clear_display(const ui_color_t color); + +void portapack_draw_bitmap( + const ui_point_t point, + const ui_bitmap_t bitmap, + const ui_color_t foreground, + const ui_color_t background +); + +ui_bitmap_t portapack_font_glyph( + const ui_font_t* const font, + const char c +); + #endif/*__PORTAPACK_H__*/ diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index aa29a088..f80c1c6c 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -19,48 +19,9 @@ * Boston, MA 02110-1301, USA. */ -#include "hackrf-ui.h" - #include "ui_portapack.h" -#include "hackrf_core.h" -#include "gpio_lpc.h" - -#include - -#include - -typedef struct ui_color_t { - uint16_t v; -} ui_color_t; - -typedef struct ui_point_t { - int16_t x; - int16_t y; -} ui_point_t; - -typedef struct ui_size_t { - int16_t width; - int16_t height; -} ui_size_t; - -typedef struct ui_rect_t { - ui_point_t point; - ui_size_t size; -} ui_rect_t; - -typedef struct ui_bitmap_t { - ui_size_t size; - const uint8_t* const data; -} ui_bitmap_t; - -typedef struct ui_font_t { - const ui_size_t glyph_size; - const uint8_t* const data; - char c_start; - size_t c_count; - size_t data_stride; -} ui_font_t; +#include "portapack.h" /* Pixel data within a font or bitmap byte is "reversed": LSB is left-most pixel. */ @@ -295,456 +256,6 @@ __attribute__((unused)) static ui_color_t portapack_color_rgb( static const ui_color_t color_background = { 0x001f }; static const ui_color_t color_foreground = { 0xffff }; -#define ARRAY_SIZEOF(x) (sizeof(x) / sizeof(x[0])) - -static void portapack_sleep_milliseconds(const uint32_t milliseconds) { - /* NOTE: Naively assumes 204 MHz instruction cycle clock and five instructions per count */ - delay(milliseconds * 40800); -} - -static struct gpio_t gpio_io_stbx = GPIO(5, 0); /* P2_0 */ -static struct gpio_t gpio_addr = GPIO(5, 1); /* P2_1 */ -__attribute__((unused)) static struct gpio_t gpio_lcd_te = GPIO(5, 3); /* P2_3 */ -__attribute__((unused)) static struct gpio_t gpio_unused = GPIO(5, 7); /* P2_8 */ -static struct gpio_t gpio_lcd_rdx = GPIO(5, 4); /* P2_4 */ -static struct gpio_t gpio_lcd_wrx = GPIO(1, 10); /* P2_9 */ -static struct gpio_t gpio_dir = GPIO(1, 13); /* P2_13 */ - -typedef struct portapack_t { - gpio_t gpio_dir; - gpio_t gpio_lcd_rdx; - gpio_t gpio_lcd_wrx; - gpio_t gpio_io_stbx; - gpio_t gpio_addr; - gpio_port_t* const gpio_port_data; - uint8_t io_reg; -} portapack_t; - -static portapack_t portapack = { - .gpio_dir = &gpio_dir, - .gpio_lcd_rdx = &gpio_lcd_rdx, - .gpio_lcd_wrx = &gpio_lcd_wrx, - .gpio_io_stbx = &gpio_io_stbx, - .gpio_addr = &gpio_addr, - .gpio_port_data = GPIO_LPC_PORT(3), - .io_reg = 0x03, -}; - -/* NOTE: Code below assumes the shift value is "8". */ -#define GPIO_DATA_SHIFT (8) -static const uint32_t gpio_data_mask = 0xFFU << GPIO_DATA_SHIFT; - -static void portapack_data_mask_set() { - portapack.gpio_port_data->mask = ~gpio_data_mask; -} - -static void portapack_data_write_low(const uint32_t value) { - portapack.gpio_port_data->mpin = (value << GPIO_DATA_SHIFT); -} - -static void portapack_data_write_high(const uint32_t value) { - /* NOTE: Assumes no other bits in the port are masked. */ - /* NOTE: Assumes that bits 15 through 8 are masked. */ - portapack.gpio_port_data->mpin = value; -} - -static void portapack_dir_read() { - portapack.gpio_port_data->dir &= ~gpio_data_mask; - gpio_set(portapack.gpio_dir); -} - -static void portapack_dir_write() { - gpio_clear(portapack.gpio_dir); - portapack.gpio_port_data->dir |= gpio_data_mask; - /* TODO: Manipulating DIR[3] makes me queasy. The RFFC5072 DATA pin - * is also on port 3, and switches direction periodically... - * Time to resort to bit-banding to enforce atomicity? But then, how - * to change direction on eight bits efficiently? Or do I care, since - * the PortaPack data bus shouldn't change direction too frequently? - */ -} - -__attribute__((unused)) static void portapack_lcd_rd_assert() { - gpio_clear(portapack.gpio_lcd_rdx); -} - -static void portapack_lcd_rd_deassert() { - gpio_set(portapack.gpio_lcd_rdx); -} - -static void portapack_lcd_wr_assert() { - gpio_clear(portapack.gpio_lcd_wrx); -} - -static void portapack_lcd_wr_deassert() { - gpio_set(portapack.gpio_lcd_wrx); -} - -static void portapack_io_stb_assert() { - gpio_clear(portapack.gpio_io_stbx); -} - -static void portapack_io_stb_deassert() { - gpio_set(portapack.gpio_io_stbx); -} - -static void portapack_addr(const bool value) { - gpio_write(portapack.gpio_addr, value); -} - -static void portapack_lcd_command(const uint32_t value) { - portapack_data_write_high(0); /* Drive high byte (with zero -- don't care) */ - portapack_dir_write(); /* Turn around data bus, MCU->CPLD */ - portapack_addr(0); /* Indicate command */ - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - portapack_lcd_wr_assert(); /* Latch high byte */ - - portapack_data_write_low(value); /* Drive low byte (pass-through) */ - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - portapack_lcd_wr_deassert(); /* Complete write operation */ - - portapack_addr(1); /* Set up for data phase (most likely after a command) */ -} - -static void portapack_lcd_write_data(const uint32_t value) { - // NOTE: Assumes and DIR=0 and ADDR=1 from command phase. - portapack_data_write_high(value); /* Drive high byte */ - __asm__("nop"); - portapack_lcd_wr_assert(); /* Latch high byte */ - - portapack_data_write_low(value); /* Drive low byte (pass-through) */ - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - portapack_lcd_wr_deassert(); /* Complete write operation */ -} - -static void portapack_io_write(const bool address, const uint_fast16_t value) { - portapack_data_write_low(value); - portapack_dir_write(); - portapack_addr(address); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - portapack_io_stb_assert(); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - portapack_io_stb_deassert(); -} - -static void portapack_lcd_data_write_command_and_data( - const uint_fast8_t command, - const uint8_t* data, - const size_t data_count -) { - portapack_lcd_command(command); - for(size_t i=0; i S1) - // GS = 0 (gate output scan direction G1 -> G320) - // REV = 1 (normally white) - // NL = 0b100111 (default) - // PCDIV = 0b000000 (default?) - const uint8_t cmd_b6[] = { 0x0A, 0xA2, 0x27, 0x00 }; - portapack_lcd_data_write_command_and_data(0xB6, cmd_b6, ARRAY_SIZEOF(cmd_b6)); - - // Power Control 1 - //VRH[5:0] - const uint8_t cmd_c0[] = { 0x1B }; - portapack_lcd_data_write_command_and_data(0xC0, cmd_c0, ARRAY_SIZEOF(cmd_c0)); - - // Power Control 2 - //SAP[2:0];BT[3:0] - const uint8_t cmd_c1[] = { 0x12 }; - portapack_lcd_data_write_command_and_data(0xC1, cmd_c1, ARRAY_SIZEOF(cmd_c1)); - - // VCOM Control 1 - const uint8_t cmd_c5[] = { 0x32, 0x3C }; - portapack_lcd_data_write_command_and_data(0xC5, cmd_c5, ARRAY_SIZEOF(cmd_c5)); - - // VCOM Control 2 - const uint8_t cmd_c7[] = { 0x9B }; - portapack_lcd_data_write_command_and_data(0xC7, cmd_c7, ARRAY_SIZEOF(cmd_c7)); - - // Memory Access Control - // Invert X and Y memory access order, so upper-left of - // screen is (0,0) when writing to display. - const uint8_t cmd_36[] = { - (1 << 7) | // MY=1 - (1 << 6) | // MX=1 - (0 << 5) | // MV=0 - (1 << 4) | // ML=1: reverse vertical refresh to simplify scrolling logic - (1 << 3) // BGR=1: For Kingtech LCD, BGR filter. - }; - portapack_lcd_data_write_command_and_data(0x36, cmd_36, ARRAY_SIZEOF(cmd_36)); - - // COLMOD: Pixel Format Set - // DPI=101 (16 bits/pixel), DBI=101 (16 bits/pixel) - const uint8_t cmd_3a[] = { 0x55 }; - portapack_lcd_data_write_command_and_data(0x3A, cmd_3a, ARRAY_SIZEOF(cmd_3a)); - - //portapack_lcd_data_write_command_and_data(0xF6, { 0x01, 0x30 }); - // WEMODE=1 (reset column and page number on overflow) - // MDT[1:0] - // EPF[1:0]=00 (use channel MSB for LSB) - // RIM=0 (If COLMOD[6:4]=101 (65k color), 16-bit RGB interface (1 transfer/pixel)) - // RM=0 (system interface/VSYNC interface) - // DM[1:0]=00 (internal clock operation) - // ENDIAN=0 (doesn't matter with 16-bit interface) - const uint8_t cmd_f6[] = { 0x01, 0x30, 0x00 }; - portapack_lcd_data_write_command_and_data(0xF6, cmd_f6, ARRAY_SIZEOF(cmd_f6)); - - // 3Gamma Function Disable - const uint8_t cmd_f2[] = { 0x00 }; - portapack_lcd_data_write_command_and_data(0xF2, cmd_f2, ARRAY_SIZEOF(cmd_f2)); - - // Gamma curve selected - const uint8_t cmd_26[] = { 0x01 }; - portapack_lcd_data_write_command_and_data(0x26, cmd_26, ARRAY_SIZEOF(cmd_26)); - - // Set Gamma - const uint8_t cmd_e0[] = { - 0x0F, 0x1D, 0x19, 0x0E, 0x10, 0x07, 0x4C, 0x63, - 0x3F, 0x03, 0x0D, 0x00, 0x26, 0x24, 0x04 - }; - portapack_lcd_data_write_command_and_data(0xE0, cmd_e0, ARRAY_SIZEOF(cmd_e0)); - - // Set Gamma - const uint8_t cmd_e1[] = { - 0x00, 0x1C, 0x1F, 0x02, 0x0F, 0x03, 0x35, 0x25, - 0x47, 0x04, 0x0C, 0x0B, 0x29, 0x2F, 0x05 - }; - portapack_lcd_data_write_command_and_data(0xE1, cmd_e1, ARRAY_SIZEOF(cmd_e1)); - - portapack_lcd_wake(); - - // Turn on Tearing Effect Line (TE) output signal. - const uint8_t cmd_35[] = { 0b00000000 }; - portapack_lcd_data_write_command_and_data(0x35, cmd_35, ARRAY_SIZEOF(cmd_35)); -} - -static void portapack_lcd_ramwr_start() { - const uint8_t cmd_2c[] = {}; - portapack_lcd_data_write_command_and_data(0x2c, cmd_2c, ARRAY_SIZEOF(cmd_2c)); -} - -static void portapack_lcd_set(const uint_fast8_t command, const uint_fast16_t start, const uint_fast16_t end) { - const uint8_t data[] = { - (start >> 8), (start & 0xff), - (end >> 8), (end & 0xff) - }; - portapack_lcd_data_write_command_and_data(command, data, ARRAY_SIZEOF(data)); -} - -static void portapack_lcd_caset(const uint_fast16_t start_column, uint_fast16_t end_column) { - portapack_lcd_set(0x2a, start_column, end_column); -} - -static void portapack_lcd_paset(const uint_fast16_t start_page, const uint_fast16_t end_page) { - portapack_lcd_set(0x2b, start_page, end_page); -} - - -static void portapack_lcd_start_ram_write( - ui_rect_t rect -) { - portapack_lcd_caset(rect.point.x, rect.point.x + rect.size.width - 1); - portapack_lcd_paset(rect.point.y, rect.point.y + rect.size.height - 1); - portapack_lcd_ramwr_start(); -} - -static void portapack_lcd_fill_rectangle( - ui_rect_t rect, - ui_color_t color -) { - portapack_lcd_start_ram_write(rect); - portapack_lcd_write_pixels_color(color, rect.size.width * rect.size.height); -} - -static void portapack_draw_bitmap( - const ui_point_t point, - const ui_bitmap_t bitmap, - const ui_color_t foreground, - const ui_color_t background -) { - const ui_rect_t rect = { - .point = point, - .size = bitmap.size - }; - - portapack_lcd_start_ram_write(rect); - - const size_t count = bitmap.size.width * bitmap.size.height; - for(size_t i=0; i> 3] & (1U << (i & 0x7)); - portapack_lcd_write_pixel(pixel ? foreground : background); - } -} - -static ui_bitmap_t portapack_font_glyph( - const ui_font_t* const font, - const char c -) { - if( c >= font->c_start ) { - const uint_fast8_t index = c - font->c_start; - if( index < font->c_count ) { - const ui_bitmap_t bitmap = { - .size = font->glyph_size, - .data = &font->data[index * font->data_stride] - }; - return bitmap; - } - } - - const ui_bitmap_t bitmap = { - .size = font->glyph_size, - .data = font->data, - }; - return bitmap; -} - static ui_point_t portapack_lcd_draw_int(const ui_point_t point, uint64_t value, size_t field_width) { const ui_point_t point_done = { .x = point.x + font_fixed_8x16.glyph_size.width * field_width, @@ -775,11 +286,6 @@ static ui_point_t portapack_lcd_draw_string(ui_point_t point, const char* s) { return point; } -static void portapack_lcd_clear() { - const ui_rect_t rect_screen = { { 0, 0 }, { 240, 320 } }; - portapack_lcd_fill_rectangle(rect_screen, color_background); -} - typedef struct draw_list_t { const ui_bitmap_t* bitmap; const ui_point_t point; @@ -852,12 +358,9 @@ static void portapack_radio_path_redraw() { portapack_draw_radio_path(radio_draw_list, ARRAY_SIZEOF(radio_draw_list)); } -static void portapack_ui_init() { - portapack_if_init(); - portapack_lcd_reset(); - portapack_lcd_init(); - portapack_lcd_clear(); - portapack_backlight(1); +static void portapack_ui_init(void) { + portapack_clear_display(color_background); + portapack_backlight(true); } static void portapack_ui_set_frequency(uint64_t frequency) { @@ -878,7 +381,7 @@ static void portapack_ui_set_frequency(uint64_t frequency) { if( (i>=6) && (value == 0) ) { /* Blank out leading zeros. */ const ui_rect_t rect = { point, glyph.size }; - portapack_lcd_fill_rectangle(rect, color_background); + portapack_fill_rectangle(rect, color_background); } else { portapack_draw_bitmap(point, glyph, color_foreground, color_background); } From af66a7c0762f0809303227cd165bee4459ec2794 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 19 Mar 2019 10:04:08 -0700 Subject: [PATCH 10/26] PortaPack: Add reference oscillator control function. --- firmware/common/portapack.c | 6 ++++++ firmware/common/portapack.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/firmware/common/portapack.c b/firmware/common/portapack.c index ff383fbb..4bbb2312 100644 --- a/firmware/common/portapack.c +++ b/firmware/common/portapack.c @@ -423,6 +423,12 @@ void portapack_backlight(const bool on) { portapack_io_write(1, portapack_if.io_reg); } +void portapack_reference_oscillator(const bool on) { + const uint8_t mask = 1 << 6; + portapack_if.io_reg = (portapack_if.io_reg & ~mask) | (on ? mask : 0); + portapack_io_write(1, portapack_if.io_reg); +} + void portapack_fill_rectangle( const ui_rect_t rect, const ui_color_t color diff --git a/firmware/common/portapack.h b/firmware/common/portapack.h index 0157b39c..9febdbbd 100644 --- a/firmware/common/portapack.h +++ b/firmware/common/portapack.h @@ -68,6 +68,8 @@ const portapack_t* portapack_init(void); void portapack_backlight(const bool on); +void portapack_reference_oscillator(const bool on); + void portapack_fill_rectangle( const ui_rect_t rect, const ui_color_t color From b4d8ee678e64a75d9386a1ee08ae0d58aabe89d6 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 10:44:56 -0700 Subject: [PATCH 11/26] PortaPack: Lots of clean-up Perform PortaPack initialization separately from and earlier than UI initialization. Track if PortaPack was detected, provide (mostly useless) pointer if so. Put "weak" declarations into respective headers. Moving #includes around. --- firmware/common/hackrf-ui.c | 12 +++--------- firmware/common/portapack.c | 17 ++++++++++------- firmware/common/portapack.h | 13 ++++++++----- firmware/common/ui_portapack.c | 8 ++++++++ firmware/common/ui_portapack.h | 4 ++++ firmware/common/ui_rad1o.c | 1 - firmware/common/ui_rad1o.h | 4 +++- firmware/hackrf_usb/hackrf_usb.c | 5 +++++ 8 files changed, 41 insertions(+), 23 deletions(-) diff --git a/firmware/common/hackrf-ui.c b/firmware/common/hackrf-ui.c index 23974135..bca2e86a 100644 --- a/firmware/common/hackrf-ui.c +++ b/firmware/common/hackrf-ui.c @@ -21,7 +21,7 @@ #include "hackrf-ui.h" -#include "portapack.h" +#include "ui_portapack.h" #include "ui_rad1o.h" #include @@ -60,20 +60,14 @@ static const hackrf_ui_t hackrf_ui_null = { &hackrf_ui_set_antenna_bias_null, }; -const portapack_t* portapack_init(void) __attribute__((weak)); -const hackrf_ui_t* rad1o_ui_setup(void) __attribute__((weak)); - static const hackrf_ui_t* ui = NULL; const hackrf_ui_t* hackrf_ui(void) { /* Detect on first use. If no UI hardware is detected, use a stub function table. */ if( ui == NULL ) { #ifdef HACKRF_ONE - if( portapack_init ) { - const portapack_t* const portapack = portapack_init(); - if( portapack != NULL ) { - ui = portapack->hackrf_ui; - } + if( portapack_hackrf_ui_init ) { + ui = portapack_hackrf_ui_init(); } #endif #ifdef RAD1O diff --git a/firmware/common/portapack.c b/firmware/common/portapack.c index 4bbb2312..2931ff80 100644 --- a/firmware/common/portapack.c +++ b/firmware/common/portapack.c @@ -556,19 +556,22 @@ static bool portapack_detect(void) { return jtag_pp_idcode() == 0x020A50DD; } -extern const hackrf_ui_t portapack_hackrf_ui; - -const portapack_t portapack = { - &portapack_hackrf_ui, +static const portapack_t portapack_instance = { }; -const portapack_t* portapack_init(void) { +static const portapack_t* portapack_pointer = NULL; + +const portapack_t* portapack(void) { + return portapack_pointer; +} + +void portapack_init(void) { if( portapack_detect() ) { portapack_if_init(); portapack_lcd_reset(); portapack_lcd_init(); - return &portapack; + portapack_pointer = &portapack_instance; } else { - return NULL; + portapack_pointer = NULL; } } \ No newline at end of file diff --git a/firmware/common/portapack.h b/firmware/common/portapack.h index 9febdbbd..9c537b0b 100644 --- a/firmware/common/portapack.h +++ b/firmware/common/portapack.h @@ -22,9 +22,9 @@ #ifndef __PORTAPACK_H__ #define __PORTAPACK_H__ +#include #include - -#include "hackrf-ui.h" +#include #define ARRAY_SIZEOF(x) (sizeof(x) / sizeof(x[0])) @@ -60,11 +60,14 @@ typedef struct ui_font_t { size_t data_stride; } ui_font_t; -typedef struct { - const hackrf_ui_t* const hackrf_ui; +typedef struct portapack_t { } portapack_t; -const portapack_t* portapack_init(void); +void portapack_init(void); + +/* If the "portapack" symbol is defined, PortaPack support is compiled in */ +/* If the portapack() call returns non-NULL, a PortaPack was detected and is initialized. */ +const portapack_t* portapack(void); void portapack_backlight(const bool on); diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index f80c1c6c..a61c3b5a 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -500,3 +500,11 @@ const hackrf_ui_t portapack_hackrf_ui = { &portapack_ui_set_filter, &portapack_ui_set_antenna_bias, }; + +const hackrf_ui_t* portapack_hackrf_ui_init() { + if( portapack() ) { + return &portapack_hackrf_ui; + } else { + return NULL; + } +} diff --git a/firmware/common/ui_portapack.h b/firmware/common/ui_portapack.h index 69754c7e..22d27d9c 100644 --- a/firmware/common/ui_portapack.h +++ b/firmware/common/ui_portapack.h @@ -22,4 +22,8 @@ #ifndef __UI_PORTAPACK_H__ #define __UI_PORTAPACK_H__ +#include "hackrf-ui.h" + +const hackrf_ui_t* portapack_hackrf_ui_init() __attribute__((weak)); + #endif/*__UI_PORTAPACK_H__*/ diff --git a/firmware/common/ui_rad1o.c b/firmware/common/ui_rad1o.c index 4d3b1254..aac72369 100644 --- a/firmware/common/ui_rad1o.c +++ b/firmware/common/ui_rad1o.c @@ -19,7 +19,6 @@ * Boston, MA 02110-1301, USA. */ -#include "hackrf-ui.h" #include "ui_rad1o.h" /* Weak functions from rad1o app */ diff --git a/firmware/common/ui_rad1o.h b/firmware/common/ui_rad1o.h index 6e658e5b..7c14a79a 100644 --- a/firmware/common/ui_rad1o.h +++ b/firmware/common/ui_rad1o.h @@ -22,6 +22,8 @@ #ifndef __UI_RAD1O_H__ #define __UI_RAD1O_H__ -const hackrf_ui_t* rad1o_ui_setup(void); +#include "hackrf-ui.h" + +const hackrf_ui_t* rad1o_ui_setup(void) __attribute__((weak)); #endif/*__UI_RAD1O_H__*/ diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 4714dbfe..92ab9aa2 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -46,6 +46,7 @@ #include "usb_api_transceiver.h" #include "usb_bulk_buffer.h" #include "cpld_xc2c.h" +#include "portapack.h" #include "hackrf-ui.h" @@ -235,6 +236,10 @@ int main(void) { halt_and_flash(6000000); } +#ifdef HACKRF_ONE + portapack_init(); +#endif + #ifndef DFU_MODE usb_set_descriptor_by_serial_number(); #endif From 46fd11af5bbd62d60420d0e4070c6a31e9ba4df0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 11:16:44 -0700 Subject: [PATCH 12/26] Si5351C: Extract best block source function into hackrf_core. It's not an Si5351C driver thing, but a HackRF thing. Also added a driver function to check if CLKIN signal is valid, and made use of it, instead of opaque register read code. --- firmware/common/hackrf_core.c | 9 ++++++++ firmware/common/hackrf_core.h | 2 ++ firmware/common/si5351c.c | 25 +++++++---------------- firmware/common/si5351c.h | 4 +++- firmware/hackrf_usb/usb_api_transceiver.c | 2 +- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 64254c5d..a42a06ae 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -712,6 +712,15 @@ void cpu_clock_init(void) #endif } +void activate_best_clock_source(void) +{ + if (si5351c_clkin_signal_valid(&clock_gen)) { + si5351c_set_clock_source(&clock_gen, PLL_SOURCE_CLKIN); + } else { + si5351c_set_clock_source(&clock_gen, PLL_SOURCE_XTAL); + } +} + void ssp1_set_mode_max2837(void) { spi_bus_start(max2837.bus, &ssp_config_max2837); diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index 3b2f7982..e6e4e811 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -294,6 +294,8 @@ bool sample_rate_frac_set(uint32_t rate_num, uint32_t rate_denom); bool sample_rate_set(const uint32_t sampling_rate_hz); bool baseband_filter_bandwidth_set(const uint32_t bandwidth_hz); +void activate_best_clock_source(void); + #if (defined HACKRF_ONE || defined RAD1O) void enable_rf_power(void); void disable_rf_power(void); diff --git a/firmware/common/si5351c.c b/firmware/common/si5351c.c index 64a3dda1..a7364241 100644 --- a/firmware/common/si5351c.c +++ b/firmware/common/si5351c.c @@ -22,7 +22,7 @@ #include "si5351c.h" -enum pll_sources active_clock_source; +enum pll_sources active_clock_source = PLL_SOURCE_UNINITIALIZED; /* write to single register */ void si5351c_write_single(si5351c_driver_t* const drv, uint8_t reg, uint8_t val) @@ -239,25 +239,14 @@ void si5351c_set_int_mode(si5351c_driver_t* const drv, const uint_fast8_t ms_num void si5351c_set_clock_source(si5351c_driver_t* const drv, const enum pll_sources source) { - si5351c_configure_clock_control(drv, source); - active_clock_source = source; + if( source != active_clock_source ) { + si5351c_configure_clock_control(drv, source); + active_clock_source = source; + } } -void si5351c_activate_best_clock_source(si5351c_driver_t* const drv) -{ - uint8_t device_status = si5351c_read_single(drv, 0); - - if (device_status & SI5351C_LOS) { - /* CLKIN not detected */ - if (active_clock_source == PLL_SOURCE_CLKIN) { - si5351c_set_clock_source(drv, PLL_SOURCE_XTAL); - } - } else { - /* CLKIN detected */ - if (active_clock_source == PLL_SOURCE_XTAL) { - si5351c_set_clock_source(drv, PLL_SOURCE_CLKIN); - } - } +bool si5351c_clkin_signal_valid(si5351c_driver_t* const drv) { + return (si5351c_read_single(drv, 0) & SI5351C_LOS) == 0; } void si5351c_clkout_enable(si5351c_driver_t* const drv, uint8_t enable) diff --git a/firmware/common/si5351c.h b/firmware/common/si5351c.h index 533c5830..03e82260 100644 --- a/firmware/common/si5351c.h +++ b/firmware/common/si5351c.h @@ -29,6 +29,7 @@ extern "C" #endif #include +#include #include "i2c_bus.h" @@ -59,6 +60,7 @@ extern "C" #define SI5351C_LOS (1<<4) enum pll_sources { + PLL_SOURCE_UNINITIALIZED = -1, PLL_SOURCE_XTAL = 0, PLL_SOURCE_CLKIN = 1, }; @@ -84,7 +86,7 @@ void si5351c_configure_clock_control(si5351c_driver_t* const drv, const enum pll void si5351c_enable_clock_outputs(si5351c_driver_t* const drv); void si5351c_set_int_mode(si5351c_driver_t* const drv, const uint_fast8_t ms_number, const uint_fast8_t on); void si5351c_set_clock_source(si5351c_driver_t* const drv, const enum pll_sources source); -void si5351c_activate_best_clock_source(si5351c_driver_t* const drv); +bool si5351c_clkin_signal_valid(si5351c_driver_t* const drv); void si5351c_write_single(si5351c_driver_t* const drv, uint8_t reg, uint8_t val); uint8_t si5351c_read_single(si5351c_driver_t* const drv, uint8_t reg); diff --git a/firmware/hackrf_usb/usb_api_transceiver.c b/firmware/hackrf_usb/usb_api_transceiver.c index fda9b6a9..3d64d7f9 100644 --- a/firmware/hackrf_usb/usb_api_transceiver.c +++ b/firmware/hackrf_usb/usb_api_transceiver.c @@ -273,7 +273,7 @@ void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { if( _transceiver_mode != TRANSCEIVER_MODE_OFF ) { - si5351c_activate_best_clock_source(&clock_gen); + activate_best_clock_source(); hw_sync_enable(_hw_sync_mode); From dccb7482166b3faa03d44646291fde63006ffe15 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 13:27:20 -0700 Subject: [PATCH 13/26] PortaPack: Add check for PortaPack clock reference, use if present. Wow, it takes a lot of ugly code to keep blinky happy... --- firmware/common/hackrf_core.c | 26 ++++++++++++++++++++++++++ firmware/common/portapack.h | 4 ++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index a42a06ae..1ee7e3e6 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -39,6 +39,10 @@ #include #include +#ifdef HACKRF_ONE +#include "portapack.h" +#endif + #include "gpio_lpc.h" #define WAIT_CPU_CLOCK_INIT_DELAY (10000) @@ -714,9 +718,31 @@ void cpu_clock_init(void) void activate_best_clock_source(void) { +#ifdef HACKRF_ONE + /* Ensure PortaPack reference oscillator is off while checking for external clock input. */ + if( portapack_reference_oscillator && portapack()) { + portapack_reference_oscillator(false); + } +#endif + + /* Check for external clock input. */ if (si5351c_clkin_signal_valid(&clock_gen)) { si5351c_set_clock_source(&clock_gen, PLL_SOURCE_CLKIN); } else { +#ifdef HACKRF_ONE + /* Enable PortaPack reference oscillator (if present), and check for valid clock. */ + if( portapack_reference_oscillator && portapack() ) { + portapack_reference_oscillator(true); + delay(510000); /* loop iterations @ 204MHz for >10ms for oscillator to enable. */ + if (si5351c_clkin_signal_valid(&clock_gen)) { + si5351c_set_clock_source(&clock_gen, PLL_SOURCE_CLKIN); + return; + } else { + portapack_reference_oscillator(false); + } + } +#endif + /* No external or PortaPack clock was found. Use HackRF Si5351C crystal. */ si5351c_set_clock_source(&clock_gen, PLL_SOURCE_XTAL); } } diff --git a/firmware/common/portapack.h b/firmware/common/portapack.h index 9c537b0b..98f682f2 100644 --- a/firmware/common/portapack.h +++ b/firmware/common/portapack.h @@ -67,11 +67,11 @@ void portapack_init(void); /* If the "portapack" symbol is defined, PortaPack support is compiled in */ /* If the portapack() call returns non-NULL, a PortaPack was detected and is initialized. */ -const portapack_t* portapack(void); +const portapack_t* portapack(void) __attribute__((weak)); void portapack_backlight(const bool on); -void portapack_reference_oscillator(const bool on); +void portapack_reference_oscillator(const bool on) __attribute__((weak)); void portapack_fill_rectangle( const ui_rect_t rect, From 891eaa9e626ca5e55d3bb2e92529dd9e5d29b56c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 14:38:18 -0700 Subject: [PATCH 14/26] Clock reference: Return enum for selected clock source. --- firmware/common/hackrf_core.c | 6 ++++-- firmware/common/hackrf_core.h | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index 1ee7e3e6..ca1c3389 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -716,7 +716,7 @@ void cpu_clock_init(void) #endif } -void activate_best_clock_source(void) +clock_source_t activate_best_clock_source(void) { #ifdef HACKRF_ONE /* Ensure PortaPack reference oscillator is off while checking for external clock input. */ @@ -728,6 +728,7 @@ void activate_best_clock_source(void) /* Check for external clock input. */ if (si5351c_clkin_signal_valid(&clock_gen)) { si5351c_set_clock_source(&clock_gen, PLL_SOURCE_CLKIN); + return CLOCK_SOURCE_EXTERNAL; } else { #ifdef HACKRF_ONE /* Enable PortaPack reference oscillator (if present), and check for valid clock. */ @@ -736,7 +737,7 @@ void activate_best_clock_source(void) delay(510000); /* loop iterations @ 204MHz for >10ms for oscillator to enable. */ if (si5351c_clkin_signal_valid(&clock_gen)) { si5351c_set_clock_source(&clock_gen, PLL_SOURCE_CLKIN); - return; + return CLOCK_SOURCE_PORTAPACK; } else { portapack_reference_oscillator(false); } @@ -744,6 +745,7 @@ void activate_best_clock_source(void) #endif /* No external or PortaPack clock was found. Use HackRF Si5351C crystal. */ si5351c_set_clock_source(&clock_gen, PLL_SOURCE_XTAL); + return CLOCK_SOURCE_HACKRF; } } diff --git a/firmware/common/hackrf_core.h b/firmware/common/hackrf_core.h index e6e4e811..912fa991 100644 --- a/firmware/common/hackrf_core.h +++ b/firmware/common/hackrf_core.h @@ -264,6 +264,12 @@ typedef enum { HW_SYNC_MODE_ON = 1, } hw_sync_mode_t; +typedef enum { + CLOCK_SOURCE_HACKRF = 0, + CLOCK_SOURCE_EXTERNAL = 1, + CLOCK_SOURCE_PORTAPACK = 2, +} clock_source_t; + void delay(uint32_t duration); /* TODO: Hide these configurations */ @@ -294,7 +300,7 @@ bool sample_rate_frac_set(uint32_t rate_num, uint32_t rate_denom); bool sample_rate_set(const uint32_t sampling_rate_hz); bool baseband_filter_bandwidth_set(const uint32_t bandwidth_hz); -void activate_best_clock_source(void); +clock_source_t activate_best_clock_source(void); #if (defined HACKRF_ONE || defined RAD1O) void enable_rf_power(void); From ddec31c0a28ec1af5aec52660d94514eac2903a7 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 16:01:49 -0700 Subject: [PATCH 15/26] PortaPack: Double draw speed of UI, which was impacting hackrf_sweep. --- firmware/common/ui_portapack.c | 48 +++++++++++++++++----------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index a61c3b5a..a3729b1c 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -342,12 +342,14 @@ static ui_point_t portapack_ui_draw_bw_mhz(ui_point_t point, const uint64_t hz) return portapack_lcd_draw_string(point, " MHz"); } -static void portapack_draw_radio_path( - const draw_list_t* const draw_list, - const size_t count -) { - for( size_t i=0; i Date: Wed, 20 Mar 2019 16:33:32 -0700 Subject: [PATCH 16/26] PortaPack: Improve speed of frequency rendering. To reduce impact on hackrf_sweep speed. --- firmware/common/ui_portapack.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index a3729b1c..f0e75396 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -369,29 +369,39 @@ static void portapack_ui_init(void) { } static void portapack_ui_set_frequency(uint64_t frequency) { + static char last[10] = " "; + ui_point_t point = { 240 - 20, 16 }; uint64_t value = frequency; + char s[10]; for(int i=0; i<10; i++) { const char c = '0' + value % 10; + s[i] = ((i>=6) && (value == 0)) ? ' ' : c; + value /= 10; + } + + for(int i=0; i<10; i++) { + const char c = s[i]; const ui_font_t* const font = (i > 5) ? &font_fixed_24x19 : &font_fixed_16x14; - const ui_bitmap_t glyph = portapack_font_glyph(font, c); - - point.x -= glyph.size.width; + point.x -= font->glyph_size.width; if( (i==3) || (i==6) || (i==9) ) { point.x -= 4; } - if( (i>=6) && (value == 0) ) { - /* Blank out leading zeros. */ - const ui_rect_t rect = { point, glyph.size }; - portapack_fill_rectangle(rect, color_background); - } else { - portapack_draw_bitmap(point, glyph, color_foreground, color_background); - } + if( c != last[i] ) { + const ui_bitmap_t glyph = portapack_font_glyph(font, c); - value /= 10; + if( c == ' ' ) { + /* Blank out leading zeros. */ + const ui_rect_t rect = { point, glyph.size }; + portapack_fill_rectangle(rect, color_background); + } else { + portapack_draw_bitmap(point, glyph, color_foreground, color_background); + } + last[i] = c; + } } } From 78e27001aa2bacffac26b6358b3dd2a4e53e80b8 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 19:08:44 -0700 Subject: [PATCH 17/26] PortaPack: Make label-drawing functions take a label enum. --- firmware/common/ui_portapack.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index f0e75396..85f2688c 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -321,14 +321,23 @@ typedef enum { RADIO_DRAW_LIST_ITEM_BB_VGA_AMP = 14 } radio_draw_list_item_t; -static const uint8_t VALUES_X = 72; +static ui_point_t portapack_ui_label_point(const radio_draw_list_item_t item) { + const uint8_t VALUES_X = 72; + ui_point_t point = { VALUES_X, radio_draw_list[item].point.y + 4 }; + return point; +} -static ui_point_t portapack_ui_draw_db(ui_point_t point, const uint32_t db) { +static ui_point_t portapack_ui_draw_string(const radio_draw_list_item_t item, const char* s) { + return portapack_lcd_draw_string(portapack_ui_label_point(item), s); +} + +static ui_point_t portapack_ui_draw_db(const radio_draw_list_item_t item, const uint32_t db) { + ui_point_t point = portapack_ui_label_point(item); point = portapack_lcd_draw_int(point, db, 2); return portapack_lcd_draw_string(point, " dB"); } -static ui_point_t portapack_ui_draw_bw_mhz(ui_point_t point, const uint64_t hz) { +static ui_point_t portapack_ui_draw_bw_mhz(const radio_draw_list_item_t item, const uint64_t hz) { const uint32_t lsd = 1000000 / 100; const uint32_t round_offset = lsd / 2; @@ -336,6 +345,7 @@ static ui_point_t portapack_ui_draw_bw_mhz(ui_point_t point, const uint64_t hz) const uint32_t mhz = hz_offset / 1000000; const uint32_t frac = hz_offset / lsd; + ui_point_t point = portapack_ui_label_point(item); point = portapack_lcd_draw_int(point, mhz, 2); point = portapack_lcd_draw_string(point, "."); point = portapack_lcd_draw_int(point, frac, 2); @@ -437,8 +447,7 @@ static void portapack_ui_set_direction(const rf_path_direction_t direction) { } static void portapack_ui_set_filter_bw(uint32_t bandwidth) { - ui_point_t point = { VALUES_X, radio_draw_list[RADIO_DRAW_LIST_ITEM_BB_FILTER].point.y + 4 }; - portapack_ui_draw_bw_mhz(point, bandwidth); + portapack_ui_draw_bw_mhz(RADIO_DRAW_LIST_ITEM_BB_FILTER, bandwidth); } static void portapack_ui_set_lna_power(bool lna_on) { @@ -447,18 +456,15 @@ static void portapack_ui_set_lna_power(bool lna_on) { ? ((portapack_direction == RF_PATH_DIRECTION_TX) ? &bitmap_amp_tx : &bitmap_amp_rx) : &bitmap_wire_24); const char* const label = lna_on ? "14 dB" : " "; - ui_point_t point = { VALUES_X, radio_draw_list[RADIO_DRAW_LIST_ITEM_RF_AMP].point.y + 4 }; - portapack_lcd_draw_string(point, label); + portapack_ui_draw_string(RADIO_DRAW_LIST_ITEM_RF_AMP, label); } static void portapack_ui_set_bb_lna_gain(const uint32_t gain_db) { - ui_point_t point = { VALUES_X, radio_draw_list[RADIO_DRAW_LIST_ITEM_BB_LNA_AMP].point.y + 4 }; - portapack_ui_draw_db(point, gain_db); + portapack_ui_draw_db(RADIO_DRAW_LIST_ITEM_BB_LNA_AMP, gain_db); } static void portapack_ui_set_bb_vga_gain(const uint32_t gain_db) { - ui_point_t point = { VALUES_X, radio_draw_list[RADIO_DRAW_LIST_ITEM_BB_VGA_AMP].point.y + 4 }; - portapack_ui_draw_db(point, gain_db); + portapack_ui_draw_db(RADIO_DRAW_LIST_ITEM_BB_VGA_AMP, gain_db); } static void portapack_ui_set_bb_tx_vga_gain(const uint32_t gain_db) { @@ -466,8 +472,7 @@ static void portapack_ui_set_bb_tx_vga_gain(const uint32_t gain_db) { * According to the MAX2837 datasheet diagram, there is no baseband gain in the TX path. * This gets called when the TX IF gain is changed. */ - ui_point_t point = { VALUES_X, radio_draw_list[RADIO_DRAW_LIST_ITEM_BB_LNA_AMP].point.y + 4 }; - portapack_ui_draw_db(point, gain_db); + portapack_ui_draw_db(RADIO_DRAW_LIST_ITEM_BB_LNA_AMP, gain_db); } static void portapack_ui_set_first_if_frequency(const uint64_t frequency) { From a535a9bb6b897024b3f43639d828d8f1b785fea0 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 19:09:10 -0700 Subject: [PATCH 18/26] PortaPack: Clear the baseband RX gain label on TX. --- firmware/common/ui_portapack.c | 1 + 1 file changed, 1 insertion(+) diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index 85f2688c..93be21bc 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -430,6 +430,7 @@ static void portapack_ui_set_direction(const rf_path_direction_t direction) { portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_RF_AMP, portapack_lna_on ? &bitmap_amp_tx : &bitmap_wire_24); portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_BB_LNA_AMP, &bitmap_amp_tx); portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_BB_VGA_AMP, &bitmap_wire_24); + portapack_ui_draw_string(RADIO_DRAW_LIST_ITEM_BB_VGA_AMP, " "); break; case RF_PATH_DIRECTION_RX: From 027a0eca971961e6c041952e1fdd71891a7caf5b Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 20:16:24 -0700 Subject: [PATCH 19/26] rad1o: Fix #include. --- firmware/common/hackrf-ui.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/common/hackrf-ui.h b/firmware/common/hackrf-ui.h index a18f9d74..3d4565db 100644 --- a/firmware/common/hackrf-ui.h +++ b/firmware/common/hackrf-ui.h @@ -22,7 +22,7 @@ #ifndef HACKRF_UI_H #define HACKRF_UI_H -#include +#include #include typedef void (*hackrf_ui_init_fn)(void); From 190c3972f4a9c28028181e8bb156d1dc01681e77 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 20:18:25 -0700 Subject: [PATCH 20/26] Clock reference: Add UI hook. Simplify selection code. --- firmware/common/hackrf-ui.c | 2 ++ firmware/common/hackrf-ui.h | 2 ++ firmware/common/hackrf_core.c | 14 ++++++++------ firmware/common/ui_portapack.c | 4 ++++ firmware/common/ui_rad1o.c | 6 ++++++ 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/firmware/common/hackrf-ui.c b/firmware/common/hackrf-ui.c index bca2e86a..bb1a045d 100644 --- a/firmware/common/hackrf-ui.c +++ b/firmware/common/hackrf-ui.c @@ -41,6 +41,7 @@ void hackrf_ui_set_bb_tx_vga_gain_null(const uint32_t gain_db) { UNUSED(gain_db) void hackrf_ui_set_first_if_frequency_null(const uint64_t frequency) { UNUSED(frequency); } void hackrf_ui_set_filter_null(const rf_path_filter_t filter) { UNUSED(filter); } void hackrf_ui_set_antenna_bias_null(bool antenna_bias) { UNUSED(antenna_bias); } +void hackrf_ui_set_clock_source_null(clock_source_t source) { UNUSED(source); } /* Null UI function table, used if there's no hardware UI detected. Eliminates the * need to check for null UI before calling a function in the table. @@ -58,6 +59,7 @@ static const hackrf_ui_t hackrf_ui_null = { &hackrf_ui_set_first_if_frequency_null, &hackrf_ui_set_filter_null, &hackrf_ui_set_antenna_bias_null, + &hackrf_ui_set_clock_source_null, }; static const hackrf_ui_t* ui = NULL; diff --git a/firmware/common/hackrf-ui.h b/firmware/common/hackrf-ui.h index 3d4565db..5ac07ada 100644 --- a/firmware/common/hackrf-ui.h +++ b/firmware/common/hackrf-ui.h @@ -37,6 +37,7 @@ typedef void (*hackrf_ui_set_bb_tx_vga_gain_fn)(const uint32_t gain_db); typedef void (*hackrf_ui_set_first_if_frequency_fn)(const uint64_t frequency); typedef void (*hackrf_ui_set_filter_fn)(const rf_path_filter_t filter); typedef void (*hackrf_ui_set_antenna_bias_fn)(bool antenna_bias); +typedef void (*hackrf_ui_set_clock_source_fn)(clock_source_t source); typedef struct { hackrf_ui_init_fn init; @@ -51,6 +52,7 @@ typedef struct { hackrf_ui_set_first_if_frequency_fn set_first_if_frequency; hackrf_ui_set_filter_fn set_filter; hackrf_ui_set_antenna_bias_fn set_antenna_bias; + hackrf_ui_set_clock_source_fn set_clock_source; } hackrf_ui_t; /* TODO: Lame hack to know that PortaPack was detected. diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index ca1c3389..d7666322 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -725,10 +725,11 @@ clock_source_t activate_best_clock_source(void) } #endif + clock_source_t source = CLOCK_SOURCE_HACKRF; + /* Check for external clock input. */ if (si5351c_clkin_signal_valid(&clock_gen)) { - si5351c_set_clock_source(&clock_gen, PLL_SOURCE_CLKIN); - return CLOCK_SOURCE_EXTERNAL; + source = CLOCK_SOURCE_EXTERNAL; } else { #ifdef HACKRF_ONE /* Enable PortaPack reference oscillator (if present), and check for valid clock. */ @@ -736,17 +737,18 @@ clock_source_t activate_best_clock_source(void) portapack_reference_oscillator(true); delay(510000); /* loop iterations @ 204MHz for >10ms for oscillator to enable. */ if (si5351c_clkin_signal_valid(&clock_gen)) { - si5351c_set_clock_source(&clock_gen, PLL_SOURCE_CLKIN); - return CLOCK_SOURCE_PORTAPACK; + source = CLOCK_SOURCE_PORTAPACK; } else { portapack_reference_oscillator(false); } } #endif /* No external or PortaPack clock was found. Use HackRF Si5351C crystal. */ - si5351c_set_clock_source(&clock_gen, PLL_SOURCE_XTAL); - return CLOCK_SOURCE_HACKRF; } + + si5351c_set_clock_source(&clock_gen, (source == CLOCK_SOURCE_HACKRF) ? PLL_SOURCE_XTAL : PLL_SOURCE_CLKIN); + hackrf_ui()->set_clock_source(source); + return source; } void ssp1_set_mode_max2837(void) diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index 93be21bc..63bb5a79 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -502,6 +502,9 @@ static void portapack_ui_set_antenna_bias(bool antenna_bias) { (void)antenna_bias; } +static void portapack_ui_set_clock_source(clock_source_t source) { +} + const hackrf_ui_t portapack_hackrf_ui = { &portapack_ui_init, &portapack_ui_set_frequency, @@ -515,6 +518,7 @@ const hackrf_ui_t portapack_hackrf_ui = { &portapack_ui_set_first_if_frequency, &portapack_ui_set_filter, &portapack_ui_set_antenna_bias, + &portapack_ui_set_clock_source, }; const hackrf_ui_t* portapack_hackrf_ui_init() { diff --git a/firmware/common/ui_rad1o.c b/firmware/common/ui_rad1o.c index aac72369..af4e4fb8 100644 --- a/firmware/common/ui_rad1o.c +++ b/firmware/common/ui_rad1o.c @@ -34,6 +34,7 @@ void hackrf_ui_setBBTXVGAGain(const uint32_t gain_db) __attribute__((weak)); void hackrf_ui_setFirstIFFrequency(const uint64_t freq) __attribute__((weak)); void hackrf_ui_setFilter(const rf_path_filter_t filter) __attribute__((weak)); void hackrf_ui_setAntennaBias(bool antenna_bias) __attribute__((weak)); +void hackrf_ui_setClockSource(clock_source_t source) __attribute__((weak)); static void rad1o_ui_init(void) { hackrf_ui_init(); @@ -83,6 +84,10 @@ static void rad1o_ui_set_antenna_bias(bool antenna_bias) { hackrf_ui_setAntennaBias(antenna_bias); } +static void rad1o_ui_set_clock_source(clock_source_t source) { + hackrf_ui_setClockSource(source); +} + static const hackrf_ui_t rad1o_ui = { &rad1o_ui_init, &rad1o_ui_set_frequency, @@ -96,6 +101,7 @@ static const hackrf_ui_t rad1o_ui = { &rad1o_ui_set_first_if_frequency, &rad1o_ui_set_filter, &rad1o_ui_set_antenna_bias, + &rad1o_ui_set_clock_source, }; const hackrf_ui_t* rad1o_ui_setup(void) { From 6e5b31d579fdbfa117aeb67a9659ec82d803a03f Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 20 Mar 2019 20:18:49 -0700 Subject: [PATCH 21/26] PortaPack: Add display of clock reference source. --- firmware/common/ui_portapack.c | 57 ++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index 63bb5a79..81b20117 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -218,6 +218,14 @@ static const ui_bitmap_t bitmap_mixer = { { 24, 24 }, bitmap_mixer_data }; +static const uint8_t bitmap_oscillator_data[] = { + 0x00, 0x7e, 0x00, 0xc0, 0xff, 0x03, 0xe0, 0x81, 0x07, 0x70, 0x00, 0x0e, 0x38, 0x00, 0x1c, 0x1c, 0x00, 0x38, 0x0e, 0x03, 0x70, 0x86, 0x07, 0x60, 0xc6, 0x0f, 0x60, 0xc3, 0x0c, 0xc0, 0xe3, 0x1c, 0xc0, 0x63, 0x18, 0xc6, 0x63, 0x18, 0xc6, 0x03, 0x38, 0xc7, 0x03, 0x30, 0xc3, 0x06, 0xf0, 0x63, 0x06, 0xe0, 0x61, 0x0e, 0xc0, 0x70, 0x1c, 0x00, 0x38, 0x38, 0x00, 0x1c, 0x70, 0x00, 0x0e, 0xe0, 0x81, 0x07, 0xc0, 0xff, 0x03, 0x00, 0x7e, 0x00 +}; + +static const ui_bitmap_t bitmap_oscillator = { + { 24, 24 }, bitmap_oscillator_data +}; + static const uint8_t bitmap_wire_8_data[] = { 0xff, 0xff }; @@ -292,22 +300,23 @@ typedef struct draw_list_t { } draw_list_t; static draw_list_t radio_draw_list[] = { - { &bitmap_antenna, { 32, 64 } }, - { &bitmap_wire_8, { 43, 88 } }, - { &bitmap_amp_rx, { 32, 96 } }, - { &bitmap_wire_8, { 43, 120 } }, - { &bitmap_filter_hp, { 32, 128 } }, - { &bitmap_wire_8, { 43, 152 } }, - { &bitmap_mixer, { 32, 160 } }, - { &bitmap_wire_8, { 43, 184 } }, - { &bitmap_amp_rx, { 32, 192 } }, - { &bitmap_wire_8, { 43, 216 } }, - { &bitmap_mixer, { 32, 224 } }, - { &bitmap_wire_8, { 43, 248 } }, - { &bitmap_filter_lp, { 32, 256 } }, - { &bitmap_wire_8, { 43, 280 } }, - { &bitmap_amp_rx, { 32, 288 } }, - { &bitmap_wire_8, { 43, 312 } }, + { &bitmap_antenna, { 32, 64 } }, + { &bitmap_wire_8, { 43, 88 } }, + { &bitmap_amp_rx, { 32, 96 } }, + { &bitmap_wire_8, { 43, 120 } }, + { &bitmap_filter_hp, { 32, 128 } }, + { &bitmap_wire_8, { 43, 152 } }, + { &bitmap_mixer, { 32, 160 } }, + { &bitmap_wire_8, { 43, 184 } }, + { &bitmap_amp_rx, { 32, 192 } }, + { &bitmap_wire_8, { 43, 216 } }, + { &bitmap_mixer, { 32, 224 } }, + { &bitmap_wire_8, { 43, 248 } }, + { &bitmap_filter_lp, { 32, 256 } }, + { &bitmap_wire_8, { 43, 280 } }, + { &bitmap_amp_rx, { 32, 288 } }, + { &bitmap_wire_8, { 43, 312 } }, + { &bitmap_oscillator, { 208, 288 } }, }; typedef enum { @@ -318,7 +327,8 @@ typedef enum { RADIO_DRAW_LIST_ITEM_BB_LNA_AMP = 8, RADIO_DRAW_LIST_ITEM_BB_MIXER = 10, RADIO_DRAW_LIST_ITEM_BB_FILTER = 12, - RADIO_DRAW_LIST_ITEM_BB_VGA_AMP = 14 + RADIO_DRAW_LIST_ITEM_BB_VGA_AMP = 14, + RADIO_DRAW_LIST_ITEM_CLOCK = 16, } radio_draw_list_item_t; static ui_point_t portapack_ui_label_point(const radio_draw_list_item_t item) { @@ -503,6 +513,19 @@ static void portapack_ui_set_antenna_bias(bool antenna_bias) { } static void portapack_ui_set_clock_source(clock_source_t source) { + ui_point_t label_point = radio_draw_list[RADIO_DRAW_LIST_ITEM_CLOCK].point; + label_point.x -= 0; + label_point.y -= 16; + + const char* s = "HRF"; + switch(source) { + case CLOCK_SOURCE_EXTERNAL: { s = "EXT"; break; } + case CLOCK_SOURCE_PORTAPACK: { s = "PPK"; break; } + default: + case CLOCK_SOURCE_HACKRF: { s = "HRF"; break; } + } + + portapack_lcd_draw_string(label_point, s); } const hackrf_ui_t portapack_hackrf_ui = { From f0a45e3f0e8f214cdcaea343e8bb947efef93e0f Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 21 Mar 2019 11:16:06 -0700 Subject: [PATCH 22/26] PortaPack: Change initial UI radio topology to match boot state. So the RX amp isn't rendered for a moment at power-up. --- firmware/common/ui_portapack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index 81b20117..ed1733ed 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -302,7 +302,7 @@ typedef struct draw_list_t { static draw_list_t radio_draw_list[] = { { &bitmap_antenna, { 32, 64 } }, { &bitmap_wire_8, { 43, 88 } }, - { &bitmap_amp_rx, { 32, 96 } }, + { &bitmap_wire_24, { 32, 96 } }, { &bitmap_wire_8, { 43, 120 } }, { &bitmap_filter_hp, { 32, 128 } }, { &bitmap_wire_8, { 43, 152 } }, From 1b7ef4212d3edbb2b8b8e02273109f97be03bcc8 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 22 Mar 2019 10:14:34 -0700 Subject: [PATCH 23/26] PortaPack: Show RX/TX "waves" when radio is operating. --- firmware/common/ui_portapack.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/firmware/common/ui_portapack.c b/firmware/common/ui_portapack.c index ed1733ed..d9dc90da 100644 --- a/firmware/common/ui_portapack.c +++ b/firmware/common/ui_portapack.c @@ -242,12 +242,28 @@ static const ui_bitmap_t bitmap_wire_24 = { { 24, 24 }, bitmap_wire_24_data }; -static const uint8_t bitmap_waves_data[] = { - 0x00, 0x03, 0x00, 0x03, 0x00, 0x06, 0x30, 0x06, 0x30, 0x06, 0x30, 0x06, 0x60, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x63, 0x0c, 0x60, 0x0c, 0x30, 0x06, 0x30, 0x06, 0x30, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x03 +static const uint8_t bitmap_blank_24_data[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -__attribute__((unused)) static const ui_bitmap_t bitmap_waves = { - { 16, 20 }, bitmap_waves_data +static const ui_bitmap_t bitmap_blank_24 = { + { 24, 24 }, bitmap_blank_24_data +}; + +static const uint8_t bitmap_waves_rx_data[] = { + 0xc0, 0x00, 0x60, 0x00, 0x70, 0x06, 0x30, 0x07, 0x38, 0x03, 0x98, 0x33, 0x98, 0x39, 0x98, 0x19, 0xcc, 0x18, 0xcc, 0x0c, 0xcc, 0x0c, 0xcc, 0x0c, 0xcc, 0x0c, 0xcc, 0x0c, 0xcc, 0x0c, 0xcc, 0x18, 0x98, 0x19, 0x98, 0x39, 0x98, 0x33, 0x38, 0x03, 0x30, 0x07, 0x70, 0x06, 0x60, 0x00, 0xc0, 0x00 +}; + +static const ui_bitmap_t bitmap_waves_rx = { + { 16, 24 }, bitmap_waves_rx_data +}; + +static const uint8_t bitmap_waves_tx_data[] = { + 0x00, 0x03, 0x00, 0x06, 0x60, 0x0e, 0xe0, 0x0c, 0xc0, 0x1c, 0xcc, 0x19, 0x9c, 0x19, 0x98, 0x19, 0x18, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x18, 0x33, 0x98, 0x19, 0x9c, 0x19, 0xcc, 0x19, 0xc0, 0x1c, 0xe0, 0x0c, 0x60, 0x0e, 0x00, 0x06, 0x00, 0x03 +}; + +static const ui_bitmap_t bitmap_waves_tx = { + { 16, 24 }, bitmap_waves_tx_data }; __attribute__((unused)) static ui_color_t portapack_color_rgb( @@ -317,6 +333,7 @@ static draw_list_t radio_draw_list[] = { { &bitmap_amp_rx, { 32, 288 } }, { &bitmap_wire_8, { 43, 312 } }, { &bitmap_oscillator, { 208, 288 } }, + { &bitmap_blank_24, { 60, 60 } }, }; typedef enum { @@ -329,6 +346,7 @@ typedef enum { RADIO_DRAW_LIST_ITEM_BB_FILTER = 12, RADIO_DRAW_LIST_ITEM_BB_VGA_AMP = 14, RADIO_DRAW_LIST_ITEM_CLOCK = 16, + RADIO_DRAW_LIST_ITEM_WAVES = 17, } radio_draw_list_item_t; static ui_point_t portapack_ui_label_point(const radio_draw_list_item_t item) { @@ -437,6 +455,7 @@ static void portapack_ui_set_sample_rate(uint32_t sample_rate) { static void portapack_ui_set_direction(const rf_path_direction_t direction) { switch(direction) { case RF_PATH_DIRECTION_TX: + portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_WAVES, &bitmap_waves_tx); portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_RF_AMP, portapack_lna_on ? &bitmap_amp_tx : &bitmap_wire_24); portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_BB_LNA_AMP, &bitmap_amp_tx); portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_BB_VGA_AMP, &bitmap_wire_24); @@ -444,6 +463,7 @@ static void portapack_ui_set_direction(const rf_path_direction_t direction) { break; case RF_PATH_DIRECTION_RX: + portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_WAVES, &bitmap_waves_rx); portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_RF_AMP, portapack_lna_on ? &bitmap_amp_rx : &bitmap_wire_24); portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_BB_LNA_AMP, &bitmap_amp_rx); portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_BB_VGA_AMP, &bitmap_amp_rx); @@ -451,6 +471,7 @@ static void portapack_ui_set_direction(const rf_path_direction_t direction) { case RF_PATH_DIRECTION_OFF: default: + portapack_radio_path_item_update(RADIO_DRAW_LIST_ITEM_WAVES, &bitmap_blank_24); break; } From cb821e4602a6c4014080e8ba86ca9543d809179c Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 27 Mar 2019 10:44:26 -0700 Subject: [PATCH 24/26] CMake: Separate run-from-RAM and DFU binaries. PortaPack uses the run-from-RAM build for HackRF mode, but doesn't want the serial number to show up as "RunningFromRAM". --- firmware/hackrf-common.cmake | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index 15d9da5e..6e040811 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -82,7 +82,7 @@ SET(HACKRF_OPTS "-D${BOARD} -DLPC43XX -D${MCU_PARTNO} -DTX_ENABLE -D'VERSION_STR SET(LDSCRIPT_M4 "-T${PATH_HACKRF_FIRMWARE_COMMON}/${MCU_PARTNO}_M4_memory.ld -Tlibopencm3_lpc43xx_rom_to_ram.ld -T${PATH_HACKRF_FIRMWARE_COMMON}/LPC43xx_M4_M0_image_from_text.ld") -SET(LDSCRIPT_M4_DFU "-T${PATH_HACKRF_FIRMWARE_COMMON}/${MCU_PARTNO}_M4_memory.ld -Tlibopencm3_lpc43xx.ld -T${PATH_HACKRF_FIRMWARE_COMMON}/LPC43xx_M4_M0_image_from_text.ld") +SET(LDSCRIPT_M4_RAM "-T${PATH_HACKRF_FIRMWARE_COMMON}/${MCU_PARTNO}_M4_memory.ld -Tlibopencm3_lpc43xx.ld -T${PATH_HACKRF_FIRMWARE_COMMON}/LPC43xx_M4_M0_image_from_text.ld") SET(LDSCRIPT_M0 "-T${PATH_HACKRF_FIRMWARE_COMMON}/LPC43xx_M0_memory.ld -Tlibopencm3_lpc43xx_m0.ld") @@ -103,8 +103,8 @@ SET(CFLAGS_M4 "-std=gnu99 ${CFLAGS_COMMON} ${CPUFLAGS_M4} -DLPC43XX_M4") SET(CXXFLAGS_M4 "-std=gnu++0x ${CFLAGS_COMMON} ${CPUFLAGS_M4} -DLPC43XX_M4") SET(LDFLAGS_M4 "${LDFLAGS_COMMON} ${CPUFLAGS_M4} ${LDSCRIPT_M4} -Xlinker -Map=m4.map") -SET(CFLAGS_M4_DFU "-std=gnu99 ${CFLAGS_COMMON} ${CPUFLAGS_M4} -DLPC43XX_M4 -DDFU_MODE") -SET(LDFLAGS_M4_DFU "${LDFLAGS_COMMON} ${CPUFLAGS_M4} ${LDSCRIPT_M4_DFU} -Xlinker -Map=m4.map") +SET(CFLAGS_M4_RAM "-std=gnu99 ${CFLAGS_COMMON} ${CPUFLAGS_M4} -DLPC43XX_M4") +SET(LDFLAGS_M4_RAM "${LDFLAGS_COMMON} ${CPUFLAGS_M4} ${LDSCRIPT_M4_RAM} -Xlinker -Map=m4.map") set(BUILD_SHARED_LIBS OFF) @@ -201,10 +201,34 @@ macro(DeclareTargets) COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin ) + # RAM - using a differnet LD script to run directly from RAM + # TODO: Duplicated from DFU code, below, except without -DDFU_MODE. Extract to shared code somehow. + add_library(${PROJECT_NAME}_ram_objects OBJECT ${SRC_M4} m0_bin.s) + set_target_properties(${PROJECT_NAME}_ram_objects PROPERTIES COMPILE_FLAGS "${CFLAGS_M4_RAM}") + add_dependencies(${PROJECT_NAME}_ram_objects ${PROJECT_NAME}_m0.bin) + add_executable(${PROJECT_NAME}_ram.elf $) + add_dependencies(${PROJECT_NAME}_ram.elf libopencm3_${PROJECT_NAME}) + + target_link_libraries( + ${PROJECT_NAME}_ram.elf + c + nosys + opencm3_lpc43xx + m + ) + + set_target_properties(${PROJECT_NAME}_ram.elf PROPERTIES LINK_FLAGS "${LDFLAGS_M4_RAM}") + + add_custom_target( + ${PROJECT_NAME}_ram.bin + DEPENDS ${PROJECT_NAME}_ram.elf + COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}_ram.elf ${PROJECT_NAME}_ram.bin + ) + # DFU - using a differnet LD script to run directly from RAM # Object files to be linked for DFU flash versions add_library(${PROJECT_NAME}_dfu_objects OBJECT ${SRC_M4} m0_bin.s) - set_target_properties(${PROJECT_NAME}_dfu_objects PROPERTIES COMPILE_FLAGS "${CFLAGS_M4_DFU}") + set_target_properties(${PROJECT_NAME}_dfu_objects PROPERTIES COMPILE_FLAGS "${CFLAGS_M4_RAM} -DDFU_MODE") add_dependencies(${PROJECT_NAME}_dfu_objects ${PROJECT_NAME}_m0.bin) add_executable(${PROJECT_NAME}_dfu.elf $) add_dependencies(${PROJECT_NAME}_dfu.elf libopencm3_${PROJECT_NAME}) @@ -217,7 +241,7 @@ macro(DeclareTargets) m ) - set_target_properties(${PROJECT_NAME}_dfu.elf PROPERTIES LINK_FLAGS "${LDFLAGS_M4_DFU}") + set_target_properties(${PROJECT_NAME}_dfu.elf PROPERTIES LINK_FLAGS "${LDFLAGS_M4_RAM}") add_custom_target( ${PROJECT_NAME}_dfu.bin From 53e8d698c7eb767dd04998a310121f9d5f6de184 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 27 Mar 2019 11:18:24 -0700 Subject: [PATCH 25/26] CMake: Extracted custom binary targets into a macro. Less error-prone, making changes across the (now three) different binaries for each project. --- firmware/hackrf-common.cmake | 97 ++++++++++-------------------------- 1 file changed, 27 insertions(+), 70 deletions(-) diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index 6e040811..08bd62fb 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -111,6 +111,30 @@ set(BUILD_SHARED_LIBS OFF) include_directories("${LIBOPENCM3}/include/") include_directories("${PATH_HACKRF_FIRMWARE_COMMON}") +macro(DeclareTarget project_name variant_suffix cflags ldflags) + add_library(${project_name}${variant_suffix}_objects OBJECT ${SRC_M4} m0_bin.s) + set_target_properties(${project_name}${variant_suffix}_objects PROPERTIES COMPILE_FLAGS "${cflags}") + add_dependencies(${project_name}${variant_suffix}_objects ${project_name}_m0.bin) + add_executable(${project_name}${variant_suffix}.elf $) + add_dependencies(${project_name}${variant_suffix}.elf libopencm3_${project_name}) + + target_link_libraries( + ${project_name}${variant_suffix}.elf + c + nosys + opencm3_lpc43xx + m + ) + + set_target_properties(${project_name}${variant_suffix}.elf PROPERTIES LINK_FLAGS "${ldflags}") + + add_custom_target( + ${project_name}${variant_suffix}.bin ALL + DEPENDS ${project_name}${variant_suffix}.elf + COMMAND ${CMAKE_OBJCOPY} -Obinary ${project_name}${variant_suffix}.elf ${project_name}${variant_suffix}.bin + ) +endmacro() + macro(DeclareTargets) SET(SRC_M4 ${SRC_M4} @@ -178,76 +202,9 @@ macro(DeclareTargets) COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}_m0.elf ${PROJECT_NAME}_m0.bin ) - # Object files to be linked for SPI flash versions - add_library(${PROJECT_NAME}_objects OBJECT ${SRC_M4} m0_bin.s) - set_target_properties(${PROJECT_NAME}_objects PROPERTIES COMPILE_FLAGS "${CFLAGS_M4}") - add_dependencies(${PROJECT_NAME}_objects ${PROJECT_NAME}_m0.bin) - add_executable(${PROJECT_NAME}.elf $) - add_dependencies(${PROJECT_NAME}.elf libopencm3_${PROJECT_NAME}) - - target_link_libraries( - ${PROJECT_NAME}.elf - c - nosys - opencm3_lpc43xx - m - ) - - set_target_properties(${PROJECT_NAME}.elf PROPERTIES LINK_FLAGS "${LDFLAGS_M4}") - - add_custom_target( - ${PROJECT_NAME}.bin ALL - DEPENDS ${PROJECT_NAME}.elf - COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin - ) - - # RAM - using a differnet LD script to run directly from RAM - # TODO: Duplicated from DFU code, below, except without -DDFU_MODE. Extract to shared code somehow. - add_library(${PROJECT_NAME}_ram_objects OBJECT ${SRC_M4} m0_bin.s) - set_target_properties(${PROJECT_NAME}_ram_objects PROPERTIES COMPILE_FLAGS "${CFLAGS_M4_RAM}") - add_dependencies(${PROJECT_NAME}_ram_objects ${PROJECT_NAME}_m0.bin) - add_executable(${PROJECT_NAME}_ram.elf $) - add_dependencies(${PROJECT_NAME}_ram.elf libopencm3_${PROJECT_NAME}) - - target_link_libraries( - ${PROJECT_NAME}_ram.elf - c - nosys - opencm3_lpc43xx - m - ) - - set_target_properties(${PROJECT_NAME}_ram.elf PROPERTIES LINK_FLAGS "${LDFLAGS_M4_RAM}") - - add_custom_target( - ${PROJECT_NAME}_ram.bin - DEPENDS ${PROJECT_NAME}_ram.elf - COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}_ram.elf ${PROJECT_NAME}_ram.bin - ) - - # DFU - using a differnet LD script to run directly from RAM - # Object files to be linked for DFU flash versions - add_library(${PROJECT_NAME}_dfu_objects OBJECT ${SRC_M4} m0_bin.s) - set_target_properties(${PROJECT_NAME}_dfu_objects PROPERTIES COMPILE_FLAGS "${CFLAGS_M4_RAM} -DDFU_MODE") - add_dependencies(${PROJECT_NAME}_dfu_objects ${PROJECT_NAME}_m0.bin) - add_executable(${PROJECT_NAME}_dfu.elf $) - add_dependencies(${PROJECT_NAME}_dfu.elf libopencm3_${PROJECT_NAME}) - - target_link_libraries( - ${PROJECT_NAME}_dfu.elf - c - nosys - opencm3_lpc43xx - m - ) - - set_target_properties(${PROJECT_NAME}_dfu.elf PROPERTIES LINK_FLAGS "${LDFLAGS_M4_RAM}") - - add_custom_target( - ${PROJECT_NAME}_dfu.bin - DEPENDS ${PROJECT_NAME}_dfu.elf - COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}_dfu.elf ${PROJECT_NAME}_dfu.bin - ) + DeclareTarget("${PROJECT_NAME}" "" "${CFLAGS_M4}" "${LDFLAGS_M4}") + DeclareTarget("${PROJECT_NAME}" "_ram" "${CFLAGS_M4_RAM}" "${LDFLAGS_M4_RAM}") + DeclareTarget("${PROJECT_NAME}" "_dfu" "${CFLAGS_M4_RAM} -DDFU_MODE" "${LDFLAGS_M4_RAM}") add_custom_target( ${PROJECT_NAME}.dfu ${DFU_ALL} From ef5b907295bbfc86e183d8f6249ac7d88d42870b Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 27 Mar 2019 12:16:39 -0700 Subject: [PATCH 26/26] CPLD: Remove checksum function from libhackrf and hackrf_info. The checksum calculation process was causing the CPLD configuration to reload from flash. With the new SRAM loading mechanism, flash contents may not be up to date, so the CPLD bitstream may regress to the point of not working or not working correctly. This commit is a short-term fix for mossmann/hackrf issue #609. --- host/hackrf-tools/src/hackrf_info.c | 4 +++- host/libhackrf/src/hackrf.c | 2 ++ host/libhackrf/src/hackrf.h | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/host/hackrf-tools/src/hackrf_info.c b/host/hackrf-tools/src/hackrf_info.c index 9c10ad5f..e962f086 100644 --- a/host/hackrf-tools/src/hackrf_info.c +++ b/host/hackrf-tools/src/hackrf_info.c @@ -125,7 +125,8 @@ int main(void) printf("Operacake found, address: 0x%02x\n", operacakes[j]); } } - + +#ifdef HACKRF_ISSUE_609_IS_FIXED uint32_t cpld_crc = 0; result = hackrf_cpld_checksum(device, &cpld_crc); if ((result != HACKRF_SUCCESS) && (result != HACKRF_ERROR_USB_API_VERSION)) { @@ -136,6 +137,7 @@ int main(void) if(result == HACKRF_SUCCESS) { printf("CPLD checksum: 0x%08x\n", cpld_crc); } +#endif /* HACKRF_ISSUE_609_IS_FIXED */ result = hackrf_close(device); if (result != HACKRF_SUCCESS) { diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index db1cf862..76f74895 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -2105,6 +2105,7 @@ int ADDCALL hackrf_operacake_gpio_test(hackrf_device* device, const uint8_t addr } } +#ifdef HACKRF_ISSUE_609_IS_FIXED int ADDCALL hackrf_cpld_checksum(hackrf_device* device, uint32_t* crc) { @@ -2133,6 +2134,7 @@ int ADDCALL hackrf_cpld_checksum(hackrf_device* device, return HACKRF_SUCCESS; } } +#endif /* HACKRF_ISSUE_609_IS_FIXED */ #ifdef __cplusplus } // __cplusplus defined. diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index 2dfdb8d4..7e5d2425 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -254,9 +254,10 @@ extern ADDAPI int ADDCALL hackrf_set_clkout_enable(hackrf_device* device, const extern ADDAPI int ADDCALL hackrf_operacake_gpio_test(hackrf_device* device, uint8_t address, uint16_t* test_result); - +#ifdef HACKRF_ISSUE_609_IS_FIXED extern ADDAPI int ADDCALL hackrf_cpld_checksum(hackrf_device* device, uint32_t* crc); +#endif /* HACKRF_ISSUE_609_IS_FIXED */ #ifdef __cplusplus } // __cplusplus defined.