

<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://proghq.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Drh</id>
	<title>Proghq - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://proghq.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Drh"/>
	<link rel="alternate" type="text/html" href="https://proghq.org/wiki/Special:Contributions/Drh"/>
	<updated>2026-04-15T02:20:35Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=987</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=987"/>
		<updated>2025-04-06T14:20:36Z</updated>

		<summary type="html">&lt;p&gt;Drh: Add OVC documentation to logic tests.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|AUTO_FIND&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x28 LOGIC_IC_TEST_VECTOR (t48) ======&lt;br /&gt;
 send 28 vv pp 00 n1 n2 n3 n4 [test vector]&lt;br /&gt;
 recv 28 xx pp 00 00 00 00 00 [test reply]&lt;br /&gt;
&lt;br /&gt;
Performs a logic test.&amp;lt;/br&amp;gt;&lt;br /&gt;
vv&amp;amp;0x7F sets VCC voltage. &lt;br /&gt;
 voltagemap_logic_vcc[4]={ 5, 3.3, 2.5, 1.8 };&lt;br /&gt;
If vv&amp;amp;0x80 is true set pulldowns otherwise pullups.&amp;lt;/br&amp;gt;&lt;br /&gt;
pp is the number of pins which must be an even number from 2 to 40,&lt;br /&gt;
corresponding to the number of pins of the chip under test. Setting&lt;br /&gt;
a value higher than 40 will lock up the T48.&amp;lt;/br&amp;gt;&lt;br /&gt;
n1 n2 n3 n4 is a 32 bit sequence number N which is typically incremented for each&lt;br /&gt;
test. If N is zero the logic test sets voltages and assigns VCC and GND&lt;br /&gt;
according to the test vector, it also resets all ISP pins to input. If N is non-zero the VCC voltage setting is ignored,&lt;br /&gt;
VCC and GND are not reassigned, ISP values are unchanged. Pullups or pulldowns are still set according to vv&amp;amp;0x80.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test vector]&#039;&#039;&#039; consists of 24 bytes of which only the first pp/2 are significant. Each nyble corresponds to&lt;br /&gt;
a pin, lowest nyble first. That is low nyble of the initial byte is pin 1&lt;br /&gt;
and the high nyble pin2. The nyble can take values 0 through 8 representing 0, 1, L, H, C, Z, X, G, and V respectively.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test reply]&#039;&#039;&#039; contains the logic state of each pin in the same format as the test vector. Each nyble will be 0 or&lt;br /&gt;
1.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pin can be tested for high impedance (tri-state) by performing the same test twice: once with pullup and the second time&lt;br /&gt;
with pulldown. If the pin changes from 1 to 0 it is tri-state otherwise the pin is driving it.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The test vector will silently allow VCC and GND assignments to pins which do not support it.&amp;lt;/br&amp;gt;&lt;br /&gt;
By keeping the sequence number non-zero VCC voltages can be set to values not normally supported by logic test. ISP settings can also be retained.&amp;lt;/br&amp;gt;&lt;br /&gt;
The pin numbers in the test vector and response are the pins of the inserted IC: not the pin numbers of the ZIF socket.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xx is normally 00 if it is 01 then overcurrent protection was triggered when performing the test.&lt;br /&gt;
&lt;br /&gt;
====== 0x29 AUTO_FIND (t48) ======&lt;br /&gt;
 send 29 00 00 00 00 00 00 00&lt;br /&gt;
 recv 29 00 pp 00 00 00 00 00 [pins]&lt;br /&gt;
&lt;br /&gt;
Attempt to detect which pins are active in the ZIF socket. This is used by logic tests when the &amp;quot;Auto Find&amp;quot; button is clicked.&lt;br /&gt;
pp is the number of pins checked and is always 40 (0x28). &#039;&#039;&#039;[pins]&#039;&#039;&#039; is a list of pp pins one pin per byte. If the corresponding&lt;br /&gt;
byte is set to 1 then the pin is active, 0 otherwise. &lt;br /&gt;
&lt;br /&gt;
====== 0x2d  RESET_PIN_DRIVERS (t48) ======&lt;br /&gt;
 send 2d 00 00 00 00 00 00 00 &lt;br /&gt;
Reset all pins state: set all pins to input, remove any GCC/VCC/VPP assignment,&lt;br /&gt;
remove pullups and set VPP/VPP/VCCIO voltages to defaults.&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 and 1 enables VCC on ISP-connector J13/J14.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. Default is 15. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector J1.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step. Default is 07.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04, default is 03. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 through 2 enable EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 xx 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx should be 00 if it is 01 then overcurrent protection has been triggered.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=986</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=986"/>
		<updated>2025-04-06T12:15:38Z</updated>

		<summary type="html">&lt;p&gt;Drh: Add OVC documentation to READ_PINS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|AUTO_FIND&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x28 LOGIC_IC_TEST_VECTOR (t48) ======&lt;br /&gt;
 send 28 vv pp 00 n1 n2 n3 n4 [test vector]&lt;br /&gt;
 recv 28 00 pp 00 00 00 00 00 [test reply]&lt;br /&gt;
&lt;br /&gt;
Performs a logic test.&amp;lt;/br&amp;gt;&lt;br /&gt;
vv&amp;amp;0x7F sets VCC voltage. &lt;br /&gt;
 voltagemap_logic_vcc[4]={ 5, 3.3, 2.5, 1.8 };&lt;br /&gt;
