

<?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=Robertbaruch</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=Robertbaruch"/>
	<link rel="alternate" type="text/html" href="https://proghq.org/wiki/Special:Contributions/Robertbaruch"/>
	<updated>2026-04-15T02:20:30Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://proghq.org/w/index.php?title=Talk:FOSS_Programmer&amp;diff=584</id>
		<title>Talk:FOSS Programmer</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=Talk:FOSS_Programmer&amp;diff=584"/>
		<updated>2018-12-31T04:36:58Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: /* cr1901 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= mcmaster =&lt;br /&gt;
&lt;br /&gt;
While I&#039;m not opposed to such a project, I&#039;m skeptical of the time that it will take to develop such a device and the availability of it vs a COTS solution. In particular, with a TL866 costing $50 and still readily available, effort is much better spent focusing on these.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Nominal max VPP is 21V on the TL866 A/CS and 18V on the TL866II.&amp;quot; [Elemecca]. Did this cause any important devices to be discontinued?&lt;br /&gt;
&lt;br /&gt;
= cr1901 =&lt;br /&gt;
&lt;br /&gt;
While the TL866 is ending production, the TL866-II is still available/produced. In case TL866-II stops production and both variants become difficult to obtain easily, doing our own design has been proposed before. The short version is we have a lot of good/doable ideas for a FOSS programmer, but it &#039;&#039;would&#039;&#039; be a time commitment and would &#039;&#039;not&#039;&#039; be as cheap as a TL866. I suspect in principle an open design would attract more contributors in the long run; while Elemecca has done a great job on this front, PIC isn&#039;t exactly known to be pleasant to work with.&lt;br /&gt;
&lt;br /&gt;
The basic idea I&#039;ve seen thrown around for a FOSS programmer (from talking with davidc__ on siliconpr0n IRC channel) is thus:&lt;br /&gt;
&lt;br /&gt;
* Use an FPGA with a custom I2C core, possibly an FPGA USB core as well. If we can tolerate HDL to provide a base that&#039;s rarely modified, this reduces part count while maximizing flexibility.&lt;br /&gt;
* The I2C interface talks to a number of Silego Greenpak 4s, which control both the pass transistors for the power lines and also provide lines of I/O for the target device.&lt;br /&gt;
* Greenpak 4 interfacing gives us &amp;quot;free 5V support&amp;quot;, they are also incredibly cheap and small.&lt;br /&gt;
* FPGA can be put to other use? My proposal is a softcore (RISC-V? lm32? Something else?) running from SPIflash and using block RAM and RAM. This would give a superior development environment in terms of resources &#039;and&#039; toolchain support compared to PIC.&lt;br /&gt;
&lt;br /&gt;
:I like the idea of RISC-V on FPGA as a base, especially since gcc supports RISC-V now, as long as it uses a very popular FPGA. I&#039;m a bit less enthusiastic about Greenpak -- mainly because I don&#039;t know anything about it. Like, are they in the habit of discontinuing chips older than like 5 years? --[[User:Robertbaruch|Robertbaruch]] ([[User talk:Robertbaruch|talk]]) 22:46, 29 December 2018 (UTC)&lt;br /&gt;
&lt;br /&gt;
:[https://github.com/cliffordwolf/picorv32 picorv32] on a [https://www.digikey.com/products/en?keywords=LFE5U-25F LFE5U-25F] would probably be viable. The LFE5U-25F is already on the [https://tinyfpga.com/ TinyFPGA] EX prototypes, and is supported by [http://www.clifford.at/yosys/ yosys]. The sticky part is the pin driver: do we want all 40 pins capable of N types of voltages? We could just start with the drivers found in the TL866. As for USB, there are some [https://lcsc.com/search?q=ch340 very cheap FTDI alternatives] out there that could make USB easy. I&#039;ve worked with FTDI chips, but I haven&#039;t tried the cheaper ones.&lt;br /&gt;
&lt;br /&gt;
:My thought is that we could start small and easy: just use similar pin drivers to the TL866, use an Atmel ATMega as the main processor, add a cheap USB interface chip, and get a minimum viable product. Then start changing things out to support greater capabilities. --[[User:Robertbaruch|Robertbaruch]] ([[User talk:Robertbaruch|talk]]) 04:36, 31 December 2018 (UTC)&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=Talk:FOSS_Programmer&amp;diff=583</id>
		<title>Talk:FOSS Programmer</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=Talk:FOSS_Programmer&amp;diff=583"/>
		<updated>2018-12-31T04:30:09Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: /* cr1901 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= mcmaster =&lt;br /&gt;
&lt;br /&gt;
While I&#039;m not opposed to such a project, I&#039;m skeptical of the time that it will take to develop such a device and the availability of it vs a COTS solution. In particular, with a TL866 costing $50 and still readily available, effort is much better spent focusing on these.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Nominal max VPP is 21V on the TL866 A/CS and 18V on the TL866II.&amp;quot; [Elemecca]. Did this cause any important devices to be discontinued?&lt;br /&gt;
&lt;br /&gt;
= cr1901 =&lt;br /&gt;
&lt;br /&gt;
While the TL866 is ending production, the TL866-II is still available/produced. In case TL866-II stops production and both variants become difficult to obtain easily, doing our own design has been proposed before. The short version is we have a lot of good/doable ideas for a FOSS programmer, but it &#039;&#039;would&#039;&#039; be a time commitment and would &#039;&#039;not&#039;&#039; be as cheap as a TL866. I suspect in principle an open design would attract more contributors in the long run; while Elemecca has done a great job on this front, PIC isn&#039;t exactly known to be pleasant to work with.&lt;br /&gt;
&lt;br /&gt;
The basic idea I&#039;ve seen thrown around for a FOSS programmer (from talking with davidc__ on siliconpr0n IRC channel) is thus:&lt;br /&gt;
&lt;br /&gt;
* Use an FPGA with a custom I2C core, possibly an FPGA USB core as well. If we can tolerate HDL to provide a base that&#039;s rarely modified, this reduces part count while maximizing flexibility.&lt;br /&gt;
* The I2C interface talks to a number of Silego Greenpak 4s, which control both the pass transistors for the power lines and also provide lines of I/O for the target device.&lt;br /&gt;
* Greenpak 4 interfacing gives us &amp;quot;free 5V support&amp;quot;, they are also incredibly cheap and small.&lt;br /&gt;
* FPGA can be put to other use? My proposal is a softcore (RISC-V? lm32? Something else?) running from SPIflash and using block RAM and RAM. This would give a superior development environment in terms of resources &#039;and&#039; toolchain support compared to PIC.&lt;br /&gt;
&lt;br /&gt;
:I like the idea of RISC-V on FPGA as a base, especially since gcc supports RISC-V now, as long as it uses a very popular FPGA. I&#039;m a bit less enthusiastic about Greenpak -- mainly because I don&#039;t know anything about it. Like, are they in the habit of discontinuing chips older than like 5 years? --[[User:Robertbaruch|Robertbaruch]] ([[User talk:Robertbaruch|talk]]) 22:46, 29 December 2018 (UTC)&lt;br /&gt;
&lt;br /&gt;
:[https://github.com/cliffordwolf/picorv32 picorv32] on a [https://www.digikey.com/products/en?keywords=LFE5U-25F LFE5U-25F] would probably be viable. The LFE5U-25F is already on the [https://tinyfpga.com/ TinyFPGA] EX prototypes, and is supported by [http://www.clifford.at/yosys/ yosys]. The sticky part is the pin driver: do we want all 40 pins capable of N types of voltages? We could just start with the drivers found in the TL866. As for USB, there are some [https://lcsc.com/search?q=ch340 very cheap FTDI alternatives] out there that could make USB easy. I&#039;ve worked with FTDI chips, but I haven&#039;t tried the cheaper ones. --[[User:Robertbaruch|Robertbaruch]] ([[User talk:Robertbaruch|talk]]) 04:30, 31 December 2018 (UTC)&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=Talk:FOSS_Programmer&amp;diff=582</id>
		<title>Talk:FOSS Programmer</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=Talk:FOSS_Programmer&amp;diff=582"/>
		<updated>2018-12-29T22:46:42Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: /* cr1901 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= mcmaster =&lt;br /&gt;
&lt;br /&gt;
While I&#039;m not opposed to such a project, I&#039;m skeptical of the time that it will take to develop such a device and the availability of it vs a COTS solution. In particular, with a TL866 costing $50 and still readily available, effort is much better spent focusing on these.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Nominal max VPP is 21V on the TL866 A/CS and 18V on the TL866II.&amp;quot; [Elemecca]. Did this cause any important devices to be discontinued?&lt;br /&gt;
&lt;br /&gt;
= cr1901 =&lt;br /&gt;
&lt;br /&gt;
While the TL866 is ending production, the TL866-II is still available/produced. In case TL866-II stops production and both variants become difficult to obtain easily, doing our own design has been proposed before. The short version is we have a lot of good/doable ideas for a FOSS programmer, but it &#039;&#039;would&#039;&#039; be a time commitment and would &#039;&#039;not&#039;&#039; be as cheap as a TL866. I suspect in principle an open design would attract more contributors in the long run; while Elemecca has done a great job on this front, PIC isn&#039;t exactly known to be pleasant to work with.&lt;br /&gt;
&lt;br /&gt;
The basic idea I&#039;ve seen thrown around for a FOSS programmer (from talking with davidc__ on siliconpr0n IRC channel) is thus:&lt;br /&gt;
&lt;br /&gt;
* Use an FPGA with a custom I2C core, possibly an FPGA USB core as well. If we can tolerate HDL to provide a base that&#039;s rarely modified, this reduces part count while maximizing flexibility.&lt;br /&gt;
* The I2C interface talks to a number of Silego Greenpak 4s, which control both the pass transistors for the power lines and also provide lines of I/O for the target device.&lt;br /&gt;
* Greenpak 4 interfacing gives us &amp;quot;free 5V support&amp;quot;, they are also incredibly cheap and small.&lt;br /&gt;
* FPGA can be put to other use? My proposal is a softcore (RISC-V? lm32? Something else?) running from SPIflash and using block RAM and RAM. This would give a superior development environment in terms of resources &#039;and&#039; toolchain support compared to PIC.&lt;br /&gt;
&lt;br /&gt;
:I like the idea of RISC-V on FPGA as a base, especially since gcc supports RISC-V now, as long as it uses a very popular FPGA. I&#039;m a bit less enthusiastic about Greenpak -- mainly because I don&#039;t know anything about it. Like, are they in the habit of discontinuing chips older than like 5 years? --[[User:Robertbaruch|Robertbaruch]] ([[User talk:Robertbaruch|talk]]) 22:46, 29 December 2018 (UTC)&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=440</id>
		<title>User:Robertbaruch</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=440"/>
		<updated>2018-05-21T01:22:46Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: /* Writing a column */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Staging ground=&lt;br /&gt;