If vv&amp;amp;0x80 is true set pulldowns otherwise pullups.&amp;lt;/br&amp;gt;&lt;br /&gt;
pp is the number of pins which must be an even number from 2 to 40,&lt;br /&gt;
corresponding to the number of pins of the chip under test. Setting&lt;br /&gt;
a value higher than 40 will lock up the T48.&amp;lt;/br&amp;gt;&lt;br /&gt;
n1 n2 n3 n4 is a 32 bit sequence number N which is typically incremented for each&lt;br /&gt;
test. If N is zero the logic test sets voltages and assigns VCC and GND&lt;br /&gt;
according to the test vector, it also resets all ISP pins to input. If N is non-zero the VCC voltage setting is ignored,&lt;br /&gt;
VCC and GND are not reassigned, ISP values are unchanged. Pullups or pulldowns are still set according to vv&amp;amp;0x80.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test vector]&#039;&#039;&#039; consists of 24 bytes of which only the first pp/2 are significant. Each nyble corresponds to&lt;br /&gt;
a pin, lowest nyble first. That is low nyble of the initial byte is pin 1&lt;br /&gt;
and the high nyble pin2. The nyble can take values 0 through 8 representing 0, 1, L, H, C, Z, X, G, and V respectively.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test reply]&#039;&#039;&#039; contains the logic state of each pin in the same format as the test vector. Each nyble will be 0 or&lt;br /&gt;
1.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pin can be tested for high impedance (tri-state) by performing the same test twice: once with pullup and the second time&lt;br /&gt;
with pulldown. If the pin changes from 1 to 0 it is tri-state otherwise the pin is driving it.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The test vector will silently allow VCC and GND assignments to pins which do not support it.&amp;lt;/br&amp;gt;&lt;br /&gt;
By keeping the sequence number non-zero VCC voltages can be set to values not normally supported by logic test. ISP settings can also be retained.&amp;lt;/br&amp;gt;&lt;br /&gt;
The pin numbers in the test vector and response are the pins of the inserted IC: not the pin numbers of the ZIF socket.&lt;br /&gt;
&lt;br /&gt;
====== 0x29 AUTO_FIND (t48) ======&lt;br /&gt;
 send 29 00 00 00 00 00 00 00&lt;br /&gt;
 recv 29 00 pp 00 00 00 00 00 [pins]&lt;br /&gt;
&lt;br /&gt;
Attempt to detect which pins are active in the ZIF socket. This is used by logic tests when the &amp;quot;Auto Find&amp;quot; button is clicked.&lt;br /&gt;
pp is the number of pins checked and is always 40 (0x28). &#039;&#039;&#039;[pins]&#039;&#039;&#039; is a list of pp pins one pin per byte. If the corresponding&lt;br /&gt;
byte is set to 1 then the pin is active, 0 otherwise. &lt;br /&gt;
&lt;br /&gt;
====== 0x2d  RESET_PIN_DRIVERS (t48) ======&lt;br /&gt;
 send 2d 00 00 00 00 00 00 00 &lt;br /&gt;
Reset all pins state: set all pins to input, remove any GCC/VCC/VPP assignment,&lt;br /&gt;
remove pullups and set VPP/VPP/VCCIO voltages to defaults.&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 and 1 enables VCC on ISP-connector J13/J14.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. Default is 15. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector J1.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step. Default is 07.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04, default is 03. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 through 2 enable EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 xx 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx should be 00 if it is 01 then overcurrent protection has been triggered.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=983</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=983"/>
		<updated>2024-10-25T13:36:55Z</updated>

		<summary type="html">&lt;p&gt;Drh: AUTO_FIND also supported by TL866II+&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|AUTO_FIND&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x28 LOGIC_IC_TEST_VECTOR (t48) ======&lt;br /&gt;
 send 28 vv pp 00 n1 n2 n3 n4 [test vector]&lt;br /&gt;
 recv 28 00 pp 00 00 00 00 00 [test reply]&lt;br /&gt;
&lt;br /&gt;
Performs a logic test.&amp;lt;/br&amp;gt;&lt;br /&gt;
vv&amp;amp;0x7F sets VCC voltage. &lt;br /&gt;
 voltagemap_logic_vcc[4]={ 5, 3.3, 2.5, 1.8 };&lt;br /&gt;
If vv&amp;amp;0x80 is true set pulldowns otherwise pullups.&amp;lt;/br&amp;gt;&lt;br /&gt;
pp is the number of pins which must be an even number from 2 to 40,&lt;br /&gt;
corresponding to the number of pins of the chip under test. Setting&lt;br /&gt;
a value higher than 40 will lock up the T48.&amp;lt;/br&amp;gt;&lt;br /&gt;
n1 n2 n3 n4 is a 32 bit sequence number N which is typically incremented for each&lt;br /&gt;
test. If N is zero the logic test sets voltages and assigns VCC and GND&lt;br /&gt;
according to the test vector, it also resets all ISP pins to input. If N is non-zero the VCC voltage setting is ignored,&lt;br /&gt;
VCC and GND are not reassigned, ISP values are unchanged. Pullups or pulldowns are still set according to vv&amp;amp;0x80.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test vector]&#039;&#039;&#039; consists of 24 bytes of which only the first pp/2 are significant. Each nyble corresponds to&lt;br /&gt;
a pin, lowest nyble first. That is low nyble of the initial byte is pin 1&lt;br /&gt;
and the high nyble pin2. The nyble can take values 0 through 8 representing 0, 1, L, H, C, Z, X, G, and V respectively.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test reply]&#039;&#039;&#039; contains the logic state of each pin in the same format as the test vector. Each nyble will be 0 or&lt;br /&gt;
1.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pin can be tested for high impedance (tri-state) by performing the same test twice: once with pullup and the second time&lt;br /&gt;
with pulldown. If the pin changes from 1 to 0 it is tri-state otherwise the pin is driving it.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The test vector will silently allow VCC and GND assignments to pins which do not support it.&amp;lt;/br&amp;gt;&lt;br /&gt;
By keeping the sequence number non-zero VCC voltages can be set to values not normally supported by logic test. ISP settings can also be retained.&amp;lt;/br&amp;gt;&lt;br /&gt;
The pin numbers in the test vector and response are the pins of the inserted IC: not the pin numbers of the ZIF socket.&lt;br /&gt;
&lt;br /&gt;
====== 0x29 AUTO_FIND (t48) ======&lt;br /&gt;
 send 29 00 00 00 00 00 00 00&lt;br /&gt;
 recv 29 00 pp 00 00 00 00 00 [pins]&lt;br /&gt;
&lt;br /&gt;
Attempt to detect which pins are active in the ZIF socket. This is used by logic tests when the &amp;quot;Auto Find&amp;quot; button is clicked.&lt;br /&gt;
pp is the number of pins checked and is always 40 (0x28). &#039;&#039;&#039;[pins]&#039;&#039;&#039; is a list of pp pins one pin per byte. If the corresponding&lt;br /&gt;
byte is set to 1 then the pin is active, 0 otherwise. &lt;br /&gt;
&lt;br /&gt;
====== 0x2d  RESET_PIN_DRIVERS (t48) ======&lt;br /&gt;
 send 2d 00 00 00 00 00 00 00 &lt;br /&gt;
Reset all pins state: set all pins to input, remove any GCC/VCC/VPP assignment,&lt;br /&gt;
remove pullups and set VPP/VPP/VCCIO voltages to defaults.&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 and 1 enables VCC on ISP-connector J13/J14.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. Default is 15. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector J1.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step. Default is 07.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04, default is 03. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 through 2 enable EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 00 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=982</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=982"/>
		<updated>2024-10-25T12:48:47Z</updated>

		<summary type="html">&lt;p&gt;Drh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|AUTO_FIND&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x28 LOGIC_IC_TEST_VECTOR (t48) ======&lt;br /&gt;
 send 28 vv pp 00 n1 n2 n3 n4 [test vector]&lt;br /&gt;
 recv 28 00 pp 00 00 00 00 00 [test reply]&lt;br /&gt;
&lt;br /&gt;
Performs a logic test.&amp;lt;/br&amp;gt;&lt;br /&gt;
vv&amp;amp;0x7F sets VCC voltage. &lt;br /&gt;
 voltagemap_logic_vcc[4]={ 5, 3.3, 2.5, 1.8 };&lt;br /&gt;
If vv&amp;amp;0x80 is true set pulldowns otherwise pullups.&amp;lt;/br&amp;gt;&lt;br /&gt;
pp is the number of pins which must be an even number from 2 to 40,&lt;br /&gt;
corresponding to the number of pins of the chip under test. Setting&lt;br /&gt;
a value higher than 40 will lock up the T48.&amp;lt;/br&amp;gt;&lt;br /&gt;
n1 n2 n3 n4 is a 32 bit sequence number N which is typically incremented for each&lt;br /&gt;
test. If N is zero the logic test sets voltages and assigns VCC and GND&lt;br /&gt;
according to the test vector, it also resets all ISP pins to input. If N is non-zero the VCC voltage setting is ignored,&lt;br /&gt;
VCC and GND are not reassigned, ISP values are unchanged. Pullups or pulldowns are still set according to vv&amp;amp;0x80.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test vector]&#039;&#039;&#039; consists of 24 bytes of which only the first pp/2 are significant. Each nyble corresponds to&lt;br /&gt;
a pin, lowest nyble first. That is low nyble of the initial byte is pin 1&lt;br /&gt;
and the high nyble pin2. The nyble can take values 0 through 8 representing 0, 1, L, H, C, Z, X, G, and V respectively.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test reply]&#039;&#039;&#039; contains the logic state of each pin in the same format as the test vector. Each nyble will be 0 or&lt;br /&gt;
1.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pin can be tested for high impedance (tri-state) by performing the same test twice: once with pullup and the second time&lt;br /&gt;
with pulldown. If the pin changes from 1 to 0 it is tri-state otherwise the pin is driving it.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The test vector will silently allow VCC and GND assignments to pins which do not support it.&amp;lt;/br&amp;gt;&lt;br /&gt;
By keeping the sequence number non-zero VCC voltages can be set to values not normally supported by logic test. ISP settings can also be retained.&amp;lt;/br&amp;gt;&lt;br /&gt;
The pin numbers in the test vector and response are the pins of the inserted IC: not the pin numbers of the ZIF socket.&lt;br /&gt;
&lt;br /&gt;
====== 0x29 AUTO_FIND (t48) ======&lt;br /&gt;
 send 29 00 00 00 00 00 00 00&lt;br /&gt;
 recv 29 00 pp 00 00 00 00 00 [pins]&lt;br /&gt;
&lt;br /&gt;
Attempt to detect which pins are active in the ZIF socket. This is used by logic tests when the &amp;quot;Auto Find&amp;quot; button is clicked.&lt;br /&gt;
pp is the number of pins checked and is always 40 (0x28). &#039;&#039;&#039;[pins]&#039;&#039;&#039; is a list of pp pins one pin per byte. If the corresponding&lt;br /&gt;
byte is set to 1 then the pin is active, 0 otherwise. &lt;br /&gt;
&lt;br /&gt;
====== 0x2d  RESET_PIN_DRIVERS (t48) ======&lt;br /&gt;
 send 2d 00 00 00 00 00 00 00 &lt;br /&gt;
Reset all pins state: set all pins to input, remove any GCC/VCC/VPP assignment,&lt;br /&gt;
remove pullups and set VPP/VPP/VCCIO voltages to defaults.&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 and 1 enables VCC on ISP-connector J13/J14.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. Default is 15. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector J1.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step. Default is 07.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04, default is 03. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 through 2 enable EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 00 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=981</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=981"/>
		<updated>2024-10-23T14:12:48Z</updated>

		<summary type="html">&lt;p&gt;Drh: Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|?? autofind ??&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x28 LOGIC_IC_TEST_VECTOR (t48) ======&lt;br /&gt;
 send 28 vv pp 00 n1 n2 n3 n4 [test vector]&lt;br /&gt;
 recv 28 00 pp 00 00 00 00 00 [test reply]&lt;br /&gt;
&lt;br /&gt;
Performs a logic test.&amp;lt;/br&amp;gt;&lt;br /&gt;
vv&amp;amp;0x7F sets VCC voltage. &lt;br /&gt;
 voltagemap_logic_vcc[4]={ 5, 3.3, 2.5, 1.8 };&lt;br /&gt;