&lt;br /&gt;
==wavedrom test==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ signal: [&lt;br /&gt;
  { name: &amp;quot;clk&amp;quot;,  wave: &amp;quot;p......&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;bus&amp;quot;,  wave: &amp;quot;x.34.5x&amp;quot;,   data: &amp;quot;head body tail&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;wire&amp;quot;, wave: &amp;quot;0.1..0.&amp;quot; },&lt;br /&gt;
]}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ATF22V10C==&lt;br /&gt;
&lt;br /&gt;
At some point prior to Jul 2010, Atmel decided to make their own 22V10. It is pin- and fuse-compatible with the Lattice GAL22V10, but with additional features:&lt;br /&gt;
* I/O pin-keeper circuits, holding the previous value of an input after the input goes high-impedance.&lt;br /&gt;
* Optional pin-controlled power-down mode. This mode is controlled by a fuse not present in the Lattice chip.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/ATF22V10CCQ Atmel Datasheet rev Jul 2010], see [http://proghq.org/wiki/File:ATF22V10_LOGIC_DIAGRAM.png] for page 9 without the diagram cut off.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/gal22v10 Lattice Datasheet rev Mar 1998].&lt;br /&gt;
&lt;br /&gt;
The best view of the fuses is shown in [https://archive.org/stream/gal22v10#page/n3/mode/2up page 5 of the Lattice datasheet], showing 5892 fuses.&lt;br /&gt;
&lt;br /&gt;
The fuses are numbered as follows:&lt;br /&gt;
* 0-43: product term for asynchronous reset&lt;br /&gt;
* 44-439: sum of 8 product terms for output logic block 0&lt;br /&gt;
* 440-923: sum of 10 product terms for output logic block 1&lt;br /&gt;
* 924-1495: sum of 12 product terms for output logic block 2&lt;br /&gt;
* 1496-2155: sum of 14 product terms for output logic block 3&lt;br /&gt;
* 2156-2903: sum of 16 product terms for output logic block 4&lt;br /&gt;
* 2904-3651: sum of 16 product terms for output logic block 5&lt;br /&gt;
* 3652-4311: sum of 14 product terms for output logic block 6&lt;br /&gt;
* 4312-4883: sum of 12 product terms for output logic block 7&lt;br /&gt;
* 4884-5367: sum of 10 product terms for output logic block 8&lt;br /&gt;
* 5368-5763: sum of 8 product terms for output logic block 9&lt;br /&gt;
* 5764-5807: product term for synchronous preset&lt;br /&gt;
* 5808-5827: OLMC control fuses, 2 each, for output logic blocks&lt;br /&gt;
* 5828-5891: 8 bytes of programmable electronic signature data&lt;br /&gt;
&lt;br /&gt;
A security fuse is present, but its number is not in the datasheet.&lt;br /&gt;
&lt;br /&gt;
Note that while the fuses are numbered as if they increment along a row, fuses are actually written one column at a time! There are 44 columns of data for the sum or products matrix, columns 0-43 (0x00-0x2B), each with 132 bits. Column 44 (0x2C) is for the programmable electronic signature and also contains 132 bits, although only the first 64 bits are valid.&lt;br /&gt;
&lt;br /&gt;
There is a read-only column 58 (0x3A) containing 72 bits of chip signature data. This identifies the chip.&lt;br /&gt;
&lt;br /&gt;
The 20 OLMC control fuses do not have a column address. Instead, they are &amp;quot;addressed&amp;quot; by a separate pin.&lt;br /&gt;
&lt;br /&gt;
===Enable programming mode===&lt;br /&gt;
&lt;br /&gt;
In programming mode, the following pins have alternate functions. Pin numbering is for the DIP/SOIC/TSSOP(PLCC) package.&lt;br /&gt;
&lt;br /&gt;
* pin 2(3): PRogramming ENable&lt;br /&gt;
* pin 13(16): -STRobe&lt;br /&gt;
* pin 3(4): WRite&lt;br /&gt;
* pins 4(5), 6(7), 7(9), and 9(11): ERase&lt;br /&gt;
* pin 8(10): OLMC data&lt;br /&gt;
* pin 11(13): Serial IN&lt;br /&gt;
* pin 14(17): Serial OUT&lt;br /&gt;
* pin 10(12): Serial CLK&lt;br /&gt;
&lt;br /&gt;
Programming mode is enabled by applying 12V to PREN. PREN must remain at 12V for at least 50 milliseconds before beginning any other operation, and must remain at 12V for all programming operations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x1..&amp;quot;, node: &amp;quot;.a..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;0.1.&amp;quot;, node: &amp;quot;..b.c&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SOUT&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;, &amp;quot;b&amp;lt;-&amp;gt;c min 50ms&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Disabling programming mode===&lt;br /&gt;
&lt;br /&gt;
Programming mode is disabled by allowing PREN to drop to 0V for at least 20 microseconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x...&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;1.0.&amp;quot;, node: &amp;quot;..a.b&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Erasing the chip===&lt;br /&gt;
&lt;br /&gt;
Erasing the chip sets all fuses to the 1 state.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1.0.1.&amp;quot;, node: &amp;quot;..a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 200ms&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Writing a column===&lt;br /&gt;
&lt;br /&gt;
Writing a column of data involves:&lt;br /&gt;
* Sending the 132 bits of data serially, most significant bit first. When writing column 0x2C (the user data column), write the 64 bits of data first, then 68 bits of zero padding.&lt;br /&gt;
* Sending the 6-bit column address serially. most significant bit first.&lt;br /&gt;
* Setting WR high.&lt;br /&gt;
* Strobing the -STR line.&lt;br /&gt;
* Setting WR low.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warning: The serial protocol is very similar to, but not identical to, SPI. Data is clocked in on the positive edge of SCLK, but note that the very last bit is not clocked in by SCLK, but by the negative edge of -STR!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1....|..........0.1.&amp;quot;, node: &amp;quot;................a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;0....|.........1...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;03333|3333333333.0&amp;quot;, data: &amp;quot;131 130 129 128 3 2 1 0 c5 c4 c3 c2 c1 c0&amp;quot;, phase: 0.5 },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;lP...|.........l.&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20ms&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: SCLK frequency may be no higher than 500kHz. It is not known what the minimum time between WR and -STR edges are, but it is under 1 µs. It is also not known what the setup and hold times for SIN are.&lt;br /&gt;
&lt;br /&gt;
===Reading a column===&lt;br /&gt;
&lt;br /&gt;
Reading a column of data involves:&lt;br /&gt;
* Sending the 6-bit column address serially. most significant bit first.&lt;br /&gt;
* Strobing the -STR line.&lt;br /&gt;
* Reading 132 bits of data serially, most significant bit first. When reading column 0x3A (the ID column), only 72 bits need to be read. When reading column 0x2C (the user data column), only 64 bits need to be read.&lt;br /&gt;
&lt;br /&gt;
Warning: The serial protocol is very similar to, but not identical to, SPI. Data is clocked in on the positive edge of SCLK, but note that the very last bit is not clocked in by SCLK, but by the negative edge of -STR!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1......0.1..&amp;quot;, node: &amp;quot;.......a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;0333333..0...|......&amp;quot;, data: &amp;quot;c5 c4 c3 c2 c1 c0&amp;quot;, phase: 0.5 },&lt;br /&gt;
    { name: &amp;quot;SOUT&amp;quot;,  wave: &amp;quot;x........3333|33330&amp;quot;, data: &amp;quot;131 130 129 128 3 2 1 0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;lP....l...P..|....l&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 1µs&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: SCLK frequency may be no higher than 500kHz. It is not known what the minimum time between SCLK and SOUT edges are, but it is under 1 µs. It is also not known what the setup and hold times for SIN are.&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=439</id>
		<title>User:Robertbaruch</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=439"/>
		<updated>2018-05-21T01:21:37Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: /* Reading a column */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Staging ground=&lt;br /&gt;
&lt;br /&gt;
==wavedrom test==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ signal: [&lt;br /&gt;
  { name: &amp;quot;clk&amp;quot;,  wave: &amp;quot;p......&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;bus&amp;quot;,  wave: &amp;quot;x.34.5x&amp;quot;,   data: &amp;quot;head body tail&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;wire&amp;quot;, wave: &amp;quot;0.1..0.&amp;quot; },&lt;br /&gt;
]}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ATF22V10C==&lt;br /&gt;
&lt;br /&gt;
At some point prior to Jul 2010, Atmel decided to make their own 22V10. It is pin- and fuse-compatible with the Lattice GAL22V10, but with additional features:&lt;br /&gt;
* I/O pin-keeper circuits, holding the previous value of an input after the input goes high-impedance.&lt;br /&gt;
* Optional pin-controlled power-down mode. This mode is controlled by a fuse not present in the Lattice chip.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/ATF22V10CCQ Atmel Datasheet rev Jul 2010], see [http://proghq.org/wiki/File:ATF22V10_LOGIC_DIAGRAM.png] for page 9 without the diagram cut off.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/gal22v10 Lattice Datasheet rev Mar 1998].&lt;br /&gt;
&lt;br /&gt;
The best view of the fuses is shown in [https://archive.org/stream/gal22v10#page/n3/mode/2up page 5 of the Lattice datasheet], showing 5892 fuses.&lt;br /&gt;
&lt;br /&gt;
The fuses are numbered as follows:&lt;br /&gt;
* 0-43: product term for asynchronous reset&lt;br /&gt;
* 44-439: sum of 8 product terms for output logic block 0&lt;br /&gt;
* 440-923: sum of 10 product terms for output logic block 1&lt;br /&gt;
* 924-1495: sum of 12 product terms for output logic block 2&lt;br /&gt;
* 1496-2155: sum of 14 product terms for output logic block 3&lt;br /&gt;
* 2156-2903: sum of 16 product terms for output logic block 4&lt;br /&gt;
* 2904-3651: sum of 16 product terms for output logic block 5&lt;br /&gt;
* 3652-4311: sum of 14 product terms for output logic block 6&lt;br /&gt;
* 4312-4883: sum of 12 product terms for output logic block 7&lt;br /&gt;
* 4884-5367: sum of 10 product terms for output logic block 8&lt;br /&gt;
* 5368-5763: sum of 8 product terms for output logic block 9&lt;br /&gt;
* 5764-5807: product term for synchronous preset&lt;br /&gt;
* 5808-5827: OLMC control fuses, 2 each, for output logic blocks&lt;br /&gt;
* 5828-5891: 8 bytes of programmable electronic signature data&lt;br /&gt;
&lt;br /&gt;
A security fuse is present, but its number is not in the datasheet.&lt;br /&gt;
&lt;br /&gt;
Note that while the fuses are numbered as if they increment along a row, fuses are actually written one column at a time! There are 44 columns of data for the sum or products matrix, columns 0-43 (0x00-0x2B), each with 132 bits. Column 44 (0x2C) is for the programmable electronic signature and also contains 132 bits, although only the first 64 bits are valid.&lt;br /&gt;
&lt;br /&gt;
There is a read-only column 58 (0x3A) containing 72 bits of chip signature data. This identifies the chip.&lt;br /&gt;
&lt;br /&gt;
The 20 OLMC control fuses do not have a column address. Instead, they are &amp;quot;addressed&amp;quot; by a separate pin.&lt;br /&gt;
&lt;br /&gt;
===Enable programming mode===&lt;br /&gt;
&lt;br /&gt;
In programming mode, the following pins have alternate functions. Pin numbering is for the DIP/SOIC/TSSOP(PLCC) package.&lt;br /&gt;
&lt;br /&gt;
* pin 2(3): PRogramming ENable&lt;br /&gt;
* pin 13(16): -STRobe&lt;br /&gt;
* pin 3(4): WRite&lt;br /&gt;
* pins 4(5), 6(7), 7(9), and 9(11): ERase&lt;br /&gt;
* pin 8(10): OLMC data&lt;br /&gt;
* pin 11(13): Serial IN&lt;br /&gt;
* pin 14(17): Serial OUT&lt;br /&gt;
* pin 10(12): Serial CLK&lt;br /&gt;
&lt;br /&gt;
Programming mode is enabled by applying 12V to PREN. PREN must remain at 12V for at least 50 milliseconds before beginning any other operation, and must remain at 12V for all programming operations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x1..&amp;quot;, node: &amp;quot;.a..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;0.1.&amp;quot;, node: &amp;quot;..b.c&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SOUT&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;, &amp;quot;b&amp;lt;-&amp;gt;c min 50ms&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Disabling programming mode===&lt;br /&gt;
&lt;br /&gt;
Programming mode is disabled by allowing PREN to drop to 0V for at least 20 microseconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x...&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;1.0.&amp;quot;, node: &amp;quot;..a.b&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Erasing the chip===&lt;br /&gt;
&lt;br /&gt;
Erasing the chip sets all fuses to the 1 state.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1.0.1.&amp;quot;, node: &amp;quot;..a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 200ms&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Writing a column===&lt;br /&gt;
&lt;br /&gt;
Writing a column of data involves:&lt;br /&gt;
* Sending the 132 bits of data serially, most significant bit first.&lt;br /&gt;
* Sending the 6-bit column address serially. most significant bit first.&lt;br /&gt;
* Setting WR high.&lt;br /&gt;
* Strobing the -STR line.&lt;br /&gt;
* Setting WR low.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warning: The serial protocol is very similar to, but not identical to, SPI. Data is clocked in on the positive edge of SCLK, but note that the very last bit is not clocked in by SCLK, but by the negative edge of -STR!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1....|..........0.1.&amp;quot;, node: &amp;quot;................a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;0....|.........1...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;03333|3333333333.0&amp;quot;, data: &amp;quot;131 130 129 128 3 2 1 0 c5 c4 c3 c2 c1 c0&amp;quot;, phase: 0.5 },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;lP...|.........l.&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20ms&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: SCLK frequency may be no higher than 500kHz. It is not known what the minimum time between WR and -STR edges are, but it is under 1 µs. It is also not known what the setup and hold times for SIN are.&lt;br /&gt;
&lt;br /&gt;
===Reading a column===&lt;br /&gt;
&lt;br /&gt;
Reading a column of data involves:&lt;br /&gt;
* Sending the 6-bit column address serially. most significant bit first.&lt;br /&gt;
* Strobing the -STR line.&lt;br /&gt;
* Reading 132 bits of data serially, most significant bit first. When reading column 0x3A (the ID column), only 72 bits need to be read. When reading column 0x2C (the user data column), only 64 bits need to be read.&lt;br /&gt;
&lt;br /&gt;
Warning: The serial protocol is very similar to, but not identical to, SPI. Data is clocked in on the positive edge of SCLK, but note that the very last bit is not clocked in by SCLK, but by the negative edge of -STR!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1......0.1..&amp;quot;, node: &amp;quot;.......a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;0333333..0...|......&amp;quot;, data: &amp;quot;c5 c4 c3 c2 c1 c0&amp;quot;, phase: 0.5 },&lt;br /&gt;
    { name: &amp;quot;SOUT&amp;quot;,  wave: &amp;quot;x........3333|33330&amp;quot;, data: &amp;quot;131 130 129 128 3 2 1 0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;lP....l...P..|....l&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 1µs&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: SCLK frequency may be no higher than 500kHz. It is not known what the minimum time between SCLK and SOUT edges are, but it is under 1 µs. It is also not known what the setup and hold times for SIN are.&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=438</id>
		<title>User:Robertbaruch</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=438"/>
		<updated>2018-05-21T01:13:26Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: Reading a column&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Staging ground=&lt;br /&gt;
&lt;br /&gt;
==wavedrom test==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ signal: [&lt;br /&gt;
  { name: &amp;quot;clk&amp;quot;,  wave: &amp;quot;p......&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;bus&amp;quot;,  wave: &amp;quot;x.34.5x&amp;quot;,   data: &amp;quot;head body tail&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;wire&amp;quot;, wave: &amp;quot;0.1..0.&amp;quot; },&lt;br /&gt;
]}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ATF22V10C==&lt;br /&gt;
&lt;br /&gt;
At some point prior to Jul 2010, Atmel decided to make their own 22V10. It is pin- and fuse-compatible with the Lattice GAL22V10, but with additional features:&lt;br /&gt;
* I/O pin-keeper circuits, holding the previous value of an input after the input goes high-impedance.&lt;br /&gt;
* Optional pin-controlled power-down mode. This mode is controlled by a fuse not present in the Lattice chip.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/ATF22V10CCQ Atmel Datasheet rev Jul 2010], see [http://proghq.org/wiki/File:ATF22V10_LOGIC_DIAGRAM.png] for page 9 without the diagram cut off.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/gal22v10 Lattice Datasheet rev Mar 1998].&lt;br /&gt;
&lt;br /&gt;
The best view of the fuses is shown in [https://archive.org/stream/gal22v10#page/n3/mode/2up page 5 of the Lattice datasheet], showing 5892 fuses.&lt;br /&gt;
&lt;br /&gt;
The fuses are numbered as follows:&lt;br /&gt;
* 0-43: product term for asynchronous reset&lt;br /&gt;
* 44-439: sum of 8 product terms for output logic block 0&lt;br /&gt;
* 440-923: sum of 10 product terms for output logic block 1&lt;br /&gt;
* 924-1495: sum of 12 product terms for output logic block 2&lt;br /&gt;
* 1496-2155: sum of 14 product terms for output logic block 3&lt;br /&gt;
* 2156-2903: sum of 16 product terms for output logic block 4&lt;br /&gt;
* 2904-3651: sum of 16 product terms for output logic block 5&lt;br /&gt;
* 3652-4311: sum of 14 product terms for output logic block 6&lt;br /&gt;
* 4312-4883: sum of 12 product terms for output logic block 7&lt;br /&gt;
* 4884-5367: sum of 10 product terms for output logic block 8&lt;br /&gt;
* 5368-5763: sum of 8 product terms for output logic block 9&lt;br /&gt;
* 5764-5807: product term for synchronous preset&lt;br /&gt;
* 5808-5827: OLMC control fuses, 2 each, for output logic blocks&lt;br /&gt;
* 5828-5891: 8 bytes of programmable electronic signature data&lt;br /&gt;
&lt;br /&gt;
A security fuse is present, but its number is not in the datasheet.&lt;br /&gt;
&lt;br /&gt;
Note that while the fuses are numbered as if they increment along a row, fuses are actually written one column at a time! There are 44 columns of data for the sum or products matrix, columns 0-43 (0x00-0x2B), each with 132 bits. Column 44 (0x2C) is for the programmable electronic signature and also contains 132 bits, although only the first 64 bits are valid.&lt;br /&gt;
&lt;br /&gt;
There is a read-only column 58 (0x3A) containing 72 bits of chip signature data. This identifies the chip.&lt;br /&gt;
&lt;br /&gt;
The 20 OLMC control fuses do not have a column address. Instead, they are &amp;quot;addressed&amp;quot; by a separate pin.&lt;br /&gt;
&lt;br /&gt;
===Enable programming mode===&lt;br /&gt;
&lt;br /&gt;
In programming mode, the following pins have alternate functions. Pin numbering is for the DIP/SOIC/TSSOP(PLCC) package.&lt;br /&gt;
&lt;br /&gt;
* pin 2(3): PRogramming ENable&lt;br /&gt;
* pin 13(16): -STRobe&lt;br /&gt;
* pin 3(4): WRite&lt;br /&gt;
* pins 4(5), 6(7), 7(9), and 9(11): ERase&lt;br /&gt;
* pin 8(10): OLMC data&lt;br /&gt;
* pin 11(13): Serial IN&lt;br /&gt;
* pin 14(17): Serial OUT&lt;br /&gt;
* pin 10(12): Serial CLK&lt;br /&gt;
&lt;br /&gt;
Programming mode is enabled by applying 12V to PREN. PREN must remain at 12V for at least 50 milliseconds before beginning any other operation, and must remain at 12V for all programming operations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x1..&amp;quot;, node: &amp;quot;.a..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;0.1.&amp;quot;, node: &amp;quot;..b.c&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SOUT&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;, &amp;quot;b&amp;lt;-&amp;gt;c min 50ms&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Disabling programming mode===&lt;br /&gt;
&lt;br /&gt;
Programming mode is disabled by allowing PREN to drop to 0V for at least 20 microseconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x...&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;1.0.&amp;quot;, node: &amp;quot;..a.b&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Erasing the chip===&lt;br /&gt;
&lt;br /&gt;
Erasing the chip sets all fuses to the 1 state.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1.0.1.&amp;quot;, node: &amp;quot;..a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 200ms&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Writing a column===&lt;br /&gt;
&lt;br /&gt;
Writing a column of data involves:&lt;br /&gt;
* Sending the 132 bits of data serially, most significant bit first.&lt;br /&gt;
* Sending the 6-bit column address serially. most significant bit first.&lt;br /&gt;
* Setting WR high.&lt;br /&gt;
* Strobing the -STR line.&lt;br /&gt;
* Setting WR low.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warning: The serial protocol is very similar to, but not identical to, SPI. Data is clocked in on the positive edge of SCLK, but note that the very last bit is not clocked in by SCLK, but by the negative edge of -STR!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1....|..........0.1.&amp;quot;, node: &amp;quot;................a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;0....|.........1...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;03333|3333333333.0&amp;quot;, data: &amp;quot;131 130 129 128 3 2 1 0 c5 c4 c3 c2 c1 c0&amp;quot;, phase: 0.5 },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;lP...|.........l.&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20ms&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: SCLK frequency may be no higher than 500kHz. It is not known what the minimum time between WR and -STR edges are, but it is under 1 µs. It is also not known what the setup and hold times for SIN are.&lt;br /&gt;
&lt;br /&gt;
===Reading a column===&lt;br /&gt;
&lt;br /&gt;
Reading a column of data involves:&lt;br /&gt;
* Sending the 6-bit column address serially. most significant bit first.&lt;br /&gt;
* Strobing the -STR line.&lt;br /&gt;
* Reading 132 bits of data serially, most significant bit first.&lt;br /&gt;
&lt;br /&gt;
Warning: The serial protocol is very similar to, but not identical to, SPI. Data is clocked in on the positive edge of SCLK, but note that the very last bit is not clocked in by SCLK, but by the negative edge of -STR!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1......0.1..&amp;quot;, node: &amp;quot;.......a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;0333333..0...|......&amp;quot;, data: &amp;quot;c5 c4 c3 c2 c1 c0&amp;quot;, phase: 0.5 },&lt;br /&gt;
    { name: &amp;quot;SOUT&amp;quot;,  wave: &amp;quot;x........3333|33330&amp;quot;, data: &amp;quot;131 130 129 128 3 2 1 0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;lP....l...P..|....l&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 1µs&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: SCLK frequency may be no higher than 500kHz. It is not known what the minimum time between SCLK and SOUT edges are, but it is under 1 µs. It is also not known what the setup and hold times for SIN are.&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=437</id>
		<title>User:Robertbaruch</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=437"/>
		<updated>2018-05-21T00:02:00Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: /* Writing a column */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Staging ground=&lt;br /&gt;
&lt;br /&gt;
==wavedrom test==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ signal: [&lt;br /&gt;
  { name: &amp;quot;clk&amp;quot;,  wave: &amp;quot;p......&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;bus&amp;quot;,  wave: &amp;quot;x.34.5x&amp;quot;,   data: &amp;quot;head body tail&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;wire&amp;quot;, wave: &amp;quot;0.1..0.&amp;quot; },&lt;br /&gt;
]}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ATF22V10C==&lt;br /&gt;
&lt;br /&gt;
At some point prior to Jul 2010, Atmel decided to make their own 22V10. It is pin- and fuse-compatible with the Lattice GAL22V10, but with additional features:&lt;br /&gt;
* I/O pin-keeper circuits, holding the previous value of an input after the input goes high-impedance.&lt;br /&gt;
* Optional pin-controlled power-down mode. This mode is controlled by a fuse not present in the Lattice chip.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/ATF22V10CCQ Atmel Datasheet rev Jul 2010], see [http://proghq.org/wiki/File:ATF22V10_LOGIC_DIAGRAM.png] for page 9 without the diagram cut off.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/gal22v10 Lattice Datasheet rev Mar 1998].&lt;br /&gt;
&lt;br /&gt;
The best view of the fuses is shown in [https://archive.org/stream/gal22v10#page/n3/mode/2up page 5 of the Lattice datasheet], showing 5892 fuses.&lt;br /&gt;
&lt;br /&gt;
The fuses are numbered as follows:&lt;br /&gt;
* 0-43: product term for asynchronous reset&lt;br /&gt;
* 44-439: sum of 8 product terms for output logic block 0&lt;br /&gt;
* 440-923: sum of 10 product terms for output logic block 1&lt;br /&gt;
* 924-1495: sum of 12 product terms for output logic block 2&lt;br /&gt;
* 1496-2155: sum of 14 product terms for output logic block 3&lt;br /&gt;
* 2156-2903: sum of 16 product terms for output logic block 4&lt;br /&gt;
* 2904-3651: sum of 16 product terms for output logic block 5&lt;br /&gt;
* 3652-4311: sum of 14 product terms for output logic block 6&lt;br /&gt;
* 4312-4883: sum of 12 product terms for output logic block 7&lt;br /&gt;
* 4884-5367: sum of 10 product terms for output logic block 8&lt;br /&gt;
* 5368-5763: sum of 8 product terms for output logic block 9&lt;br /&gt;
* 5764-5807: product term for synchronous preset&lt;br /&gt;
* 5808-5827: OLMC control fuses, 2 each, for output logic blocks&lt;br /&gt;
* 5828-5891: 8 bytes of programmable electronic signature data&lt;br /&gt;
&lt;br /&gt;
A security fuse is present, but its number is not in the datasheet.&lt;br /&gt;
&lt;br /&gt;
Note that while the fuses are numbered as if they increment along a row, fuses are actually written one column at a time! There are 44 columns of data for the sum or products matrix, columns 0-43 (0x00-0x2B), each with 132 bits. Column 44 (0x2C) is for the programmable electronic signature and also contains 132 bits, although only the first 64 bits are valid.&lt;br /&gt;
&lt;br /&gt;
There is a read-only column 58 (0x3A) containing 72 bits of chip signature data. This identifies the chip.&lt;br /&gt;
&lt;br /&gt;
The 20 OLMC control fuses do not have a column address. Instead, they are &amp;quot;addressed&amp;quot; by a separate pin.&lt;br /&gt;
&lt;br /&gt;
===Enable programming mode===&lt;br /&gt;
&lt;br /&gt;
In programming mode, the following pins have alternate functions. Pin numbering is for the DIP/SOIC/TSSOP(PLCC) package.&lt;br /&gt;
&lt;br /&gt;
* pin 2(3): PRogramming ENable&lt;br /&gt;
* pin 13(16): -STRobe&lt;br /&gt;
* pin 3(4): WRite&lt;br /&gt;
* pins 4(5), 6(7), 7(9), and 9(11): ERase&lt;br /&gt;
* pin 8(10): OLMC data&lt;br /&gt;
* pin 11(13): Serial IN&lt;br /&gt;
* pin 14(17): Serial OUT&lt;br /&gt;
* pin 10(12): Serial CLK&lt;br /&gt;
&lt;br /&gt;
Programming mode is enabled by applying 12V to PREN. PREN must remain at 12V for at least 50 milliseconds before beginning any other operation, and must remain at 12V for all programming operations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x1..&amp;quot;, node: &amp;quot;.a..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;0.1.&amp;quot;, node: &amp;quot;..b.c&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SOUT&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;, &amp;quot;b&amp;lt;-&amp;gt;c min 50ms&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Disabling programming mode===&lt;br /&gt;
&lt;br /&gt;
Programming mode is disabled by allowing PREN to drop to 0V for at least 20 microseconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x...&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;1.0.&amp;quot;, node: &amp;quot;..a.b&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Erasing the chip===&lt;br /&gt;
&lt;br /&gt;
Erasing the chip sets all fuses to the 1 state.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1.0.1.&amp;quot;, node: &amp;quot;..a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 200ms&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Writing a column===&lt;br /&gt;
&lt;br /&gt;
Writing a column of data involves:&lt;br /&gt;
* Sending the 132 bits of data serially, most significant bit first.&lt;br /&gt;
* Sending the 6-bit column address serially. most significant bit first.&lt;br /&gt;
* Setting WR high.&lt;br /&gt;
* Strobing the -STR line.&lt;br /&gt;
* Setting WR low.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warning: The serial protocol is very similar to, but not identical to, SPI. Data is clocked in on the positive edge of SCLK, but note that the very last bit is not clocked in by SCLK, but by the negative edge of -STR!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1....|..........0.1.&amp;quot;, node: &amp;quot;................a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;0....|.........1...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;03333|3333333333.0&amp;quot;, data: &amp;quot;131 130 129 128 3 2 1 0 c5 c4 c3 c2 c1 c0&amp;quot;, phase: 0.5 },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;lP...|.........l.&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20ms&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: SCLK frequency may be no higher than 500kHz. It is not known what the minimum time between WR and -STR edges are, but it is under 1 µs. It is also not known what the setup and hold times for SIN are.&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=436</id>
		<title>User:Robertbaruch</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=436"/>
		<updated>2018-05-20T23:57:45Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: /* ATF22V10C */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Staging ground=&lt;br /&gt;
&lt;br /&gt;
==wavedrom test==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ signal: [&lt;br /&gt;
  { name: &amp;quot;clk&amp;quot;,  wave: &amp;quot;p......&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;bus&amp;quot;,  wave: &amp;quot;x.34.5x&amp;quot;,   data: &amp;quot;head body tail&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;wire&amp;quot;, wave: &amp;quot;0.1..0.&amp;quot; },&lt;br /&gt;
]}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ATF22V10C==&lt;br /&gt;
&lt;br /&gt;
At some point prior to Jul 2010, Atmel decided to make their own 22V10. It is pin- and fuse-compatible with the Lattice GAL22V10, but with additional features:&lt;br /&gt;
* I/O pin-keeper circuits, holding the previous value of an input after the input goes high-impedance.&lt;br /&gt;
* Optional pin-controlled power-down mode. This mode is controlled by a fuse not present in the Lattice chip.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/ATF22V10CCQ Atmel Datasheet rev Jul 2010], see [http://proghq.org/wiki/File:ATF22V10_LOGIC_DIAGRAM.png] for page 9 without the diagram cut off.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/gal22v10 Lattice Datasheet rev Mar 1998].&lt;br /&gt;
&lt;br /&gt;
The best view of the fuses is shown in [https://archive.org/stream/gal22v10#page/n3/mode/2up page 5 of the Lattice datasheet], showing 5892 fuses.&lt;br /&gt;
&lt;br /&gt;
The fuses are numbered as follows:&lt;br /&gt;
* 0-43: product term for asynchronous reset&lt;br /&gt;
* 44-439: sum of 8 product terms for output logic block 0&lt;br /&gt;
* 440-923: sum of 10 product terms for output logic block 1&lt;br /&gt;
* 924-1495: sum of 12 product terms for output logic block 2&lt;br /&gt;
* 1496-2155: sum of 14 product terms for output logic block 3&lt;br /&gt;
* 2156-2903: sum of 16 product terms for output logic block 4&lt;br /&gt;
* 2904-3651: sum of 16 product terms for output logic block 5&lt;br /&gt;
* 3652-4311: sum of 14 product terms for output logic block 6&lt;br /&gt;
* 4312-4883: sum of 12 product terms for output logic block 7&lt;br /&gt;
* 4884-5367: sum of 10 product terms for output logic block 8&lt;br /&gt;
* 5368-5763: sum of 8 product terms for output logic block 9&lt;br /&gt;
* 5764-5807: product term for synchronous preset&lt;br /&gt;
* 5808-5827: OLMC control fuses, 2 each, for output logic blocks&lt;br /&gt;
* 5828-5891: 8 bytes of programmable electronic signature data&lt;br /&gt;
&lt;br /&gt;
A security fuse is present, but its number is not in the datasheet.&lt;br /&gt;
&lt;br /&gt;
Note that while the fuses are numbered as if they increment along a row, fuses are actually written one column at a time! There are 44 columns of data for the sum or products matrix, columns 0-43 (0x00-0x2B), each with 132 bits. Column 44 (0x2C) is for the programmable electronic signature and also contains 132 bits, although only the first 64 bits are valid.&lt;br /&gt;
&lt;br /&gt;
There is a read-only column 58 (0x3A) containing 72 bits of chip signature data. This identifies the chip.&lt;br /&gt;
&lt;br /&gt;
The 20 OLMC control fuses do not have a column address. Instead, they are &amp;quot;addressed&amp;quot; by a separate pin.&lt;br /&gt;
&lt;br /&gt;
===Enable programming mode===&lt;br /&gt;
&lt;br /&gt;
In programming mode, the following pins have alternate functions. Pin numbering is for the DIP/SOIC/TSSOP(PLCC) package.&lt;br /&gt;
&lt;br /&gt;
* pin 2(3): PRogramming ENable&lt;br /&gt;
* pin 13(16): -STRobe&lt;br /&gt;
* pin 3(4): WRite&lt;br /&gt;
* pins 4(5), 6(7), 7(9), and 9(11): ERase&lt;br /&gt;
* pin 8(10): OLMC data&lt;br /&gt;
* pin 11(13): Serial IN&lt;br /&gt;
* pin 14(17): Serial OUT&lt;br /&gt;
* pin 10(12): Serial CLK&lt;br /&gt;
&lt;br /&gt;
Programming mode is enabled by applying 12V to PREN. PREN must remain at 12V for at least 50 milliseconds before beginning any other operation, and must remain at 12V for all programming operations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x1..&amp;quot;, node: &amp;quot;.a..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;0.1.&amp;quot;, node: &amp;quot;..b.c&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SOUT&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;, &amp;quot;b&amp;lt;-&amp;gt;c min 50ms&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Disabling programming mode===&lt;br /&gt;
&lt;br /&gt;
Programming mode is disabled by allowing PREN to drop to 0V for at least 20 microseconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x...&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;1.0.&amp;quot;, node: &amp;quot;..a.b&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Erasing the chip===&lt;br /&gt;
&lt;br /&gt;
Erasing the chip sets all fuses to the 1 state.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1.0.1.&amp;quot;, node: &amp;quot;..a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;01...0&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 200ms&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Writing a column===&lt;br /&gt;
&lt;br /&gt;
Writing a column of data involves:&lt;br /&gt;
* Sending the 132 bits of data serially, most significant bit first.&lt;br /&gt;
* Sending the 6-bit column address serially. most significant bit first.&lt;br /&gt;
* Setting WR high.&lt;br /&gt;
* Strobing the -STR line.&lt;br /&gt;
* Setting WR low.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warning: The serial protocol is very similar to, but not identical to, SPI. Data is clocked in on the positive edge of SCLK, but note that the very last bit is not clocked in by SCLK, but by the negative edge of -STR!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;1....|..........0.1.&amp;quot;, node: &amp;quot;................a.b&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;0....|.........1...0&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;SIN&amp;quot;,   wave: &amp;quot;03333|3333333333.0&amp;quot;, data: &amp;quot;131 130 129 128 3 2 1 0 c5 c4 c3 c2 c1 c0&amp;quot;, phase: 0.5 },&lt;br /&gt;
    { name: &amp;quot;SCLK&amp;quot;,  wave: &amp;quot;0P...|.........0.&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20ms&amp;quot;,&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: SCLK frequency may be no higher than 500kHz. It is not known what the minimum time between WR and -STR edges are, but it is under 1 µs. It is also not known what the setup and hold times for SIN are.&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=435</id>
		<title>User:Robertbaruch</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=435"/>
		<updated>2018-05-20T23:11:34Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Staging ground=&lt;br /&gt;
&lt;br /&gt;
==wavedrom test==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ signal: [&lt;br /&gt;
  { name: &amp;quot;clk&amp;quot;,  wave: &amp;quot;p......&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;bus&amp;quot;,  wave: &amp;quot;x.34.5x&amp;quot;,   data: &amp;quot;head body tail&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;wire&amp;quot;, wave: &amp;quot;0.1..0.&amp;quot; },&lt;br /&gt;
]}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ATF22V10C==&lt;br /&gt;
&lt;br /&gt;
At some point prior to Jul 2010, Atmel decided to make their own 22V10. It is pin- and fuse-compatible with the Lattice GAL22V10, but with additional features:&lt;br /&gt;
* I/O pin-keeper circuits, holding the previous value of an input after the input goes high-impedance.&lt;br /&gt;
* Optional pin-controlled power-down mode. This mode is controlled by a fuse not present in the Lattice chip.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/ATF22V10CCQ Atmel Datasheet rev Jul 2010], see [http://proghq.org/wiki/File:ATF22V10_LOGIC_DIAGRAM.png] for page 9 without the diagram cut off.&lt;br /&gt;
&lt;br /&gt;
[https://archive.org/details/gal22v10 Lattice Datasheet rev Mar 1998].&lt;br /&gt;
&lt;br /&gt;
The best view of the fuses is shown in page 5 of the Lattice datasheet, showing 5892 fuses.&lt;br /&gt;
&lt;br /&gt;
The fuses are organized as follows:&lt;br /&gt;
* 0-43: product term for asynchronous reset&lt;br /&gt;
* 44-439: sum of 8 product terms for output logic block 0&lt;br /&gt;
* 440-923: sum of 10 product terms for output logic block 1&lt;br /&gt;
* 924-1495: sum of 12 product terms for output logic block 2&lt;br /&gt;
* 1496-2155: sum of 14 product terms for output logic block 3&lt;br /&gt;
* 2156-2903: sum of 16 product terms for output logic block 4&lt;br /&gt;
* 2904-3651: sum of 16 product terms for output logic block 5&lt;br /&gt;
* 3652-4311: sum of 14 product terms for output logic block 6&lt;br /&gt;
* 4312-4883: sum of 12 product terms for output logic block 7&lt;br /&gt;
* 4884-5367: sum of 10 product terms for output logic block 8&lt;br /&gt;
* 5368-5763: sum of 8 product terms for output logic block 9&lt;br /&gt;
* 5764-5807: product term for synchronous preset&lt;br /&gt;
* 5808-5827: control fuses, 2 each, for output logic blocks&lt;br /&gt;
* 5828-5891: 8 bytes of programmable electronic signature data&lt;br /&gt;
&lt;br /&gt;
A security fuse is present, but its number is not in the datasheet.&lt;br /&gt;
&lt;br /&gt;
===Enable programming mode===&lt;br /&gt;
&lt;br /&gt;
In programming mode, the following pins have alternate functions. Pin numbering is for the DIP/SOIC/TSSOP(PLCC) package.&lt;br /&gt;
* pin 2(3): PRogramming ENable&lt;br /&gt;
* pin 13(16): -STRobe&lt;br /&gt;
* pin 3(4): WRite&lt;br /&gt;
* pins 4(5), 6(7), 7(9), and 9(11): ERase&lt;br /&gt;
* pin 8(10): OLMC data&lt;br /&gt;
&lt;br /&gt;
Programming mode is enabled by applying 12V to PREN. PREN must remain at 12V for at least 50 milliseconds before beginning any other operation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  signal: [&lt;br /&gt;
    { name: &amp;quot;-STR&amp;quot;,  wave: &amp;quot;x1..&amp;quot;, node: &amp;quot;.a..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;PREN&amp;quot;,  wave: &amp;quot;0.1.&amp;quot;, node: &amp;quot;..b.c&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;WR&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;ER&amp;quot;,    wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
    { name: &amp;quot;OLMC&amp;quot;,  wave: &amp;quot;x0..&amp;quot; },&lt;br /&gt;
  ],&lt;br /&gt;
  edge: [&lt;br /&gt;
    &amp;quot;a&amp;lt;-&amp;gt;b min 20µs&amp;quot;, &amp;quot;b&amp;lt;-&amp;gt;c min 50ms&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=File:ATF22V10_LOGIC_DIAGRAM.png&amp;diff=434</id>
		<title>File:ATF22V10 LOGIC DIAGRAM.png</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=File:ATF22V10_LOGIC_DIAGRAM.png&amp;diff=434"/>
		<updated>2018-05-20T22:23:19Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: Page 9 of the Atmel ATF22V10C(Q) datasheet, without the diagram cut off.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Page 9 of the Atmel ATF22V10C(Q) datasheet, without the diagram cut off.&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
	<entry>
		<id>https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=433</id>
		<title>User:Robertbaruch</title>
		<link rel="alternate" type="text/html" href="https://proghq.org/w/index.php?title=User:Robertbaruch&amp;diff=433"/>
		<updated>2018-05-20T21:36:38Z</updated>

		<summary type="html">&lt;p&gt;Robertbaruch: Created page with &amp;quot;=Staging ground=  ==wavedrom test==  &amp;lt;wavedrom&amp;gt; { signal: [   { name: &amp;quot;clk&amp;quot;,  wave: &amp;quot;p......&amp;quot; },   { name: &amp;quot;bus&amp;quot;,  wave: &amp;quot;x.34.5x&amp;quot;,   data: &amp;quot;head body tail&amp;quot; },   { name: &amp;quot;wire...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Staging ground=&lt;br /&gt;
&lt;br /&gt;
==wavedrom test==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;wavedrom&amp;gt;&lt;br /&gt;
{ signal: [&lt;br /&gt;
  { name: &amp;quot;clk&amp;quot;,  wave: &amp;quot;p......&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;bus&amp;quot;,  wave: &amp;quot;x.34.5x&amp;quot;,   data: &amp;quot;head body tail&amp;quot; },&lt;br /&gt;
  { name: &amp;quot;wire&amp;quot;, wave: &amp;quot;0.1..0.&amp;quot; },&lt;br /&gt;
]}&lt;br /&gt;
&amp;lt;/wavedrom&amp;gt;&lt;/div&gt;</summary>
		<author><name>Robertbaruch</name></author>
	</entry>
</feed>