If vv&amp;amp;0x80 is true set pulldowns otherwise pullups.&amp;lt;/br&amp;gt;&lt;br /&gt;
pp is the number of pins which must be an even number from 2 to 40,&lt;br /&gt;
corresponding to the number of pins of the chip under test. Setting&lt;br /&gt;
a value higher than 40 will lock up the T48.&amp;lt;/br&amp;gt;&lt;br /&gt;
n1 n2 n3 n4 is a 32 bit sequence number N which is typically incremented for each&lt;br /&gt;
test. If N is zero the logic test sets voltages and assigns VCC and GND&lt;br /&gt;
according to the test vector, it also resets all ISP pins to input. If N is non-zero the VCC voltage setting is ignored,&lt;br /&gt;
VCC and GND are not reassigned, ISP values are unchanged. Pullups or pulldowns are still set according to vv&amp;amp;0x80.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test vector]&#039;&#039;&#039; consists of 24 bytes of which only the first pp/2 are significant. Each nyble corresponds to&lt;br /&gt;
a pin, lowest nyble first. That is low nyble of the initial byte is pin 1&lt;br /&gt;
and the high nyble pin2. The nyble can take values 0 through 8 representing 0, 1, L, H, C, Z, X, G, and V respectively.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test reply]&#039;&#039;&#039; contains the logic state of each pin in the same format as the test vector. Each nyble will be 0 or&lt;br /&gt;
1.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pin can be tested for high impedance (tri-state) by performing the same test twice: once with pullup and the second time&lt;br /&gt;
with pulldown. If the pin changes from 1 to 0 it is tri-state otherwise the pin is driving it.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The test vector will silently allow VCC and GND assignments to pins which do not support it.&amp;lt;/br&amp;gt;&lt;br /&gt;
By keeping the sequence number non-zero VCC voltages can be set to values not normally supported by logic test. ISP settings can also be retained.&amp;lt;/br&amp;gt;&lt;br /&gt;
The pin numbers in the test vector and response are the pins of the inserted IC: not the pin numbers of the ZIF socket.&lt;br /&gt;
&lt;br /&gt;
====== 0x2d  RESET_PIN_DRIVERS (t48) ======&lt;br /&gt;
 send 2d 00 00 00 00 00 00 00 &lt;br /&gt;
Reset all pins state: set all pins to input, remove any GCC/VCC/VPP assignment,&lt;br /&gt;
remove pullups and set VPP/VPP/VCCIO voltages to defaults.&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 and 1 enables VCC on ISP-connector J13/J14.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. Default is 15. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector J1.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step. Default is 07.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04, default is 03. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 through 2 enable EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 00 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=Talk:XGecu_Protocol&amp;diff=979</id>
		<title>Talk:XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=Talk:XGecu_Protocol&amp;diff=979"/>
		<updated>2024-09-21T16:32:40Z</updated>

		<summary type="html">&lt;p&gt;Drh: /* (0x34) Was SET_DIR */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;T48 0x24 command byte seems to be Adapter detection/DRM.&amp;lt;br&amp;gt;&lt;br /&gt;
Here are the queries to the T48 for some adapters:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 01 00 00 00 .... F48_EX-1&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 02 00 00 00 .... S44_EX-1&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 08 00 00 00 .... F48_EX-2&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 0B 00 00 00 .... F56_EX-A&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 00 40 00 00 .... EMMC_ISP&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 00 00 00 E1 .... BGA48-E001&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 00 00 00 E2 .... BGA63_EX-1&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 00 00 00 E3 .... BGA64-EX-A&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 00 00 00 E4 .... BGA64-EX-B&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 00 00 00 E5 .... BGA169/BGA153&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 00 00 00 E6 .... BGA162&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 00 00 00 E7 .... BGA221&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 00 00 00 E8 .... BGA100_EX&amp;lt;br&amp;gt;&lt;br /&gt;
24 E0 28 00 00 00 00 00 00 00 00 EC .... EMMC_SD&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
weird&lt;br /&gt;
-- with the emmc_isp un-plugged:, reading an IS21ES04G-JCLI(ISP)_1Bit&lt;br /&gt;
1 &amp;lt;--              UNKNOWN 24 F0 00 00 01 00 00 00 &lt;br /&gt;
1 &amp;lt;--              UNKNOWN 24 E0 28 00 00 00 00 00 00 40 00 00 &lt;br /&gt;
1 --&amp;gt; RETURNS              24 D0 30 00 14 01 07 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &lt;br /&gt;
1 &amp;lt;--              UNKNOWN 24 F1 00 00 00 00 00 00 &lt;br /&gt;
1 &amp;lt;--             TRAN_END 04 01 00 00 00 00 00 00 &lt;br /&gt;
&lt;br /&gt;
-- With the emmc_isp plugged-in and reading an IS21ES04G-JCLI(ISP)_1Bit&lt;br /&gt;
1 &amp;lt;--              UNKNOWN 24 F0 00 00 01 00 00 00&lt;br /&gt;
1 &amp;lt;--              UNKNOWN 24 E0 28 00 00 00 00 00 00 40 00 00&lt;br /&gt;
1 --&amp;gt; RETURNS              24 00 30 00 14 01 07 FF 58 47 65 63 75 20 44 69 72 65 63 74 6C 79 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 A0 AD &lt;br /&gt;
1 &amp;lt;--              UNKNOWN 24 F1 00 00 00 00 00 00 &lt;br /&gt;
1 &amp;lt;--           TRAN_START 03 31 00 81 01 05 A1 00 20 00 00 00 41 00 20 00 00 02 00 00 00 01 00 FF 03 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 10 00 00 00 00 00 00 00 00 00 00 00 38 08 20 00 00 00 00 41 &lt;br /&gt;
1 &amp;lt;--           GET_STATUS 39 31 00 81 01 05 A1 00 &lt;br /&gt;
1 --&amp;gt; RETURNS              00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 &lt;br /&gt;
1 &amp;lt;--                ERROR 21 04 00 00 00 00 00 00 &lt;br /&gt;
1 --&amp;gt; RETURNS              &lt;br /&gt;
1 &amp;lt;--             TRAN_END 04 01 00 00 &lt;br /&gt;
&lt;br /&gt;
-- with the emmc_isp un-plugged again, transaction is starting:&lt;br /&gt;
1 &amp;lt;--              UNKNOWN 24 F0 00 00 01 00 00 00&lt;br /&gt;
1 &amp;lt;--              UNKNOWN 24 E0 28 00 00 00 00 00 00 40 00 00&lt;br /&gt;
1 --&amp;gt; RETURNS              24 00 00 00 00 00 00 00&lt;br /&gt;
1 &amp;lt;--              UNKNOWN 24 F1 00 00 00 00 00 00&lt;br /&gt;
1 &amp;lt;--           TRAN_START 03 31 00 81 01 05 A1 00 20 00 00 00 41 00 20 00 00 02 00 00 00 01 00 FF 03 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 10 00 00 00 00 00 00 00 00 00 00 00 38 08 20 00 00 00 00 41&lt;br /&gt;
1 &amp;lt;--           GET_STATUS 39 31 00 81 01 05 A1 00&lt;br /&gt;
1 --&amp;gt; RETURNS              00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&lt;br /&gt;
1 &amp;lt;--                ERROR 21 04 00 00 00 00 00 00&lt;br /&gt;
1 --&amp;gt; RETURNS              21 2A 00 00 00 00 00 00&lt;br /&gt;
1 &amp;lt;--             TRAN_END 04 01 00 00&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 0x3E (pin detect) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pin detect response in the form 3E00xxxx000000XXXXXXYYYYYY0000, where XXXXXX seems to be one row of pin state, and YYYYYY the other.&lt;br /&gt;
&lt;br /&gt;
x x x x x x x x x x x x x x x x - - - -&lt;br /&gt;
&lt;br /&gt;
U     FFFF00 FFFF00&lt;br /&gt;
&lt;br /&gt;
x x x x x x x x x x x x x x x x - - - -&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
x x x x x x x x x x x x x x x x x - - -&lt;br /&gt;
&lt;br /&gt;
U     FFFF80 FFFF00&lt;br /&gt;
&lt;br /&gt;
x x x x x x x x x x x x x x x x - - - -&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
x x x x x x x x x x x x x x x x - - - -&lt;br /&gt;
&lt;br /&gt;
U     FFFF0C FFFF00&lt;br /&gt;
&lt;br /&gt;
x x x x x x x x x x x x x x x x - - x x&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
x x x x x x x x x x x x x x x x - - x x&lt;br /&gt;
&lt;br /&gt;
U     FFFF30 FFFF00&lt;br /&gt;
&lt;br /&gt;
x x x x x x x x x x x x x x x x - - - -&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
x x - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&lt;br /&gt;
U     000000 00C000&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- - x x - - - - - - - - - - - - - - - -&lt;br /&gt;
&lt;br /&gt;
U     000000 003000&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&lt;br /&gt;
U     030000 000000&lt;br /&gt;
&lt;br /&gt;
x x - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
&lt;br /&gt;
U     060000 000000&lt;br /&gt;
&lt;br /&gt;
- x x - - - - - - - - - - - - - - - - -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== (0x34) Was SET_DIR ==&lt;br /&gt;
&lt;br /&gt;
The old SET_DIR command (0x34) on the T48 responds with 12 bytes:&lt;br /&gt;
&lt;br /&gt;
 34 00 18 00 00 00 00 00 00 00 00 00&lt;br /&gt;
&lt;br /&gt;
Anyone any idea what this represents? Assigning some of ISP to GND/VCC/VPP does produce some non-zero values for the last 4 bytes but can&#039;t find a pattern. Calling pin reset or even end transaction doesn&#039;t reset the values in the reponse.&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=978</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=978"/>
		<updated>2024-09-21T16:20:53Z</updated>

		<summary type="html">&lt;p&gt;Drh: Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|?? autofind ??&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x28 LOGIC_IC_TEST_VECTOR (t48) ======&lt;br /&gt;
 send 28 vv pp 00 n1 n2 n3 n4 [test vector]&lt;br /&gt;
 recv 28 00 pp 00 00 00 00 00 [test reply]&lt;br /&gt;
&lt;br /&gt;
Performs a logic test.&amp;lt;/br&amp;gt;&lt;br /&gt;
vv&amp;amp;0x7F sets VCC voltage. &lt;br /&gt;
 voltagemap_logic_vcc[4]={ 5, 3.3, 2.5, 1.8 };&lt;br /&gt;
If vv&amp;amp;0x80 is true set pulldowns otherwise pullups.&amp;lt;/br&amp;gt;&lt;br /&gt;
pp is the number of pins which must be an even number from 2 to 40,&lt;br /&gt;
corresponding to the number of pins of the chip under test. Setting&lt;br /&gt;
a value higher than 40 will lock up the T48.&amp;lt;/br&amp;gt;&lt;br /&gt;
n1 n2 n3 n4 is a 32 bit sequence number N which is typically incremented for each&lt;br /&gt;
test. If N is zero the logic test sets voltages and assigns VCC and GND&lt;br /&gt;
according to the test vector, it also resets all ISP pins to input. If N is non-zero the VCC voltage setting is ignored,&lt;br /&gt;
VCC and GND are not reassigned, ISP values are unchanged. Pullups or pulldowns are still set according to vv&amp;amp;0x80.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test vector]&#039;&#039;&#039; consists of 24 bytes of which only the first pp/2 are significant. Each nyble corresponds to&lt;br /&gt;
a pin, lowest nyble first. That is low nyble of the initial byte is pin 1&lt;br /&gt;
and the high nyble pin2. The nyble can take values 0 through 8 representing 0, 1, L, H, C, Z, X, G, and V respectively.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test reply]&#039;&#039;&#039; contains the logic state of each pin in the same format as the test vector. Each nyble will be 0 or&lt;br /&gt;
1.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pin can be tested for high impedance (tri-state) by performing the same test twice: once with pullup and the second time&lt;br /&gt;
with pulldown. If the pin changes from 0 to 1 it is tri-state otherwise the pin is driving it.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The test vector will silently allow VCC and GND assignments to pins which do not support it.&amp;lt;/br&amp;gt;&lt;br /&gt;
By keeping the sequence number non-zero VCC voltages can be set to values not normally supported by logic test. ISP settings can also be retained.&amp;lt;/br&amp;gt;&lt;br /&gt;
The pin numbers in the test vector and response are the pins of the inserted IC: not the pin numbers of the ZIF socket.&lt;br /&gt;
&lt;br /&gt;
====== 0x2d  RESET_PIN_DRIVERS (t48) ======&lt;br /&gt;
 send 2d 00 00 00 00 00 00 00 &lt;br /&gt;
Reset all pins state: set all pins to input, remove any GCC/VCC/VPP assignment,&lt;br /&gt;
remove pullups and set VPP/VPP/VCCIO voltages to defaults.&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 and 1 enables VCC on ISP-connector J13/J14.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. Default is 15. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector J1.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step. Default is 07.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04, default is 03. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 through 2 enable EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 00 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=977</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=977"/>
		<updated>2024-09-21T16:14:13Z</updated>

		<summary type="html">&lt;p&gt;Drh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|?? autofind ??&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x28 LOGIC_TEST_VECTOR (t48) ======&lt;br /&gt;
 send 28 vv pp 00 n1 n2 n3 n4 [test vector]&lt;br /&gt;
 recv 28 00 pp 00 00 00 00 00 [test reply]&lt;br /&gt;
&lt;br /&gt;
Performs a logic test.&amp;lt;/br&amp;gt;&lt;br /&gt;
vv&amp;amp;0x7F sets VCC voltage. &lt;br /&gt;
 voltagemap_logic_vcc[4]={ 5, 3.3, 2.5, 1.8 };&lt;br /&gt;
If vv&amp;amp;0x80 is true set pulldowns otherwise pullups.&amp;lt;/br&amp;gt;&lt;br /&gt;
pp is the number of pins which must be an even number from 2 to 40,&lt;br /&gt;
corresponding to the number of pins of the chip under test. Setting&lt;br /&gt;
a value higher than 40 will lock up the T48.&amp;lt;/br&amp;gt;&lt;br /&gt;
n1 n2 n3 n4 is a 32 bit sequence number N which is typically incremented for each&lt;br /&gt;
test. If N is zero the logic test sets voltages and assigns VCC and GND&lt;br /&gt;
according to the test vector, it also resets all ISP pins to input. If N is non-zero the VCC voltage setting is ignored,&lt;br /&gt;
VCC and GND are not reassigned, ISP values are unchanged. Pullups or pulldowns are still set according to vv&amp;amp;0x80.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test vector]&#039;&#039;&#039; consists of 24 bytes of which only the first pp/2 are significant. Each nyble corresponds to&lt;br /&gt;
a pin, lowest nyble first. That is low nyble of the initial byte is pin 1&lt;br /&gt;
and the high nyble pin2. The nyble can take values 0 through 8 representing 0, 1, L, H, C, Z, X, G, and V respectively.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[test reply]&#039;&#039;&#039; contains the logic state of each pin in the same format as the test vector. Each nyble will be 0 or&lt;br /&gt;
1.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pin can be tested for high impedance (tri-state) by performing the same test twice: once with pullup and the second time&lt;br /&gt;
with pulldown. If the pin changes from 0 to 1 it is tri-state otherwise the pin is driving it.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The test vector will silently allow VCC and GND assignments to pins which do not support it.&amp;lt;/br&amp;gt;&lt;br /&gt;
By keeping the sequence number non-zero VCC voltages can be set to values not normally supported by logic test. ISP settings can also be retained.&amp;lt;/br&amp;gt;&lt;br /&gt;
The pin numbers in the test vector and response are the pins of the inserted IC: not the pin numbers of the ZIF socket.&lt;br /&gt;
&lt;br /&gt;
====== 0x2d  RESET_PIN_DRIVERS (t48) ======&lt;br /&gt;
 send 2d 00 00 00 00 00 00 00 &lt;br /&gt;
Reset all pins state: set all pins to input, remove any GCC/VCC/VPP assignment,&lt;br /&gt;
remove pullups and set VPP/VPP/VCCIO voltages to defaults.&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 and 1 enables VCC on ISP-connector J13/J14.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. Default is 15. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector J1.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step. Default is 07.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04, default is 03. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 through 2 enable EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 00 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=976</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=976"/>
		<updated>2024-09-21T15:18:19Z</updated>

		<summary type="html">&lt;p&gt;Drh: Document RESET_PIN_DRIVERS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|?? autofind ??&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x2d  RESET_PIN_DRIVERS (t48) ======&lt;br /&gt;
 send 2d 00 00 00 00 00 00 00 &lt;br /&gt;
Reset all pins state: set all pins to input, remove any GCC/VCC/VPP assignment,&lt;br /&gt;
remove pullups and set VPP/VPP/VCCIO voltages to defaults.&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 and 1 enables VCC on ISP-connector J13/J14.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. Default is 15. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector J1.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step. Default is 07.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04, default is 03. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 through 2 enable EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 00 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=975</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=975"/>
		<updated>2024-09-21T14:48:33Z</updated>

		<summary type="html">&lt;p&gt;Drh: Add VCC/VPP/VCCIO defaults and not pullup/pulldown doesn&amp;#039;t reset some VCC/VPP/GND assignment.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|?? autofind ??&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 and 1 enables VCC on ISP-connector J13/J14.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. Default is 15. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector J1.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step. Default is 07.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04, default is 03. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 through 2 enable EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input. Any pins assigned to VPP/VCC/GND are unchanged.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 00 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=974</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=974"/>
		<updated>2024-09-21T14:35:53Z</updated>

		<summary type="html">&lt;p&gt;Drh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|?? autofind ??&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 and 1 enables VCC on ISP-connector J13/J14.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector J1.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx bits 0 through 2 enable EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 00 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=973</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=973"/>
		<updated>2024-09-21T13:52:09Z</updated>

		<summary type="html">&lt;p&gt;Drh: Document J12, J14 and J16 oddities.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|?? autofind ??&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 00 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa. ff and gg correspond to the ISP with J1 being the LSB of ff.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: J12, J14 and J16 always read as 0: they are not connected to separate I/O pins.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J12 is internally connected to ZIF pin 21.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 0 through 39 (decimal) correspond to pins 1 through 40 of the ZIF.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx values 40 through 56 (decimal) correspond to J1 through J16 of the ISP.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Attempting to set J12, J14 or J16 has no effect.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=972</id>
		<title>XGecu Protocol</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=XGecu_Protocol&amp;diff=972"/>
		<updated>2024-09-21T13:34:57Z</updated>

		<summary type="html">&lt;p&gt;Drh: Correct typo: pullups and pulldowns changed places on T48. This was correct in main body of text.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;based on minipro, list of commands:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866a/cs&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;TL866II+&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;T56&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|GET_SYSTEM_INFO&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|NAND_INIT&lt;br /&gt;
| -&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|-&lt;br /&gt;
|START_TRANSACTION&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|-&lt;br /&gt;
|END_TRANSACTION&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|-&lt;br /&gt;
|GET_CHIP_ID&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER&lt;br /&gt;
|0x10&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER&lt;br /&gt;
|0x11&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|READ_CFG&lt;br /&gt;
|0x12&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CFG&lt;br /&gt;
|0x13&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|0x09&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_USER_DATA&lt;br /&gt;
|0x14&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|0x0a&lt;br /&gt;
|-&lt;br /&gt;
|READ_USER_DATA&lt;br /&gt;
|0x15&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|0x0b&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_CODE&lt;br /&gt;
|0x20&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|0x0c&lt;br /&gt;
|-&lt;br /&gt;
|READ_CODE&lt;br /&gt;
|0x21&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|0x0d&lt;br /&gt;
|-&lt;br /&gt;
|ERASE&lt;br /&gt;
|0x22&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|0x0e&lt;br /&gt;
|-&lt;br /&gt;
|READ_DATA&lt;br /&gt;
|0x30&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_DATA&lt;br /&gt;
|0x31&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|0x11&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_LOCK&lt;br /&gt;
|0x40&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|0x14&lt;br /&gt;
|-&lt;br /&gt;
|READ_LOCK&lt;br /&gt;
|0x41&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|0x15&lt;br /&gt;
|-&lt;br /&gt;
|READ_CALIBRATION&lt;br /&gt;
|0x42&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|0x16&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_OFF&lt;br /&gt;
|0x44&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|PROTECT_ON&lt;br /&gt;
|0x45&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|0x19&lt;br /&gt;
|-&lt;br /&gt;
|AUTODETECT&lt;br /&gt;
|0xfc&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|0x37&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_WRITE&lt;br /&gt;
|0xaa&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|0x3b&lt;br /&gt;
|-&lt;br /&gt;
|BOOTLOADER_ERASE&lt;br /&gt;
|0xcc&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|0x3c&lt;br /&gt;
|-&lt;br /&gt;
|UNLOCK_TSOP48&lt;br /&gt;
|0xfd&lt;br /&gt;
|0x38&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GET_STATUS&lt;br /&gt;
|0xfe&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|0x39&lt;br /&gt;
|-&lt;br /&gt;
|READ_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|0x1d&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_JEDEC&lt;br /&gt;
| -&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|0x1e&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x26&lt;br /&gt;
|-&lt;br /&gt;
|LOGIC_IC_TEST_VECTOR&lt;br /&gt;
|&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|0x28&lt;br /&gt;
|-&lt;br /&gt;
|WRITE_BITSTREAM2&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|0x2a&lt;br /&gt;
|-&lt;br /&gt;
|SWITCH&lt;br /&gt;
| -&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|0x3d&lt;br /&gt;
|-&lt;br /&gt;
|SET_LATCH&lt;br /&gt;
|0xd1&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|RESET_PIN_DRIVERS&lt;br /&gt;
|0xd0&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|0x2d&lt;br /&gt;
|-&lt;br /&gt;
|READ_ZIF_PINS&lt;br /&gt;
|0xd2&lt;br /&gt;
|0x35&lt;br /&gt;
|&lt;br /&gt;
|0x35&lt;br /&gt;
|-&lt;br /&gt;
|SET_DIR&lt;br /&gt;
|0xd4&lt;br /&gt;
|0x34&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_OUT&lt;br /&gt;
|0xd5&lt;br /&gt;
|0x36&lt;br /&gt;
|&lt;br /&gt;
|0x36&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1b&lt;br /&gt;
|0x1b&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VCC_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|0x2e&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_VOLTAGE&lt;br /&gt;
|&lt;br /&gt;
|0x1c&lt;br /&gt;
|0x1c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_VPP_PIN&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|0x2f&lt;br /&gt;
|-&lt;br /&gt;
|SET_GND_PIN&lt;br /&gt;
|&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|0x30&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLDOWNS&lt;br /&gt;
|&lt;br /&gt;
|0x31&lt;br /&gt;
|0x32&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|SET_PULLUPS&lt;br /&gt;
|&lt;br /&gt;
|0x32&lt;br /&gt;
|0x31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|RESET&lt;br /&gt;
|0xff&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|0x3f&lt;br /&gt;
|-&lt;br /&gt;
|? pin detect&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x3e&lt;br /&gt;
|0x3e&lt;br /&gt;
|-&lt;br /&gt;
|?? autofind ??&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|detect_drm_adapter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x24&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|??? set / read / pin (imax?)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x33&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|??? after read cfg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== 0x2E  SET_VCC_PIN (and voltage) (t48) ======&lt;br /&gt;
 send 2e 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00  yy 00 zz 00 &lt;br /&gt;
Set which pins are VCC in aa bb cc dd according to vcc pin map, lsb of aa first:&lt;br /&gt;
 vccmap = &lt;br /&gt;
 [1,2,3,4,5,6,7,8,16,15,14,13,12,11,10,9,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
yy is written straight to DAC hold register R32_DAC_R12BDHR2. Some code writes it to 0x96,&lt;br /&gt;
writing 0x01 e.g. breaks reading voltages with cmd 0x33 but with 0x00 it still works.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VCC on ISP-connector.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
zz is VCC voltage 01 to 3F. 00 means don&#039;t set VCC. &lt;br /&gt;
 voltagemap_vcc[64]={  0.0, 1.74, 1.83, 1.89, 2.00, 2.07, 2.18, 2.23,&lt;br /&gt;
                      2.32, 2.41, 2.45, 2.56, 2.65, 2.73, 2.79, 2.90,&lt;br /&gt;
                      3.02, 3.08, 3.16, 3.28, 3.33, 3.42, 3.48, 3.57,&lt;br /&gt;
                      3.65, 3.75, 3.84, 3.89, 3.97, 4.08, 4.16, 4.23,&lt;br /&gt;
                      4.31, 4.40, 4.48, 4.55, 4.65, 4.71, 4.80, 4.88,&lt;br /&gt;
                      4.97, 5.05, 5.14, 5.18, 5.29, 5.37, 5.45, 5.54,&lt;br /&gt;
                      5.64, 5.76, 5.81, 5.91, 5.99, 6.06, 6.18, 6.23,&lt;br /&gt;
                      6.33, 6.37, 6.45, 6.54, 6.62, 6.72, 6.80, 6.86 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== 0x2F  SET_VPP_PIN (and vpp and vccio voltage) (t48) ======&lt;br /&gt;
 send 2f 00 00 00  00 00 00 00  aa bb 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are VPP in aa bb according to vpp pin map, lsb of aa first:&lt;br /&gt;
 vppmap = &lt;br /&gt;
 [ 31,30,10,9,4,3,2,1,32,33,34,36,37,38,39,40]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables VPP on ISP-connector.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 01 00 00  00 00 00 00  xx 00 00 00 &lt;br /&gt;
Sets vpp voltage xx 00 to 3f from 9.31 to 25.16 volts, ca 0.25V per step.&lt;br /&gt;
 voltagemap_vpp[64]={  9.31,  9.56,  9.83, 10.11, 10.32, 10.60, 10.87, 11.14,&lt;br /&gt;
                      11.32, 11.61, 11.86, 12.15, 12.35, 12.63, 12.90, 13.18,&lt;br /&gt;
                      13.35, 13.62, 13.88, 14.16, 14.38, 14.66, 14.92, 15.19,&lt;br /&gt;
                      15.39, 15.65, 15.93, 16.19, 16.43, 16.70, 16.95, 17.23,&lt;br /&gt;
                      17.22, 17.48, 17.76, 18.04, 18.26, 18.53, 18.80, 19.07,&lt;br /&gt;
                      19.25, 19.52, 19.80, 20.07, 20.30, 20.56, 20.85, 21.10,&lt;br /&gt;
                      21.27, 21.56, 21.82, 22.10, 22.31, 22.59, 22.86, 23.13,&lt;br /&gt;
                      23.32, 23.58, 23.86, 24.13, 24.37, 24.63, 24.90, 25.16 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 send 2f 02 00 00  00 00 00 00  xx 00 00 00&lt;br /&gt;
Sets vccio voltage 00 to 04. &lt;br /&gt;
 voltagemap_vccio[5]={ 2.35, 2.47, 2.93, 3.23, 3.45 };&lt;br /&gt;
&lt;br /&gt;
====== 0x30  SET_GND_PIN (t48) ======&lt;br /&gt;
 send 30 00 00 00  00 00 00 00  aa bb cc dd  00 00 00 00  xx 00 00 00&lt;br /&gt;
Set which pins are gnd in aa bb cc dd according to gnd pin map, lsb of aa first:&lt;br /&gt;
 gndmap = &lt;br /&gt;
 [8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,32,31,30,29,27,25,20,18,40,39,38,37,36,35,34,33]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
xx is 00 or 01 where 01 enables EGND on J6/J8/J16 on ISP-connector.&lt;br /&gt;
&lt;br /&gt;
====== 0x31  SET_PULLUPS (t48) ======&lt;br /&gt;
 send 31 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull up for all pins and set all pins to input.&lt;br /&gt;
&lt;br /&gt;
====== 0x32  SET_PULLDOWNS (t48) ======&lt;br /&gt;
 send 32 00 00 00 00 00 00 00 &lt;br /&gt;
Enable pull down for all pins and set all pins to input.&lt;br /&gt;
&lt;br /&gt;
====== 0x33  MEASURE_VOLTAGES (t48) ======&lt;br /&gt;
 send 33 00 00 00 00 00 00 00&lt;br /&gt;
 recv 33 00 00 00  00 00 00 00  pp pp pp pp  uu uu uu uu  vv vv vv vv  ii ii ii ii&lt;br /&gt;
Measures voltages.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
pp is vpp voltage.vpp = (pp*0xf78/0x1000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
uu is usb voltage. vusb = (uu*0xccf6/0x27000)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
vv is vcc voltage. vcc = ((vv*0xb32e/0x27000)-0x14)/100.0&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
ii is vccio voltage. vccio = (ii*0x294/0x1000)/100.0&lt;br /&gt;
&lt;br /&gt;
====== 0x35  READ_PINS (t48) ======&lt;br /&gt;
 send 35 00 00 00 00 00 00 00&lt;br /&gt;
 recv 35 00 00 00 00 00 00 00 aa bb cc dd ee ff gg 00&lt;br /&gt;
Reads pins and returns bits for all 56 pins on aa bb cc dd ee ff gg&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
first pin is lsb of aa.&lt;br /&gt;
&lt;br /&gt;
====== 0x36  SET_OUT (t48) ======&lt;br /&gt;
 send 36 xx 00 00 ii 00 00 00&lt;br /&gt;
Sets pin ii to value xx (00 or 01) AND sets the pin to output push-pull 50 MHz.&lt;br /&gt;
&lt;br /&gt;
====== 0x3E  PIN_DETECT ======&lt;br /&gt;
 send 3E 00 aa bb 00 00 00 00&lt;br /&gt;
 recv  3E 00 aa bb 00 00 00 00 b0 b1 b2 b3 b4 b5 b6 00&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 aa bb : chip ID&lt;br /&gt;
 b0 : ZIF8-ZIF1&lt;br /&gt;
 b1 : ZIF16-ZIF9&lt;br /&gt;
 b2 : ZIF24-ZIF17&lt;br /&gt;
 b3 : ZIF32-ZIF25&lt;br /&gt;
 b4 : ZIF40-ZIF33&lt;br /&gt;
 b5 : ISP8-ISP1&lt;br /&gt;
 b6: ISP16-SIP9&lt;/div&gt;</summary>
		<author><name>Drh</name></author>
	</entry>
</feed>