<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant-TW">
	<id>https://tommy0804.ddns.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tommy</id>
	<title>flip the world - 使用者貢獻 [zh-tw]</title>
	<link rel="self" type="application/atom+xml" href="https://tommy0804.ddns.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tommy"/>
	<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php/%E7%89%B9%E6%AE%8A:%E4%BD%BF%E7%94%A8%E8%80%85%E8%B2%A2%E7%8D%BB/Tommy"/>
	<updated>2026-08-21T15:27:12Z</updated>
	<subtitle>使用者貢獻</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=587</id>
		<title>首頁</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=587"/>
		<updated>2026-08-21T06:06:16Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Main page: calmer gallery - ripple LED cube, drop camera photo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= About Tommy C. Liu =&lt;br /&gt;
* Welcome to discuss outsourcing project&lt;br /&gt;
** FW/SW development&lt;br /&gt;
** Training course  &lt;br /&gt;
* E-mail: tommy.using@gmail.com&lt;br /&gt;
* LinkedIn: https://www.linkedin.com/in/chia-chuan-liu-7706b473/&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;156&amp;quot;&amp;gt;&lt;br /&gt;
File:3D_ripples_01.gif|3D LED cube &amp;amp;ndash; ripple effect&lt;br /&gt;
File:MeArm_stm32f4.jpg|MeArm robotic arm driven by STM32F4&lt;br /&gt;
File:Gps_wifiap.jpg|GPS tracker with Wi-Fi AP&lt;br /&gt;
File:Eye_tracker_alexa.jpg|Eye tracker with Alexa and AWS IoT&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browse by category ==&lt;br /&gt;
* [[:Category:Projects|Projects]] &amp;amp;mdash; hands-on builds and application notes (31)&lt;br /&gt;
* [[:Category:Boards and SoCs|Boards and SoCs]] &amp;amp;mdash; dev boards, MCUs and SoCs (23)&lt;br /&gt;
* [[:Category:Software and Tools|Software and Tools]] &amp;amp;mdash; OS, build and test tooling (10)&lt;br /&gt;
* [[:Category:Sensors and Modules|Sensors and Modules]] &amp;amp;mdash; sensors and peripheral modules (5)&lt;br /&gt;
* [[:Category:Software Engineering|Software Engineering]] &amp;amp;mdash; process and practice (3)&lt;br /&gt;
* [[:Category:Connectivity|Connectivity]] &amp;amp;mdash; buses and wireless protocols (2)&lt;br /&gt;
&lt;br /&gt;
== CI/CD ==&lt;br /&gt;
&lt;br /&gt;
* [[ Jenkins ]]&lt;br /&gt;
&lt;br /&gt;
== Equipments ==&lt;br /&gt;
* Measurement&lt;br /&gt;
** Logic Analyzer&lt;br /&gt;
*** Max Sample Rate 400MHz&lt;br /&gt;
*** 16G stream / 256M buffer&lt;br /&gt;
*** 16 Channels&lt;br /&gt;
** Multimeter&lt;br /&gt;
&lt;br /&gt;
* Computings&lt;br /&gt;
** Linux server - Intel Xeon E3-1231 v3(8 cores)&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1230 v3&lt;br /&gt;
*** 24G RAM&lt;br /&gt;
** Windows desktop&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1231&lt;br /&gt;
** Linux laptop&lt;br /&gt;
*** i7-7600U&lt;br /&gt;
*** 16G RAM&lt;br /&gt;
&lt;br /&gt;
== Rule ==&lt;br /&gt;
* [[ Software version ]]&lt;br /&gt;
* [[ Software release life cycle ]]&lt;br /&gt;
== Article ==&lt;br /&gt;
* [[如何用正確的方法來寫出品質好的軟體的75條體會]]&lt;br /&gt;
* [[Tomato Firmware]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Raspberry_Pi&amp;diff=586</id>
		<title>Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Raspberry_Pi&amp;diff=586"/>
		<updated>2026-08-21T05:54:54Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Convert heading-links to a Related projects list; fix MAX7219 and drop non-existent PN532&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== GPIO connector ===&lt;br /&gt;
RPi A+,B+ GPIO J8 40-pin pinout. &lt;br /&gt;
[http://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/Raspberry-Pi-B-Plus-V1.2-Schematics.pdf]&lt;br /&gt;
Models A and B have only the first 26 pins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! GPIO#&lt;br /&gt;
! 2nd fun&lt;br /&gt;
! pin#&lt;br /&gt;
!&lt;br /&gt;
! pin#&lt;br /&gt;
! 2nd fun&lt;br /&gt;
! GPIO#&lt;br /&gt;
|-&lt;br /&gt;
|      - &lt;br /&gt;
|  +3V3 &lt;br /&gt;
| style=&amp;quot;background:orange&amp;quot;| 1 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:red&amp;quot;| 2 &lt;br /&gt;
| +5V   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO2 &lt;br /&gt;
|  SDA1 (I2C)&lt;br /&gt;
| style=&amp;quot;background:#00FFFF&amp;quot;| 3 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:red&amp;quot;| 4 &lt;br /&gt;
| +5V   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO3 &lt;br /&gt;
|  SCL1 (I2C)&lt;br /&gt;
| style=&amp;quot;background:#00FFFF&amp;quot;| 5 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;| 6 &lt;br /&gt;
| GND   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO4 &lt;br /&gt;
|  GCLK &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;| 7 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:#00FF80&amp;quot;| 8 &lt;br /&gt;
| TXD0 (UART)&lt;br /&gt;
| GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|      - &lt;br /&gt;
|   GND &lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;| 9 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:#00FF80&amp;quot;|10 &lt;br /&gt;
| RXD0 (UART) &lt;br /&gt;
| GPIO15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 &lt;br /&gt;
|  GEN0 &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|11 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|12 &lt;br /&gt;
| GEN1  &lt;br /&gt;
| GPIO18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 &lt;br /&gt;
|  GEN2 &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|13 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|14 &lt;br /&gt;
| GND   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 &lt;br /&gt;
|  GEN3 &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|15 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|16 &lt;br /&gt;
| GEN4  &lt;br /&gt;
| GPIO23&lt;br /&gt;
|-&lt;br /&gt;
|      - &lt;br /&gt;
|  +3V3 &lt;br /&gt;
| style=&amp;quot;background:orange&amp;quot;|17 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|18 &lt;br /&gt;
| GEN5  &lt;br /&gt;
| GPIO24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 &lt;br /&gt;
|  MOSI (SPI)&lt;br /&gt;
| style=&amp;quot;background:#FF00FF&amp;quot;|19 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|20 &lt;br /&gt;
| GND   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO9 &lt;br /&gt;
|  MISO (SPI)&lt;br /&gt;
| style=&amp;quot;background:#FF00FF&amp;quot;|21 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|22 &lt;br /&gt;
| GEN6  &lt;br /&gt;
| GPIO25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 &lt;br /&gt;
|  SCLK (SPI)&lt;br /&gt;
| style=&amp;quot;background:#FF00FF&amp;quot;|23 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:#FF00FF&amp;quot;|24 &lt;br /&gt;
| CE0_N (SPI)&lt;br /&gt;
| GPIO8&lt;br /&gt;
|-&lt;br /&gt;
|      - &lt;br /&gt;
|   GND &lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|25 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:#FF00FF&amp;quot;|26 &lt;br /&gt;
| CE1_N (SPI)&lt;br /&gt;
| GPIO7&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; colspan=&amp;quot;7&amp;quot; | &#039;&#039;(Models A and B stop here)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EEPROM &lt;br /&gt;
| ID_SD &lt;br /&gt;
| style=&amp;quot;background:yellow&amp;quot;|27 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:yellow&amp;quot;|28 &lt;br /&gt;
| ID_SC &lt;br /&gt;
| EEPROM&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO5 &lt;br /&gt;
|     - &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|29 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|30 &lt;br /&gt;
| GND   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO6 &lt;br /&gt;
|     - &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|31 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|32 &lt;br /&gt;
| -     &lt;br /&gt;
| GPIO12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 &lt;br /&gt;
|     - &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|33 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|34 &lt;br /&gt;
| GND   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 &lt;br /&gt;
|     - &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|35 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|36 &lt;br /&gt;
| -     &lt;br /&gt;
| GPIO16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 &lt;br /&gt;
|     - &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|37 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|38 &lt;br /&gt;
| -     &lt;br /&gt;
| GPIO20&lt;br /&gt;
|-&lt;br /&gt;
|      - &lt;br /&gt;
|   GND &lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|39 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|40 &lt;br /&gt;
| -     &lt;br /&gt;
| GPIO21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Model B rev 2 also has a pad P6 of 8 pins offering access to an additional 4 GPIO connections.&lt;br /&gt;
[http://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/Raspberry-Pi-Rev-2.1-Model-AB-Schematics.pdf]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function&lt;br /&gt;
! pin#&lt;br /&gt;
!&lt;br /&gt;
! pin#&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
|  +5V &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot;| 1 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:orange&amp;quot;| 2 &lt;br /&gt;
| +3V3  &lt;br /&gt;
|-&lt;br /&gt;
| GPIO_GEN7&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|3&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|4 &lt;br /&gt;
| GPIO_GEN8     &lt;br /&gt;
|-&lt;br /&gt;
| GPIO_GEN9&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|5&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|6&lt;br /&gt;
| GPIO_GEN10     &lt;br /&gt;
|-&lt;br /&gt;
| GND&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;| 8&lt;br /&gt;
| GND   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Models A and B provide GPIO access to the ACT status LED using GPIO 16.&lt;br /&gt;
Models A+ and B+ provide GPIO access to the ACT status LED using GPIO 47, and the Power status LED using GPIO 35.&lt;br /&gt;
&lt;br /&gt;
== Related projects ==&lt;br /&gt;
&lt;br /&gt;
* [[application - MX35LFxGE4AB, SPI NAND Flash]]&lt;br /&gt;
* [[application - Keyes 38KHz IR Infrared Transmitter Module]]&lt;br /&gt;
* [[application - u-blox NEO-6M, GPS module]]&lt;br /&gt;
* [[Application - DS1302, RTC module]]&lt;br /&gt;
* [[application - HC-SR04, Ultrasonic ranging module]]&lt;br /&gt;
* [[application - LPC1768, SPI communication]]&lt;br /&gt;
* [[Application - MAX7219, Serially Interfaced, 8-Digit LED Display Drivers (scrolling text)]]&lt;br /&gt;
* [[Application - MAX7219, Serially Interfaced, 8-Digit LED Display Drivers (interact with MPR121)]]&lt;br /&gt;
* [[bluetooth keyboard auto connect]]&lt;br /&gt;
* [[RoboPeak Mini USB Display]]&lt;br /&gt;
* [[application - Wifi AP]]&lt;br /&gt;
* [[application - GPS tracker]]&lt;br /&gt;
* [[application - Speech Recognition]]&lt;br /&gt;
* [[application - Alexa]]&lt;br /&gt;
* [[Application - Greengrass]]&lt;br /&gt;
* [[application - Google Assistant]]&lt;br /&gt;
* [[application - Monitor GPIO interrupt in userspace]]&lt;br /&gt;
* [[application - 3-axis accelerometer, GID-SSS/U10]]&lt;br /&gt;
* [[application - RFID, RC522]]&lt;br /&gt;
* [[u-boot]]&lt;br /&gt;
* [[kernel]]&lt;br /&gt;
* [[Android]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=585</id>
		<title>首頁</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=585"/>
		<updated>2026-08-21T05:54:54Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Main page: calmer gallery - ripple LED cube, drop camera photo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= About Tommy C. Liu =&lt;br /&gt;
* Welcome to discuss outsourcing project&lt;br /&gt;
** FW/SW development&lt;br /&gt;
** Training course  &lt;br /&gt;
* E-mail: tommy.using@gmail.com&lt;br /&gt;
* LinkedIn: https://www.linkedin.com/in/chia-chuan-liu-7706b473/&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;156&amp;quot;&amp;gt;&lt;br /&gt;
File:3D_ripples_01.gif|3D LED cube &amp;amp;ndash; ripple effect&lt;br /&gt;
File:MeArm_stm32f4.jpg|MeArm robotic arm driven by STM32F4&lt;br /&gt;
File:Gps_wifiap.jpg|GPS tracker with Wi-Fi AP&lt;br /&gt;
File:Eye_tracker_alexa.jpg|Eye tracker with Alexa and AWS IoT&lt;br /&gt;
File:Mg90s.gif|MG90S servo control&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browse by category ==&lt;br /&gt;
* [[:Category:Projects|Projects]] &amp;amp;mdash; hands-on builds and application notes (31)&lt;br /&gt;
* [[:Category:Boards and SoCs|Boards and SoCs]] &amp;amp;mdash; dev boards, MCUs and SoCs (23)&lt;br /&gt;
* [[:Category:Software and Tools|Software and Tools]] &amp;amp;mdash; OS, build and test tooling (10)&lt;br /&gt;
* [[:Category:Sensors and Modules|Sensors and Modules]] &amp;amp;mdash; sensors and peripheral modules (5)&lt;br /&gt;
* [[:Category:Software Engineering|Software Engineering]] &amp;amp;mdash; process and practice (3)&lt;br /&gt;
* [[:Category:Connectivity|Connectivity]] &amp;amp;mdash; buses and wireless protocols (2)&lt;br /&gt;
&lt;br /&gt;
== CI/CD ==&lt;br /&gt;
&lt;br /&gt;
* [[ Jenkins ]]&lt;br /&gt;
&lt;br /&gt;
== Equipments ==&lt;br /&gt;
* Measurement&lt;br /&gt;
** Logic Analyzer&lt;br /&gt;
*** Max Sample Rate 400MHz&lt;br /&gt;
*** 16G stream / 256M buffer&lt;br /&gt;
*** 16 Channels&lt;br /&gt;
** Multimeter&lt;br /&gt;
&lt;br /&gt;
* Computings&lt;br /&gt;
** Linux server - Intel Xeon E3-1231 v3(8 cores)&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1230 v3&lt;br /&gt;
*** 24G RAM&lt;br /&gt;
** Windows desktop&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1231&lt;br /&gt;
** Linux laptop&lt;br /&gt;
*** i7-7600U&lt;br /&gt;
*** 16G RAM&lt;br /&gt;
&lt;br /&gt;
== Rule ==&lt;br /&gt;
* [[ Software version ]]&lt;br /&gt;
* [[ Software release life cycle ]]&lt;br /&gt;
== Article ==&lt;br /&gt;
* [[如何用正確的方法來寫出品質好的軟體的75條體會]]&lt;br /&gt;
* [[Tomato Firmware]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=584</id>
		<title>首頁</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=584"/>
		<updated>2026-08-21T05:49:25Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Main page: calmer gallery - ripple LED cube, drop camera photo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= About Tommy C. Liu =&lt;br /&gt;
* Welcome to discuss outsourcing project&lt;br /&gt;
** FW/SW development&lt;br /&gt;
** Training course  &lt;br /&gt;
* E-mail: tommy.using@gmail.com&lt;br /&gt;
* LinkedIn: https://www.linkedin.com/in/chia-chuan-liu-7706b473/&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;156&amp;quot;&amp;gt;&lt;br /&gt;
File:3D_ripples_01.gif|3D LED cube &amp;amp;ndash; ripple effect&lt;br /&gt;
File:MeArm_stm32f4.jpg|MeArm robotic arm driven by STM32F4&lt;br /&gt;
File:Gps_tracker.jpg|GPS tracker&lt;br /&gt;
File:Eye_tracker_alexa.jpg|Eye tracker with Alexa and AWS IoT&lt;br /&gt;
File:Mg90s.gif|MG90S servo control&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browse by category ==&lt;br /&gt;
* [[:Category:Projects|Projects]] &amp;amp;mdash; hands-on builds and application notes (31)&lt;br /&gt;
* [[:Category:Boards and SoCs|Boards and SoCs]] &amp;amp;mdash; dev boards, MCUs and SoCs (23)&lt;br /&gt;
* [[:Category:Software and Tools|Software and Tools]] &amp;amp;mdash; OS, build and test tooling (10)&lt;br /&gt;
* [[:Category:Sensors and Modules|Sensors and Modules]] &amp;amp;mdash; sensors and peripheral modules (5)&lt;br /&gt;
* [[:Category:Software Engineering|Software Engineering]] &amp;amp;mdash; process and practice (3)&lt;br /&gt;
* [[:Category:Connectivity|Connectivity]] &amp;amp;mdash; buses and wireless protocols (2)&lt;br /&gt;
&lt;br /&gt;
== CI/CD ==&lt;br /&gt;
&lt;br /&gt;
* [[ Jenkins ]]&lt;br /&gt;
&lt;br /&gt;
== Equipments ==&lt;br /&gt;
* Measurement&lt;br /&gt;
** Logic Analyzer&lt;br /&gt;
*** Max Sample Rate 400MHz&lt;br /&gt;
*** 16G stream / 256M buffer&lt;br /&gt;
*** 16 Channels&lt;br /&gt;
** Multimeter&lt;br /&gt;
&lt;br /&gt;
* Computings&lt;br /&gt;
** Linux server - Intel Xeon E3-1231 v3(8 cores)&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1230 v3&lt;br /&gt;
*** 24G RAM&lt;br /&gt;
** Windows desktop&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1231&lt;br /&gt;
** Linux laptop&lt;br /&gt;
*** i7-7600U&lt;br /&gt;
*** 16G RAM&lt;br /&gt;
&lt;br /&gt;
== Rule ==&lt;br /&gt;
* [[ Software version ]]&lt;br /&gt;
* [[ Software release life cycle ]]&lt;br /&gt;
== Article ==&lt;br /&gt;
* [[如何用正確的方法來寫出品質好的軟體的75條體會]]&lt;br /&gt;
* [[Tomato Firmware]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=583</id>
		<title>首頁</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=583"/>
		<updated>2026-08-21T05:44:36Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Main page: calmer gallery - static LED cube, MeArm replaces BLE mesh&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= About Tommy C. Liu =&lt;br /&gt;
* Welcome to discuss outsourcing project&lt;br /&gt;
** FW/SW development&lt;br /&gt;
** Training course  &lt;br /&gt;
* E-mail: tommy.using@gmail.com&lt;br /&gt;
* LinkedIn: https://www.linkedin.com/in/chia-chuan-liu-7706b473/&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;190&amp;quot;&amp;gt;&lt;br /&gt;
File:Led_02.jpg|3D LED cube&lt;br /&gt;
File:MeArm_stm32f4.jpg|MeArm robotic arm driven by STM32F4&lt;br /&gt;
File:Bp_rpi_ov7251.jpg|Raspberry Pi + OV7251 camera over SCCB&lt;br /&gt;
File:Gps_tracker.jpg|GPS tracker&lt;br /&gt;
File:Eye_tracker_alexa.jpg|Eye tracker with Alexa and AWS IoT&lt;br /&gt;
File:Mg90s.gif|MG90S servo control&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browse by category ==&lt;br /&gt;
* [[:Category:Projects|Projects]] &amp;amp;mdash; hands-on builds and application notes (31)&lt;br /&gt;
* [[:Category:Boards and SoCs|Boards and SoCs]] &amp;amp;mdash; dev boards, MCUs and SoCs (23)&lt;br /&gt;
* [[:Category:Software and Tools|Software and Tools]] &amp;amp;mdash; OS, build and test tooling (10)&lt;br /&gt;
* [[:Category:Sensors and Modules|Sensors and Modules]] &amp;amp;mdash; sensors and peripheral modules (5)&lt;br /&gt;
* [[:Category:Software Engineering|Software Engineering]] &amp;amp;mdash; process and practice (3)&lt;br /&gt;
* [[:Category:Connectivity|Connectivity]] &amp;amp;mdash; buses and wireless protocols (2)&lt;br /&gt;
&lt;br /&gt;
== CI/CD ==&lt;br /&gt;
&lt;br /&gt;
* [[ Jenkins ]]&lt;br /&gt;
&lt;br /&gt;
== Equipments ==&lt;br /&gt;
* Measurement&lt;br /&gt;
** Logic Analyzer&lt;br /&gt;
*** Max Sample Rate 400MHz&lt;br /&gt;
*** 16G stream / 256M buffer&lt;br /&gt;
*** 16 Channels&lt;br /&gt;
** Multimeter&lt;br /&gt;
&lt;br /&gt;
* Computings&lt;br /&gt;
** Linux server - Intel Xeon E3-1231 v3(8 cores)&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1230 v3&lt;br /&gt;
*** 24G RAM&lt;br /&gt;
** Windows desktop&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1231&lt;br /&gt;
** Linux laptop&lt;br /&gt;
*** i7-7600U&lt;br /&gt;
*** 16G RAM&lt;br /&gt;
&lt;br /&gt;
== Rule ==&lt;br /&gt;
* [[ Software version ]]&lt;br /&gt;
* [[ Software release life cycle ]]&lt;br /&gt;
== Article ==&lt;br /&gt;
* [[如何用正確的方法來寫出品質好的軟體的75條體會]]&lt;br /&gt;
* [[Tomato Firmware]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=MediaWiki:Common.css&amp;diff=582</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=MediaWiki:Common.css&amp;diff=582"/>
		<updated>2026-08-21T05:44:36Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Constrain logo size so it does not overlap the Timeless header&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* flip the world - site styling. Kept deliberately restrained:&lt;br /&gt;
   Timeless already provides the layout; this only improves readability. */&lt;br /&gt;
&lt;br /&gt;
/* More comfortable reading measure and rhythm */&lt;br /&gt;
.mw-body-content {&lt;br /&gt;
	line-height: 1.7;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Headings get room to breathe and a light rule */&lt;br /&gt;
.mw-body-content h2 {&lt;br /&gt;
	margin-top: 1.6em;&lt;br /&gt;
	padding-bottom: 0.25em;&lt;br /&gt;
	border-bottom: 1px solid #c8ccd1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h3 {&lt;br /&gt;
	margin-top: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* List spacing - the category index reads better with air */&lt;br /&gt;
.mw-body-content ul li {&lt;br /&gt;
	margin-bottom: 0.35em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Gallery thumbnails: soften edges, add depth */&lt;br /&gt;
.mw-body-content ul.gallery {&lt;br /&gt;
	margin: 1.2em 0 1.8em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .gallerybox .thumb img {&lt;br /&gt;
	border-radius: 4px;&lt;br /&gt;
	box-shadow: 0 1px 4px rgba( 0, 0, 0, 0.18 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .gallerybox .gallerytext {&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
	color: #54595d;&lt;br /&gt;
	padding-top: 0.4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Code blocks - this is a hardware wiki, code should look deliberate */&lt;br /&gt;
.mw-body-content pre,&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
	padding: 0.9em 1em;&lt;br /&gt;
	overflow-x: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tables */&lt;br /&gt;
.mw-body-content .wikitable {&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Logo: Timeless applies no size constraint, so a tall logo overlaps&lt;br /&gt;
   the header. Keep it inside its slot. */&lt;br /&gt;
#p-logo img,&lt;br /&gt;
.mw-wiki-logo.timeless-logo {&lt;br /&gt;
	max-width: 100%;&lt;br /&gt;
	max-height: 80px;&lt;br /&gt;
	width: auto;&lt;br /&gt;
	height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-logo {&lt;br /&gt;
	padding: 0.5em 0;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=581</id>
		<title>首頁</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=581"/>
		<updated>2026-08-21T05:40:18Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Main page: feature representative projects across LED, servo, vision, BLE, GPS and voice&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= About Tommy C. Liu =&lt;br /&gt;
* Welcome to discuss outsourcing project&lt;br /&gt;
** FW/SW development&lt;br /&gt;
** Training course  &lt;br /&gt;
* E-mail: tommy.using@gmail.com&lt;br /&gt;
* LinkedIn: https://www.linkedin.com/in/chia-chuan-liu-7706b473/&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;190&amp;quot;&amp;gt;&lt;br /&gt;
File:3d_led_cube_demo.gif|3D LED cube&lt;br /&gt;
File:Mg90s.gif|MG90S servo control&lt;br /&gt;
File:Bp_rpi_ov7251.jpg|Raspberry Pi + OV7251 camera over SCCB&lt;br /&gt;
File:Ble_mesh_light.jpg|BLE mesh lighting node&lt;br /&gt;
File:Gps_tracker.jpg|GPS tracker&lt;br /&gt;
File:Eye_tracker_alexa.jpg|Eye tracker with Alexa and AWS IoT&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browse by category ==&lt;br /&gt;
* [[:Category:Projects|Projects]] &amp;amp;mdash; hands-on builds and application notes (31)&lt;br /&gt;
* [[:Category:Boards and SoCs|Boards and SoCs]] &amp;amp;mdash; dev boards, MCUs and SoCs (23)&lt;br /&gt;
* [[:Category:Software and Tools|Software and Tools]] &amp;amp;mdash; OS, build and test tooling (10)&lt;br /&gt;
* [[:Category:Sensors and Modules|Sensors and Modules]] &amp;amp;mdash; sensors and peripheral modules (5)&lt;br /&gt;
* [[:Category:Software Engineering|Software Engineering]] &amp;amp;mdash; process and practice (3)&lt;br /&gt;
* [[:Category:Connectivity|Connectivity]] &amp;amp;mdash; buses and wireless protocols (2)&lt;br /&gt;
&lt;br /&gt;
== CI/CD ==&lt;br /&gt;
&lt;br /&gt;
* [[ Jenkins ]]&lt;br /&gt;
&lt;br /&gt;
== Equipments ==&lt;br /&gt;
* Measurement&lt;br /&gt;
** Logic Analyzer&lt;br /&gt;
*** Max Sample Rate 400MHz&lt;br /&gt;
*** 16G stream / 256M buffer&lt;br /&gt;
*** 16 Channels&lt;br /&gt;
** Multimeter&lt;br /&gt;
&lt;br /&gt;
* Computings&lt;br /&gt;
** Linux server - Intel Xeon E3-1231 v3(8 cores)&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1230 v3&lt;br /&gt;
*** 24G RAM&lt;br /&gt;
** Windows desktop&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1231&lt;br /&gt;
** Linux laptop&lt;br /&gt;
*** i7-7600U&lt;br /&gt;
*** 16G RAM&lt;br /&gt;
&lt;br /&gt;
== Rule ==&lt;br /&gt;
* [[ Software version ]]&lt;br /&gt;
* [[ Software release life cycle ]]&lt;br /&gt;
== Article ==&lt;br /&gt;
* [[如何用正確的方法來寫出品質好的軟體的75條體會]]&lt;br /&gt;
* [[Tomato Firmware]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=580</id>
		<title>首頁</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=580"/>
		<updated>2026-08-21T05:35:17Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add project gallery to main page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= About Tommy C. Liu =&lt;br /&gt;
* Welcome to discuss outsourcing project&lt;br /&gt;
** FW/SW development&lt;br /&gt;
** Training course  &lt;br /&gt;
* E-mail: tommy.using@gmail.com&lt;br /&gt;
* LinkedIn: https://www.linkedin.com/in/chia-chuan-liu-7706b473/&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=&amp;quot;160&amp;quot;&amp;gt;&lt;br /&gt;
File:Bp_rpi_ov7251.jpg|Raspberry Pi + OV7251 camera over SCCB&lt;br /&gt;
File:Ble_mesh_light.jpg|BLE mesh lighting node&lt;br /&gt;
File:Gps_tracker.jpg|GPS tracker build&lt;br /&gt;
File:Mt7697.jpg|MediaTek MT7697 board bring-up&lt;br /&gt;
File:Led_02.jpg|3D LED cube&lt;br /&gt;
File:Pwm2dc.jpg|PWM to DC conversion&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browse by category ==&lt;br /&gt;
* [[:Category:Projects|Projects]] &amp;amp;mdash; hands-on builds and application notes (31)&lt;br /&gt;
* [[:Category:Boards and SoCs|Boards and SoCs]] &amp;amp;mdash; dev boards, MCUs and SoCs (23)&lt;br /&gt;
* [[:Category:Software and Tools|Software and Tools]] &amp;amp;mdash; OS, build and test tooling (10)&lt;br /&gt;
* [[:Category:Sensors and Modules|Sensors and Modules]] &amp;amp;mdash; sensors and peripheral modules (5)&lt;br /&gt;
* [[:Category:Software Engineering|Software Engineering]] &amp;amp;mdash; process and practice (3)&lt;br /&gt;
* [[:Category:Connectivity|Connectivity]] &amp;amp;mdash; buses and wireless protocols (2)&lt;br /&gt;
&lt;br /&gt;
== CI/CD ==&lt;br /&gt;
&lt;br /&gt;
* [[ Jenkins ]]&lt;br /&gt;
&lt;br /&gt;
== Equipments ==&lt;br /&gt;
* Measurement&lt;br /&gt;
** Logic Analyzer&lt;br /&gt;
*** Max Sample Rate 400MHz&lt;br /&gt;
*** 16G stream / 256M buffer&lt;br /&gt;
*** 16 Channels&lt;br /&gt;
** Multimeter&lt;br /&gt;
&lt;br /&gt;
* Computings&lt;br /&gt;
** Linux server - Intel Xeon E3-1231 v3(8 cores)&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1230 v3&lt;br /&gt;
*** 24G RAM&lt;br /&gt;
** Windows desktop&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1231&lt;br /&gt;
** Linux laptop&lt;br /&gt;
*** i7-7600U&lt;br /&gt;
*** 16G RAM&lt;br /&gt;
&lt;br /&gt;
== Rule ==&lt;br /&gt;
* [[ Software version ]]&lt;br /&gt;
* [[ Software release life cycle ]]&lt;br /&gt;
== Article ==&lt;br /&gt;
* [[如何用正確的方法來寫出品質好的軟體的75條體會]]&lt;br /&gt;
* [[Tomato Firmware]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=MediaWiki:Common.css&amp;diff=579</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=MediaWiki:Common.css&amp;diff=579"/>
		<updated>2026-08-21T05:35:17Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Site styling: readability, gallery and code block polish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* flip the world - site styling. Kept deliberately restrained:&lt;br /&gt;
   Timeless already provides the layout; this only improves readability. */&lt;br /&gt;
&lt;br /&gt;
/* More comfortable reading measure and rhythm */&lt;br /&gt;
.mw-body-content {&lt;br /&gt;
	line-height: 1.7;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Headings get room to breathe and a light rule */&lt;br /&gt;
.mw-body-content h2 {&lt;br /&gt;
	margin-top: 1.6em;&lt;br /&gt;
	padding-bottom: 0.25em;&lt;br /&gt;
	border-bottom: 1px solid #c8ccd1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h3 {&lt;br /&gt;
	margin-top: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* List spacing - the category index reads better with air */&lt;br /&gt;
.mw-body-content ul li {&lt;br /&gt;
	margin-bottom: 0.35em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Gallery thumbnails: soften edges, add depth */&lt;br /&gt;
.mw-body-content ul.gallery {&lt;br /&gt;
	margin: 1.2em 0 1.8em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .gallerybox .thumb img {&lt;br /&gt;
	border-radius: 4px;&lt;br /&gt;
	box-shadow: 0 1px 4px rgba( 0, 0, 0, 0.18 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .gallerybox .gallerytext {&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
	color: #54595d;&lt;br /&gt;
	padding-top: 0.4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Code blocks - this is a hardware wiki, code should look deliberate */&lt;br /&gt;
.mw-body-content pre,&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
	padding: 0.9em 1em;&lt;br /&gt;
	overflow-x: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tables */&lt;br /&gt;
.mw-body-content .wikitable {&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=578</id>
		<title>首頁</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=578"/>
		<updated>2026-08-21T05:29:10Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Main page: replace hand-maintained project list with categories; drop dead SonarQube link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= About Tommy C. Liu =&lt;br /&gt;
* Welcome to discuss outsourcing project&lt;br /&gt;
** FW/SW development&lt;br /&gt;
** Training course  &lt;br /&gt;
* E-mail: tommy.using@gmail.com&lt;br /&gt;
* LinkedIn: https://www.linkedin.com/in/chia-chuan-liu-7706b473/&lt;br /&gt;
== Browse by category ==&lt;br /&gt;
* [[:Category:Projects|Projects]] &amp;amp;mdash; hands-on builds and application notes (31)&lt;br /&gt;
* [[:Category:Boards and SoCs|Boards and SoCs]] &amp;amp;mdash; dev boards, MCUs and SoCs (23)&lt;br /&gt;
* [[:Category:Software and Tools|Software and Tools]] &amp;amp;mdash; OS, build and test tooling (10)&lt;br /&gt;
* [[:Category:Sensors and Modules|Sensors and Modules]] &amp;amp;mdash; sensors and peripheral modules (5)&lt;br /&gt;
* [[:Category:Software Engineering|Software Engineering]] &amp;amp;mdash; process and practice (3)&lt;br /&gt;
* [[:Category:Connectivity|Connectivity]] &amp;amp;mdash; buses and wireless protocols (2)&lt;br /&gt;
&lt;br /&gt;
== CI/CD ==&lt;br /&gt;
&lt;br /&gt;
* [[ Jenkins ]]&lt;br /&gt;
&lt;br /&gt;
== Equipments ==&lt;br /&gt;
* Measurement&lt;br /&gt;
** Logic Analyzer&lt;br /&gt;
*** Max Sample Rate 400MHz&lt;br /&gt;
*** 16G stream / 256M buffer&lt;br /&gt;
*** 16 Channels&lt;br /&gt;
** Multimeter&lt;br /&gt;
&lt;br /&gt;
* Computings&lt;br /&gt;
** Linux server - Intel Xeon E3-1231 v3(8 cores)&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1230 v3&lt;br /&gt;
*** 24G RAM&lt;br /&gt;
** Windows desktop&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1231&lt;br /&gt;
** Linux laptop&lt;br /&gt;
*** i7-7600U&lt;br /&gt;
*** 16G RAM&lt;br /&gt;
&lt;br /&gt;
== Rule ==&lt;br /&gt;
* [[ Software version ]]&lt;br /&gt;
* [[ Software release life cycle ]]&lt;br /&gt;
== Article ==&lt;br /&gt;
* [[如何用正確的方法來寫出品質好的軟體的75條體會]]&lt;br /&gt;
* [[Tomato Firmware]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=577</id>
		<title>首頁</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=577"/>
		<updated>2026-08-21T05:25:31Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Merge Running/Finished project lists into Selected work; de-link missing SonarQube page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= About Tommy C. Liu =&lt;br /&gt;
* Welcome to discuss outsourcing project&lt;br /&gt;
** FW/SW development&lt;br /&gt;
** Training course  &lt;br /&gt;
* E-mail: tommy.using@gmail.com&lt;br /&gt;
* LinkedIn: https://www.linkedin.com/in/chia-chuan-liu-7706b473/&lt;br /&gt;
== Browse by category ==&lt;br /&gt;
* [[:Category:Projects|Projects]] &amp;amp;mdash; hands-on builds and application notes (31)&lt;br /&gt;
* [[:Category:Boards and SoCs|Boards and SoCs]] &amp;amp;mdash; dev boards, MCUs and SoCs (23)&lt;br /&gt;
* [[:Category:Software and Tools|Software and Tools]] &amp;amp;mdash; OS, build and test tooling (10)&lt;br /&gt;
* [[:Category:Sensors and Modules|Sensors and Modules]] &amp;amp;mdash; sensors and peripheral modules (5)&lt;br /&gt;
* [[:Category:Software Engineering|Software Engineering]] &amp;amp;mdash; process and practice (3)&lt;br /&gt;
* [[:Category:Connectivity|Connectivity]] &amp;amp;mdash; buses and wireless protocols (2)&lt;br /&gt;
&lt;br /&gt;
== Selected work ==&lt;br /&gt;
&lt;br /&gt;
* [[ LilyPad, nano51822]]&lt;br /&gt;
* [[ ESP8266, Wi-Fi SoC]]&lt;br /&gt;
* [[ ESP32 ]]&lt;br /&gt;
* [[ Nordic, nRF52 Preview DK]]&lt;br /&gt;
* [[ BLE mesh ]]&lt;br /&gt;
* [[ Seeed + Hackaday, Tiny BLE]]&lt;br /&gt;
* [[ ST, STM32F4 Discovery]]&lt;br /&gt;
* [[ NXP, LPC1768 ]]&lt;br /&gt;
* [[ Raspberry Pi ]]&lt;br /&gt;
* [[ MTK, MT7697]]&lt;br /&gt;
* [[ hadoop ]]&lt;br /&gt;
* [[ Microchip, 8-bit]]&lt;br /&gt;
* [[ Arduino Pro Mini, ATMega328P]]&lt;br /&gt;
* [[ Bus pirate, verify]]&lt;br /&gt;
* [[ 3D LED CUBE ]]&lt;br /&gt;
* [[ BT speaker ]]&lt;br /&gt;
* [[ TI, CC3220SF ]]&lt;br /&gt;
* [[ OpenSync]]&lt;br /&gt;
* [[ googletest ]]&lt;br /&gt;
* [[ Teensy 4.0 ]]&lt;br /&gt;
* [[ NXP, i.MX 6UL ]]&lt;br /&gt;
* [[ Maixduino ]]&lt;br /&gt;
* [[ Hikey960 ]]&lt;br /&gt;
* [[ ODROID-C4]]&lt;br /&gt;
* [[ Qualcomm, HDK8250(SM8250) ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Firefox ]]&lt;br /&gt;
* [[ Tiny6410 ]]&lt;br /&gt;
* [[ RTD1073 ]]&lt;br /&gt;
* [[ ASTAR ]]&lt;br /&gt;
* [[ Netgem ]]&lt;br /&gt;
* [[ bcmAP ]]&lt;br /&gt;
* [[ Eye tracker + Alexa + IoT Things ]]&lt;br /&gt;
&lt;br /&gt;
== CI/CD ==&lt;br /&gt;
&lt;br /&gt;
* [[ Jenkins ]]&lt;br /&gt;
* SonarQube&lt;br /&gt;
&lt;br /&gt;
== Equipments ==&lt;br /&gt;
* Measurement&lt;br /&gt;
** Logic Analyzer&lt;br /&gt;
*** Max Sample Rate 400MHz&lt;br /&gt;
*** 16G stream / 256M buffer&lt;br /&gt;
*** 16 Channels&lt;br /&gt;
** Multimeter&lt;br /&gt;
&lt;br /&gt;
* Computings&lt;br /&gt;
** Linux server - Intel Xeon E3-1231 v3(8 cores)&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1230 v3&lt;br /&gt;
*** 24G RAM&lt;br /&gt;
** Windows desktop&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1231&lt;br /&gt;
** Linux laptop&lt;br /&gt;
*** i7-7600U&lt;br /&gt;
*** 16G RAM&lt;br /&gt;
&lt;br /&gt;
== Rule ==&lt;br /&gt;
* [[ Software version ]]&lt;br /&gt;
* [[ Software release life cycle ]]&lt;br /&gt;
== Article ==&lt;br /&gt;
* [[如何用正確的方法來寫出品質好的軟體的75條體會]]&lt;br /&gt;
* [[Tomato Firmware]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Application_-_DS1302_,RTC_module&amp;diff=576</id>
		<title>Application - DS1302 ,RTC module</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_DS1302_,RTC_module&amp;diff=576"/>
		<updated>2026-08-21T05:21:07Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: redirect mistyped title to corrected page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Application - DS1302, RTC module]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Michochip,_8-bit&amp;diff=575</id>
		<title>Michochip, 8-bit</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Michochip,_8-bit&amp;diff=575"/>
		<updated>2026-08-21T05:21:07Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: redirect mistyped title to corrected page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Microchip, 8-bit]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Aoolication_-_Greengrass&amp;diff=574</id>
		<title>Aoolication - Greengrass</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Aoolication_-_Greengrass&amp;diff=574"/>
		<updated>2026-08-21T05:21:07Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: redirect mistyped title to corrected page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Application - Greengrass]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=573</id>
		<title>首頁</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E9%A6%96%E9%A0%81&amp;diff=573"/>
		<updated>2026-08-21T05:17:57Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add category index&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= About Tommy C. Liu =&lt;br /&gt;
* Welcome to discuss outsourcing project&lt;br /&gt;
** FW/SW development&lt;br /&gt;
** Training course  &lt;br /&gt;
* E-mail: tommy.using@gmail.com&lt;br /&gt;
* LinkedIn: https://www.linkedin.com/in/chia-chuan-liu-7706b473/&lt;br /&gt;
== Browse by category ==&lt;br /&gt;
* [[:Category:Projects|Projects]] &amp;amp;mdash; hands-on builds and application notes (31)&lt;br /&gt;
* [[:Category:Boards and SoCs|Boards and SoCs]] &amp;amp;mdash; dev boards, MCUs and SoCs (23)&lt;br /&gt;
* [[:Category:Software and Tools|Software and Tools]] &amp;amp;mdash; OS, build and test tooling (10)&lt;br /&gt;
* [[:Category:Sensors and Modules|Sensors and Modules]] &amp;amp;mdash; sensors and peripheral modules (5)&lt;br /&gt;
* [[:Category:Software Engineering|Software Engineering]] &amp;amp;mdash; process and practice (3)&lt;br /&gt;
* [[:Category:Connectivity|Connectivity]] &amp;amp;mdash; buses and wireless protocols (2)&lt;br /&gt;
&lt;br /&gt;
== Running project ==&lt;br /&gt;
&lt;br /&gt;
* [[ LilyPad, nano51822]]&lt;br /&gt;
&lt;br /&gt;
* [[ ESP8266, Wi-Fi SoC]]&lt;br /&gt;
&lt;br /&gt;
* [[ ESP32 ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Nordic, nRF52 Preview DK]]&lt;br /&gt;
&lt;br /&gt;
* [[ BLE mesh ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Seeed + Hackaday, Tiny BLE]]&lt;br /&gt;
&lt;br /&gt;
* [[ ST, STM32F4 Discovery]]&lt;br /&gt;
&lt;br /&gt;
* [[ NXP, LPC1768 ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Raspberry Pi ]]&lt;br /&gt;
&lt;br /&gt;
* [[ MTK, MT7697]]&lt;br /&gt;
&lt;br /&gt;
* [[ hadoop ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Microchip, 8-bit]]&lt;br /&gt;
&lt;br /&gt;
* [[ Arduino Pro Mini, ATMega328P]]&lt;br /&gt;
&lt;br /&gt;
* [[ Bus pirate, verify]]&lt;br /&gt;
&lt;br /&gt;
* [[ 3D LED CUBE ]]&lt;br /&gt;
&lt;br /&gt;
* [[ BT speaker ]]&lt;br /&gt;
&lt;br /&gt;
* [[ TI, CC3220SF ]]&lt;br /&gt;
&lt;br /&gt;
* [[ OpenSync]]&lt;br /&gt;
&lt;br /&gt;
* [[ googletest ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Teensy 4.0 ]]&lt;br /&gt;
&lt;br /&gt;
* [[ NXP, i.MX 6UL ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Maixduino ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Hikey960 ]]&lt;br /&gt;
&lt;br /&gt;
* [[ ODROID-C4]]&lt;br /&gt;
&lt;br /&gt;
* [[ Qualcomm, HDK8250(SM8250) ]]&lt;br /&gt;
&lt;br /&gt;
== CI/CD ==&lt;br /&gt;
&lt;br /&gt;
* [[ Jenkins ]]&lt;br /&gt;
* [[ SonarQube ]]&lt;br /&gt;
&lt;br /&gt;
== Finished project ==&lt;br /&gt;
&lt;br /&gt;
* [[ Firefox ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Tiny6410 ]]&lt;br /&gt;
&lt;br /&gt;
* [[ RTD1073 ]]&lt;br /&gt;
&lt;br /&gt;
* [[ ASTAR ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Netgem ]]&lt;br /&gt;
&lt;br /&gt;
* [[ bcmAP ]]&lt;br /&gt;
&lt;br /&gt;
* [[ Eye tracker + Alexa + IoT Things ]]&lt;br /&gt;
&lt;br /&gt;
== Equipments ==&lt;br /&gt;
* Measurement&lt;br /&gt;
** Logic Analyzer&lt;br /&gt;
*** Max Sample Rate 400MHz&lt;br /&gt;
*** 16G stream / 256M buffer&lt;br /&gt;
*** 16 Channels&lt;br /&gt;
** Multimeter&lt;br /&gt;
&lt;br /&gt;
* Computings&lt;br /&gt;
** Linux server - Intel Xeon E3-1231 v3(8 cores)&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1230 v3&lt;br /&gt;
*** 24G RAM&lt;br /&gt;
** Windows desktop&lt;br /&gt;
*** Intel(R) Xeon(R) CPU E3-1231&lt;br /&gt;
** Linux laptop&lt;br /&gt;
*** i7-7600U&lt;br /&gt;
*** 16G RAM&lt;br /&gt;
&lt;br /&gt;
== Rule ==&lt;br /&gt;
* [[ Software version ]]&lt;br /&gt;
* [[ Software release life cycle ]]&lt;br /&gt;
== Article ==&lt;br /&gt;
* [[如何用正確的方法來寫出品質好的軟體的75條體會]]&lt;br /&gt;
* [[Tomato Firmware]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Connectivity&amp;diff=572</id>
		<title>分類:Connectivity</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Connectivity&amp;diff=572"/>
		<updated>2026-08-21T05:17:57Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: category description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Buses, wireless protocols and networking.&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Software_Engineering&amp;diff=571</id>
		<title>分類:Software Engineering</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Software_Engineering&amp;diff=571"/>
		<updated>2026-08-21T05:17:57Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: category description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Process, versioning and release practice.&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Sensors_and_Modules&amp;diff=570</id>
		<title>分類:Sensors and Modules</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Sensors_and_Modules&amp;diff=570"/>
		<updated>2026-08-21T05:17:56Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: category description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sensors, converters, displays and other peripheral modules.&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Software_and_Tools&amp;diff=569</id>
		<title>分類:Software and Tools</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Software_and_Tools&amp;diff=569"/>
		<updated>2026-08-21T05:17:56Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: category description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Operating systems, bootloaders, build systems and test tooling.&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Boards_and_SoCs&amp;diff=568</id>
		<title>分類:Boards and SoCs</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Boards_and_SoCs&amp;diff=568"/>
		<updated>2026-08-21T05:17:56Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: category description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Development boards, microcontrollers and systems-on-chip.&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Projects&amp;diff=567</id>
		<title>分類:Projects</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E5%88%86%E9%A1%9E:Projects&amp;diff=567"/>
		<updated>2026-08-21T05:17:56Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: category description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hands-on builds, application notes and integration experiments.&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=%E5%A6%82%E4%BD%95%E7%94%A8%E6%AD%A3%E7%A2%BA%E7%9A%84%E6%96%B9%E6%B3%95%E4%BE%86%E5%AF%AB%E5%87%BA%E5%93%81%E8%B3%AA%E5%A5%BD%E7%9A%84%E8%BB%9F%E9%AB%94%E7%9A%8475%E6%A2%9D%E9%AB%94%E6%9C%83&amp;diff=566</id>
		<title>如何用正確的方法來寫出品質好的軟體的75條體會</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=%E5%A6%82%E4%BD%95%E7%94%A8%E6%AD%A3%E7%A2%BA%E7%9A%84%E6%96%B9%E6%B3%95%E4%BE%86%E5%AF%AB%E5%87%BA%E5%93%81%E8%B3%AA%E5%A5%BD%E7%9A%84%E8%BB%9F%E9%AB%94%E7%9A%8475%E6%A2%9D%E9%AB%94%E6%9C%83&amp;diff=566"/>
		<updated>2026-08-21T05:17:55Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Software Engineering&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==如何用正確的方法來寫出品質好的軟體的75條體會==&lt;br /&gt;
===1. 你們的專案組使用源代碼管理工具了麼？===&lt;br /&gt;
應該用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的選擇是VSS。&lt;br /&gt;
&lt;br /&gt;
===2. 你們的專案組使用缺陷管理系統了麼？===&lt;br /&gt;
應該用。ClearQuest太複雜，我的推薦是BugZilla。&lt;br /&gt;
&lt;br /&gt;
===3. 你們的測試組還在用Word寫測試用例麼？===&lt;br /&gt;
不要用Word寫測試用例（Test Case）。應該用一個專門的系統，可以是Test Manager，也可以是自己開發一個ASP.NET的小網站。主要目的是Track和Browse。&lt;br /&gt;
&lt;br /&gt;
===4. 你們的專案組有沒有建立一個門戶網站？===&lt;br /&gt;
要有一個門戶網站，用來放Contact Info、Baselined Schedule、News等等。推薦Sharepoint Portal Server 2003來實現，15分鐘就搞定。買不起SPS 2003可以用WSS (Windows Sharepoint Service)。&lt;br /&gt;
&lt;br /&gt;
===5. 你們的項目組用了你能買到最好的工具麼？===&lt;br /&gt;
應該用儘量好的工具來工作。比如，應該用VS.NET而不是Notepad來寫C#。用Notepad寫程式多半只是一種炫耀。但也要考慮到經費，所以說是「你能買到最好的」。&lt;br /&gt;
&lt;br /&gt;
===6. 你們的程式員工作在安靜的環境裏麼？===&lt;br /&gt;
需要安靜環境。這點極端重要，而且要保證每個人的空間大於一定面積。&lt;br /&gt;
&lt;br /&gt;
===7. 你們的員工每個人都有一部電話麼？===&lt;br /&gt;
需要每人一部電話。而且電話最好是帶留言功能的。當然，上這麼一套帶留言電話系統開銷不小。不過至少每人一部電話要有，千萬別搞得經常有人站起來喊：「某某某電話」。《人件》裏面就強烈譴責這種做法。&lt;br /&gt;
&lt;br /&gt;
===8. 你們每個人都知道出了問題應該找誰麼？===&lt;br /&gt;
應該知道。任何一個Feature至少都應該有一個Owner，當然，Owner可以繼續Dispatch給其他人。&lt;br /&gt;
&lt;br /&gt;
===9. 你遇到過有人說「我以為…」麼？===&lt;br /&gt;
要消滅「我以為」。Never assume anything。&lt;br /&gt;
&lt;br /&gt;
===10. 你們的項目組中所有的人都坐在一起麼？===&lt;br /&gt;
需要。我反對Virtual Team，也反對Dev在美國、Test在中國這種開發方式。能坐在一起就最好坐在一起，好處多得不得了。&lt;br /&gt;
&lt;br /&gt;
===11. 你們的進度表是否反映最新開發進展情況？ ===&lt;br /&gt;
應該反映。但是，應該用Baseline的方法來管理進度表：維護一份穩定的Schedule，再維護一份最新更改。Baseline的方法也應該用於其他的Spec。Baseline是變更管理裏面的一個重要手段。&lt;br /&gt;
&lt;br /&gt;
===12. 你們的工作量是先由每個人自己估算的麼？===&lt;br /&gt;
應該讓每個人自己估算。要從下而上估算工作量，而不是從上往下分派。除非有其他原因，比如政治任務工期固定等。&lt;br /&gt;
&lt;br /&gt;
===13. 你們的開發人員從專案一開始就加班麼？===&lt;br /&gt;
不要這樣。不要一開始就搞疲勞戰。從專案一開始就加班，只能說明專案進度不合理。當然，一些對日軟體外包必須天天加班，那屬於剝削的範疇。&lt;br /&gt;
&lt;br /&gt;
===14. 你們的專案計畫中Buffer Time是加在每個小任務後面的麼？===&lt;br /&gt;
不要。Buffer Time加在每個小任務後面，很容易輕易的就被消耗掉。Buffer Time要整段的加在一個Milestone或者checkpoint前面。&lt;br /&gt;
&lt;br /&gt;
===15. 值得再多花一些時間，從95%做到100%好===&lt;br /&gt;
值得，非常值得。尤其當專案後期人困馬乏的時候，要堅持。這會給產品帶來質的區別。&lt;br /&gt;
&lt;br /&gt;
===16. 登記新缺陷時，是否寫清了重現步驟？===&lt;br /&gt;
要。這屬於Dev和Test之間的溝通手段。面對面溝通需要，詳細填寫Repro Steps也需要。&lt;br /&gt;
&lt;br /&gt;
===17. 寫新代碼前會把已知缺陷解決麼？===&lt;br /&gt;
要。每個人的缺陷不能超過10個或15個，否則必須先解決老的bug才能繼續寫新代碼。&lt;br /&gt;
&lt;br /&gt;
===18. 你們對缺陷的輕重緩急有事先的約定麼？===&lt;br /&gt;
必須有定義。Severity要分1、2、3，約定好：藍屏和Data Lost算Sev 1，Function Error算Sev 2，介面上的算Sev 3。但這種約定可以根據產品品質現狀適當進行調整。&lt;br /&gt;
&lt;br /&gt;
===19. 你們對意見不一的缺陷有三國會議麼？===&lt;br /&gt;
必須要有。要有一個明確的決策過程。這類似於CCB (Change Control Board)的概念。&lt;br /&gt;
&lt;br /&gt;
===20. 所有的缺陷都是由登記的人最後關閉的麼？===&lt;br /&gt;
Bug應該由Opener關閉。Dev不能私自關閉Bug。&lt;br /&gt;
&lt;br /&gt;
===21. 你們的程式師厭惡修改老的代碼麼？===&lt;br /&gt;
厭惡是正常的。解決方法是組織Code Review，單獨留出時間來。XP也是一個方法。&lt;br /&gt;
&lt;br /&gt;
===22. 你們項目組有Team Morale Activity麼？===&lt;br /&gt;
每個月都要搞一次，吃飯、唱歌、Outing、打球、開卡丁車等等，一定要有。不要剩這些錢。&lt;br /&gt;
&lt;br /&gt;
===23. 你們項目組有自己的Logo麼？===&lt;br /&gt;
要有自己的Logo。至少應該有自己的Codename。&lt;br /&gt;
&lt;br /&gt;
===24. 你們的員工有印有公司Logo的T-Shirt麼？===&lt;br /&gt;
要有。能增強歸屬感。當然，T-Shirt要做的好看一些，最好用80支的棉來做。別沒穿幾次就破破爛爛的。&lt;br /&gt;
&lt;br /&gt;
===25. 總經理至少每月參加次專案組會議===&lt;br /&gt;
要的。要讓team member覺得高層關注這個項目。&lt;br /&gt;
&lt;br /&gt;
===26. 你們是給每個Dev開一個分支麼？===&lt;br /&gt;
反對。Branch的管理以及Merge的工作量太大，而且容易出錯。&lt;br /&gt;
&lt;br /&gt;
===27. 有人長期不Check-In代碼麼？===&lt;br /&gt;
不可以。對大部分項目來說，最多兩三天就應該Check-In。&lt;br /&gt;
&lt;br /&gt;
===28. 在Check-In代碼時都填寫註釋了麼？===&lt;br /&gt;
要寫的，至少一兩句話，比如「解決了Bug No.225」。如果往高處拔，這也算做「配置審計」的一部分。&lt;br /&gt;
&lt;br /&gt;
===29. 有沒有設定每天Check-In的最後期限？===&lt;br /&gt;
要的，要明確Check-In Deadline。否則會Build Break。&lt;br /&gt;
&lt;br /&gt;
===30. 你們能把所有源碼一下子編譯成安裝檔嗎？ ===&lt;br /&gt;
要的。這是每日編譯（Daily Build）的基礎。而且必須要能夠做成自動的。&lt;br /&gt;
&lt;br /&gt;
===31. 你們的項目組做每日編譯麼？===&lt;br /&gt;
當然要做。有三樣東西是軟體專案/產品開發必備的：1. bug management; 2. source control; 3. daily build。&lt;br /&gt;
&lt;br /&gt;
===32. 你們公司有沒有積累一個項目風險列表？===&lt;br /&gt;
要。Risk Inventory。否則，下個專案開始的時候，又只能拍腦袋分析Risk了。&lt;br /&gt;
&lt;br /&gt;
===33. 設計越簡單越好===&lt;br /&gt;
越簡單越好。設計時候多一句話，將來可能就帶來無窮無盡的煩惱。應該從一開始就勇敢的砍。這叫scope management。&lt;br /&gt;
&lt;br /&gt;
===34. 儘量利用現有的產品、技術、代碼===&lt;br /&gt;
千萬別什麼東西都自己Coding。BizTalk和Sharepoint就是最好的例子，有這兩個作為基礎，可以把起點提高很多。或者可以儘量多用現成的Control之類的。或者儘量用XML，而不是自己去Parse一個文字檔案；儘量用RegExp，而不是自己從頭操作字串，等等等等。這就是「軟體複用」的體現。&lt;br /&gt;
&lt;br /&gt;
===35. 你們會隔一段時間就停下來夯實代碼麼？===&lt;br /&gt;
要。最好一個月左右一次。傳言去年年初Windows組在Stevb的命令下停過一個月增強安全。Btw，「夯」這個字念「hang」，第一聲。&lt;br /&gt;
&lt;br /&gt;
===36. 你們的項目組每個人都寫Daily Report麼？===&lt;br /&gt;
要寫。五分鐘就夠了，寫10句話左右，告訴自己小組的人今天我幹了什麼。一則為了溝通，二則鞭策自己（要是遊手好閒一天，自己都會不好意思寫的）。&lt;br /&gt;
&lt;br /&gt;
===37. 你們的專案經理會發出Weekly Report麼？===&lt;br /&gt;
要。也是為了溝通。內容包括目前進度，可能的風險，品質狀況，各種工作的進展等。&lt;br /&gt;
&lt;br /&gt;
===38. 你們專案組是否至少每週全體開會一次？===&lt;br /&gt;
要。一定要開會。程式師討厭開會，但每個禮拜開會時間加起來至少應該有4小時。包括team meeting, spec review meeting, bug triage meeting。千萬別大家悶頭寫code。&lt;br /&gt;
&lt;br /&gt;
===39. 你們專案組的會議、討論都有記錄麼？===&lt;br /&gt;
會前發meeting request和agenda，會中有人負責主持和記錄，會後有人負責發meeting minutes，這都是effective meeting的要點。而且，每個會議都要形成agreements和action items。&lt;br /&gt;
&lt;br /&gt;
===40. 其他部門知道你們專案組在幹什麼麼？===&lt;br /&gt;
要發一些Newsflash給整個大組織。Show your team’s value。否則，當你坐在電梯裏面，其他部門的人問：「你們在幹嘛」，你回答「ABC項目」的時候，別人全然不知，那種感覺不太好。&lt;br /&gt;
&lt;br /&gt;
===41. 通過Email進行所有正式溝通===&lt;br /&gt;
Email的好處是免得抵賴。但也要避免矯枉過正，最好的方法是先用電話和當面說，然後Email來確認。&lt;br /&gt;
&lt;br /&gt;
===42. 為項目組建立多個Mailing Group===&lt;br /&gt;
如果在AD+Exchange裏面，就建Distribution List。比如，我會建ABC Project Core Team，ABC Project Dev Team，ABC Project All Testers，ABC Project Extended Team等等。這樣發起Email來方便，而且能讓該收到email的人都收到、不該收到不被騷擾。&lt;br /&gt;
&lt;br /&gt;
===43. 每個人都知道哪裡可以找到全部的文檔麼？===&lt;br /&gt;
應該每個人都知道。這叫做知識管理（Knowledge Management）。最方便的就是把文檔放在一個集中的File Share，更好的方法是用Sharepoint。&lt;br /&gt;
&lt;br /&gt;
===44. 你做決定、做變化時，告訴大家原因了麼？===&lt;br /&gt;
要告訴大家原因。Empower team member的手段之一是提供足夠的information，這是MSF一開篇的幾個原則之一。的確如此，tell me why是人之常情，tell me why了才能有understanding。中國人做事喜歡搞限制，限制資訊，似乎能夠看到某一份檔的人就是有身份的人。大錯特錯。權威、權力，不在於是不是能access information/data，而在於是不是掌握資源。&lt;br /&gt;
&lt;br /&gt;
===45. Stay agile and expect change===&lt;br /&gt;
要這樣。需求一定會變的，已經寫好的代碼一定會被要求修改的。做好心理準備，對change不要抗拒，而是expect change。&lt;br /&gt;
&lt;br /&gt;
===46. 你們有沒有專職的軟體測試人員？===&lt;br /&gt;
要有專職測試。如果人手不夠，可以peer test，交換了測試。千萬別自己測試自己的。&lt;br /&gt;
&lt;br /&gt;
===47. 你們的測試有一份總的計畫來規定做什麼和怎麼做麼？===&lt;br /&gt;
這就是Test Plan。要不要做性能測試？要不要做Usability測試？什麼時候開始測試性能？測試通過的標準是什麼？用什麼手段，自動的還是手動的？這些問題需要用Test Plan來回答。&lt;br /&gt;
&lt;br /&gt;
===48. 你是先寫Test Case然後再測試的麼？===&lt;br /&gt;
應該如此。應該先設計再編程、先test case再測試。當然，事情是靈活的。我有時候在做第一遍測試的同時補上test case。至於先test case再開發，我不喜歡，因為不習慣，太麻煩，至於別人推薦，那試試看也無妨。&lt;br /&gt;
&lt;br /&gt;
===49. 你是否會為各種輸入組合創建測試用例？===&lt;br /&gt;
不要，不要搞邊界條件組合。當心組合爆炸。有很多test case工具能夠自動生成各種邊界條件的組合——但要想清楚，你是否有時間去運行那麼多test case。&lt;br /&gt;
&lt;br /&gt;
===50. 你們的程式師能看到測試用例麼？===&lt;br /&gt;
要。讓Dev看到Test Case吧。我們都是為了同一個目的走到一起來的：提高品質。&lt;br /&gt;
&lt;br /&gt;
===51. 你們是否隨便抓一些人來做易用性測試？=== &lt;br /&gt;
要這麼做。自己看自己寫的程式介面，怎麼看都是順眼的。這叫做審美疲勞——臭的看久了也就不臭了，不方便的永久了也就習慣了。&lt;br /&gt;
&lt;br /&gt;
===52. 你對自動測試的期望正確麼？===&lt;br /&gt;
別期望太高。依我看，除了性能測試以外，還是暫時先忘掉「自動測試」吧，忘掉WinRunner和LoadRunner吧。對於國內的軟體測試的現狀來說，只能「矯枉必須過正」了。&lt;br /&gt;
&lt;br /&gt;
===53. 你們的性能測試是等所有功能都開發完才做的麼？===&lt;br /&gt;
不能這樣。性能測試不能被歸到所謂的「系統測試」階段。早測早改正，早死早升天。&lt;br /&gt;
&lt;br /&gt;
===54. 你注意到測試中的殺蟲劑效應了麼？===&lt;br /&gt;
蟲子有抗藥性，Bug也有。發現的新Bug越來越少是正常的。這時候，最好大家交換一下測試的area，或者用用看其他工具和手法，就又會發現一些新bug了。&lt;br /&gt;
&lt;br /&gt;
===55. 你們專案組中有人能說出產品的當前整體品質情況麼？===&lt;br /&gt;
要有。當老闆問起這個產品目前品質如何，Test Lead/Manager應該負責回答。&lt;br /&gt;
&lt;br /&gt;
===56. 你們有單元測試麼？===&lt;br /&gt;
單元測試要有的。不過沒有單元測試也不是不可以，我做過沒有單元測試的專案，也做成功了——可能是僥倖，可能是大家都是熟手的關係。還是那句話，軟體工程是非常實踐、非常工程、非常靈活的一套方法，某些方法在某些情況下會比另一些方法好，反之亦然。&lt;br /&gt;
&lt;br /&gt;
===57. 你們的程式師是寫完代碼就扔過牆的麼？===&lt;br /&gt;
大忌。寫好一塊程式以後，即便不做單元測試，也應該自己先跑一跑。雖然有了專門的測試人員，做開發的人也不可以一點測試都不做。微軟還有Test Release Document的說法，程式太爛的話，測試有權踢回去。&lt;br /&gt;
&lt;br /&gt;
===58. 你們的程式中所有的函數都有輸入檢查麼？===&lt;br /&gt;
不要。雖然說做輸入檢查是write secure code的要點，但不要做太多的輸入檢查，有些內部函數之間的參數傳遞就不必檢查輸入了，省點功夫。同樣的道理，未必要給所有的函數都寫註釋。寫一部分主要的就夠了。&lt;br /&gt;
&lt;br /&gt;
===59. 產品有統一的錯誤處理機制和報錯介面麼？===&lt;br /&gt;
要有。最好能有統一的error message，然後每個error message都帶一個error number。這樣，用戶可以自己根據error number到user manual裏面去看看錯誤的具體描述和可能原因，就像SQL Server的錯誤那樣。同樣，ASP.NET也要有統一的Exception處理。可以參考有關的Application Block。&lt;br /&gt;
&lt;br /&gt;
===60. 你們有統一的代碼書寫規範麼？===&lt;br /&gt;
要有。Code Convention很多，搞一份來發給大家就可以了。當然，要是有FxCop這種工具來檢查代碼就更好了。&lt;br /&gt;
&lt;br /&gt;
===61. 你們的每個人都瞭解項目的商業意義麼？===&lt;br /&gt;
要。這是Vision的意思。別把專案只當成工作。有時候要想著自己是在為中國某某行業的資訊化作先驅者，或者時不時的告訴team member，這個項目能夠為某某某國家部門每年節省多少多少百萬的納稅人的錢，這樣就有動力了。平凡的事情也是可以有個崇高的目標的。&lt;br /&gt;
&lt;br /&gt;
===62. 產品各部分的介面和操作習慣一致麼？===&lt;br /&gt;
要這樣。要讓用戶覺得整個程式好像是一個人寫出來的那樣。&lt;br /&gt;
&lt;br /&gt;
===63. 有可以作為宣傳亮點的Cool Feature麼？===&lt;br /&gt;
要。這是增強團隊凝聚力、信心的。而且，「一俊遮百醜」，有亮點就可以掩蓋一些問題。這樣，對於客戶來說，會感覺產品從品質角度來說還是acceptable的。或者說，cool feature或者說亮點可以作為品質問題的一個事後彌補措施。&lt;br /&gt;
&lt;br /&gt;
===64. 盡可能縮短產品的啟動時間===&lt;br /&gt;
要這樣。軟體啟動時間（Start-Up time）是客戶對性能好壞的第一印象。&lt;br /&gt;
&lt;br /&gt;
===65. 不要過於注重內在品質而忽視了第一眼的外在印象===&lt;br /&gt;
程式師容易犯這個錯誤：太看重性能、穩定性、存儲效率，但忽視了外在感受。而高層經理、客戶正相反。這兩方面要兼顧，協調這些是PM的工作。&lt;br /&gt;
&lt;br /&gt;
===66. 你們根據詳細產品功能說明書做開發麼？===&lt;br /&gt;
要這樣。要有設計才能開發，這是必須的。設計文檔，應該說清楚這個產品會怎麼運行，應該採取一些講故事的方法。設計的時候千萬別鑽細節，別鑽到資料庫、代碼等具體實現裏面去，那些是後面的事情，一步步來不能著急。&lt;br /&gt;
&lt;br /&gt;
===67. 開始開發和測試之前每個人都仔細審閱功能設計麼？===&lt;br /&gt;
要做。Function Spec review是用來統一思想的。而且，review過以後形成了一致意見，將來再也沒有人可以說「你看，當初我就是反對這麼設計的，現在吃苦頭了吧」&lt;br /&gt;
&lt;br /&gt;
===68. 所有人都始終想著The Whole Image麼？===&lt;br /&gt;
要這樣。專案裏面每個人雖然都只是在製造一片葉子，但每個人都應該知道自己在製造的那片葉子所在的樹是怎麼樣子的。我反對軟體藍領，反對過分的把軟體製造看成流水線、車間。參見第61條。&lt;br /&gt;
&lt;br /&gt;
===69. Dev工作的劃分是單純縱向或橫向的麼？===&lt;br /&gt;
不能單純的根據功能模組分，或者單純根據表現層、中間層、資料庫層分。我推薦這麼做：首先根據功能模組分，然後每個「層」都有一個Owner來Review所有人的設計和代碼，保證consistency。 &lt;br /&gt;
&lt;br /&gt;
===70. 你們的程式師寫程式設計說明文檔麼？===&lt;br /&gt;
要。不過我聽說微軟的程式師1999年以前也不寫。所以說，寫不寫也不是絕對的，偷懶有時候也是可以的。參見第56條。&lt;br /&gt;
&lt;br /&gt;
===71. 你在招人面試時讓他寫一段程式麼？===&lt;br /&gt;
要的。我最喜歡讓人做字串和鏈表一類的題目。這種題目有很多迴圈、判斷、指針、遞迴等，既不偏向過於考演算法，也不偏向過於考特定的API。&lt;br /&gt;
&lt;br /&gt;
===72. 你們有沒有技術交流講座？===&lt;br /&gt;
要的。每一兩個禮拜搞一次內部的Tech Talk或者Chalk Talk吧。讓組員之間分享技術心得，這筆花錢送到外面去培訓划算。&lt;br /&gt;
&lt;br /&gt;
===73. 你們的程式師都能專注於一件事情麼？===&lt;br /&gt;
要讓程式師專注一件事。例如說，一個部門有兩個專案和10個人，一種方法是讓10個人同時參加兩個項目，每個項目上每個人都花50%時間；另一種方法是5個人去項目A，5個人去項目B，每個人都100%在某一個項目上。我一定選後面一種。這個道理很多人都懂，但很多領導實踐起來就把屬下當成可以任意拆分的資源了。&lt;br /&gt;
&lt;br /&gt;
===74. 你們的程式師會誇大完成某項工作所需要的時間麼？&lt;br /&gt;
會的，這是常見的，尤其會在項目後期誇大做某個change所需要的時間，以次來抵制change。解決的方法是坐下來慢慢磨，磨掉程式師的逆反心理，一起分析，並把估算時間的顆粒度變小。&lt;br /&gt;
&lt;br /&gt;
===75. 儘量不要用Virtual Heads===&lt;br /&gt;
最好不要用Virtual Heads。Virtual heads意味著resource is not secure，shared resource會降低resource的工作效率，容易增加出錯的機會，會讓一心二用的人沒有太多時間去review spec、review design。一個dedicated的人，要強過兩個只能投入50%時間和精力的人。我是吃過虧的：7個part time的tester，發現的Bug和幹的活，加起來還不如兩個full-time的。參見第73條。73條是針對程式師的，75條是針對Resource Manager的。&lt;br /&gt;
&lt;br /&gt;
[[Category:Software Engineering]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=U-boot&amp;diff=565</id>
		<title>U-boot</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=U-boot&amp;diff=565"/>
		<updated>2026-08-21T05:17:55Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Software and Tools&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== source ==&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;git clone https://github.com/gonzoua/u-boot-pi.git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;svn co file:///var/svn/rpi_uboot/trunk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== toolchain ==&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;git clone https://github.com/raspberrypi/tools&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== build ==&lt;br /&gt;
* export ARCH=arm&lt;br /&gt;
* export CROSS_COMPILE=arm-linux-gnueabi-&lt;br /&gt;
* make rpi_b&lt;br /&gt;
&lt;br /&gt;
== prepare SD card for your u-boot ==&lt;br /&gt;
* ./tools/mkimage/imagetool-uncompressed.py u-boot-pi/u-boot.bin&lt;br /&gt;
* cp kernel.img RASPBIAN_BOOT_PARTATION&lt;br /&gt;
&lt;br /&gt;
== boot to kernel from USB ==&lt;br /&gt;
* prepare your zImage in usb disk, and you should try another usb port if not working while load to ram&lt;br /&gt;
* U-Boot&amp;gt; usb start&lt;br /&gt;
** use usb sub-system to check avaliable dev and part&lt;br /&gt;
*** U-Boot&amp;gt; usb dev&lt;br /&gt;
*** U-Boot&amp;gt; usb part {dev}&lt;br /&gt;
** use ext2load to check where your zImage existed or not&lt;br /&gt;
*** U-Boot&amp;gt; ext2ls usb {dev}:{part}&lt;br /&gt;
* U-Boot&amp;gt; ext2load usb {dev}:{part} ${loadaddr} zImage&lt;br /&gt;
* U-Boot&amp;gt; bootz ${loadaddr}&lt;br /&gt;
&lt;br /&gt;
==reference ==&lt;br /&gt;
* [http://elinux.org/RPi_U-Boot RPi U-Boot]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software and Tools]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Tomato_Firmware&amp;diff=564</id>
		<title>Tomato Firmware</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Tomato_Firmware&amp;diff=564"/>
		<updated>2026-08-21T05:17:55Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Software and Tools&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox software&lt;br /&gt;
|name= Tomato Firmware&lt;br /&gt;
|logo= [[Image:Tuxt.png]]&lt;br /&gt;
|screenshot= [[File:Tomato Firmware - Bandwidth Real Time.PNG|250px]]&lt;br /&gt;
|caption= Real time bandwidth view, running on a [[AirStation|Buffalo AirStation]] [[AirStation#WHR_series|WHR-HP-G54]] as rendered by the [[Opera (web browser)|Opera]] web browser&lt;br /&gt;
&amp;lt;!-- |collapsible= yes --&amp;gt;&lt;br /&gt;
|Description= [[Open Source]] [[RouterOS]]&lt;br /&gt;
|developer= &amp;lt;br /&amp;gt;Jonathan Zarate&lt;br /&gt;
|latest release version= 1.28&lt;br /&gt;
|latest release date= {{release date and age|2010|6|28}}&lt;br /&gt;
|latest preview version=&lt;br /&gt;
|latest preview date=&lt;br /&gt;
|operating system= Linux&lt;br /&gt;
|genre= Routing software&lt;br /&gt;
|license= [[Freeware]] &amp;lt;br /&amp;gt;Backend: [[GNU General Public License]] &amp;lt;br /&amp;gt;Frontend: proprietary&lt;br /&gt;
|website= [http://www.polarcloud.com/tomato www.polarcloud.com/tomato]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tomato Firmware&#039;&#039;&#039; is a [[Free software|free]] [[HyperWRT]]-based, [[Linux]] core [[firmware]] distribution for mostly [[Broadcom]] [[chipset]] based [[wireless router]]s, most notably the older-model [[Linksys]] [[WRT54G]] (including the [[WRT54GL]] and [[WRT54GS]]), [[AirStation|Buffalo AirStation]], [[Asus Routers]] and [[Netgear]]&#039;s [[WNR3500L]]. Among other notable features is the user interface, which makes heavy use of [[AJAX]] as well as an [[Scalable Vector Graphics|SVG]]-based graphical bandwidth monitor.&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
&lt;br /&gt;
* Interactive [[Ajax framework|Ajax]] based GUI using [[scalable vector graphics|SVG]] and CSS-based color schemes (allowing [[Graphical user interface|GUI]] look and feel changes).&lt;br /&gt;
* [[Command-line interface|CLI]] access ([[BusyBox]]) via [[TELNET]] or [[Secure Shell|SSH]] (using [[Dropbear (software)|Dropbear]]).&lt;br /&gt;
* [[DHCP]] server.&lt;br /&gt;
* DNS forwarder (using [[Dnsmasq]]).&lt;br /&gt;
* Netfilter/iptables with customizable settings, IPP2P and l7-filter.&lt;br /&gt;
* [[Wake-on-LAN]].&lt;br /&gt;
* Advanced [[Quality of service|QoS]]: 10 unique QoS classes defined, real-time graphs display prioritized traffic with traffic class details.&lt;br /&gt;
* Client Bandwidth Control via QoS classes&lt;br /&gt;
* Bandwidth graphing/statistics.&lt;br /&gt;
* Wireless modes:&lt;br /&gt;
** Access point ([[Wireless access point|AP]])&lt;br /&gt;
** Wireless client station (STA)&lt;br /&gt;
** Wireless ethernet (WET) bridge&lt;br /&gt;
** Wireless distribution system ([[Wireless Distribution System|WDS]] aka wireless bridging)&lt;br /&gt;
** Simultaneous AP and WDS (aka wireless repeating).&lt;br /&gt;
* [[Dynamic DNS]] service with ezUpdate and services extended for more providers.&lt;br /&gt;
* Syslog viewable through the GUI (also downloadable).&lt;br /&gt;
* SES button control.&lt;br /&gt;
* [[JFFS2]].&lt;br /&gt;
* [[Server Message Block|CIFS]] client.&lt;br /&gt;
* [[Wireless LAN]] Radio power of adjustment, antenna selection, and 14 wireless channels.&lt;br /&gt;
* &#039;Boot wait&#039; protection (increase the time slot for uploading firmware via the boot loader).&lt;br /&gt;
* Advanced [[port forwarding]], redirection, and triggering with [[Universal Plug and Play|UPnP]] and [[NAT Port Mapping Protocol|NAT-PMP]].&lt;br /&gt;
* Advanced user access restrictions.&lt;br /&gt;
* Init, Shutdown, [[Firewall (computing)|Firewall]], and WAN Up [[Scripting language|script]]s.&lt;br /&gt;
* Uptime, load average, and free memory status.&lt;br /&gt;
* Minimal reboots - Very few configuration changes require a reboot.&lt;br /&gt;
* Wireless survey page to view other networks in your neighborhood.&lt;br /&gt;
* More comprehensive dashboard than stock firmware: displays signal strengths of wireless client devices, reveals UPnP mappings.&lt;br /&gt;
===Feature comparison===&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border=1 cellspacing=0 cellpadding=3 class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-style=&amp;quot;background-color:#eee;&amp;quot;&lt;br /&gt;
! Mod Name&lt;br /&gt;
! Base Tomato&amp;lt;br/&amp;gt;Version&lt;br /&gt;
! Min Flash MB&lt;br /&gt;
! Max&amp;lt;br/&amp;gt;Connections&lt;br /&gt;
! SpeedMod&lt;br /&gt;
! SFTP&lt;br /&gt;
! VPN&amp;lt;br/&amp;gt;Client&lt;br /&gt;
! VPN&amp;lt;br/&amp;gt;Server&lt;br /&gt;
! SNMP&lt;br /&gt;
! SD Card&amp;lt;br/&amp;gt;Support&lt;br /&gt;
! USB&amp;lt;br/&amp;gt;Support&lt;br /&gt;
! VLANs&lt;br /&gt;
! IPv6&amp;lt;br/&amp;gt;Support&lt;br /&gt;
|-&lt;br /&gt;
! Tomato&lt;br /&gt;
| {{yes|1.28}}&lt;br /&gt;
| 4MB&lt;br /&gt;
| {{yes|4096}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! Tomato ND&lt;br /&gt;
| {{yes|1.28}}&lt;br /&gt;
| 4MB&lt;br /&gt;
| {{yes|4096}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! TomatoUSB &amp;lt;ref&amp;gt;[http://tomatousb.org/ TomatoUSB] release announcement.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.linksysinfo.org/forums/showthread.php?t=60185 Teddy Bear] Mod release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{yes|1.28&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
| 4MB/8MB&lt;br /&gt;
| {{yes|10240}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes|OpenVPN}}&lt;br /&gt;
| {{yes|OpenVPN}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes|Print, NAS}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! TomatoVPN &amp;lt;ref&amp;gt;[http://tomatovpn.keithmoyer.com/search/label/release TomatoVPN] release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{yes|1.27&amp;lt;sup&amp;gt;***&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes|OpenVPN}}&lt;br /&gt;
| {{yes|OpenVPN}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! hardc0re Mod &amp;lt;ref&amp;gt;[http://touristinparadise.blogspot.com/2008/04/linksys-wrt54gl-routers-improving.html hardc0re] release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{yes|1.28}}&lt;br /&gt;
| 4MB&lt;br /&gt;
| {{yes|8192+}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! jyavenard Mod &amp;lt;ref&amp;gt;[http://www.linksysinfo.org/forums/showpost.php?p=336696&amp;amp;postcount=28 jyavenard] release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{no|1.23}}&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| {{yes|PPTP}}&lt;br /&gt;
|&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! Neorouter Mod &amp;lt;ref&amp;gt;[http://www.neorouter.com/forum/viewtopic.php?f=2&amp;amp;t=1015 Neorouter] release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{no|1.25&amp;lt;sup&amp;gt;***&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| {{yes|&#039;&#039;proprietary&#039;&#039;}}&lt;br /&gt;
| {{yes|&#039;&#039;proprietary&#039;&#039;}}&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| {{Yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! roadkill Mod &amp;lt;ref&amp;gt;[http://www.linksysinfo.org/forums/showthread.php?t=53233 roadkill] release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{no|1.21}}&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes|OpenVPN}}&lt;br /&gt;
| {{yes|OpenVPN}}&lt;br /&gt;
|&lt;br /&gt;
| {{yes|SD, MMC}}&lt;br /&gt;
|&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! slodki Mod &amp;lt;ref&amp;gt;[http://gemini.net.pl/~slodki/tomato-sdhc.html slodki] release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{yes|1.25&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
| 4MB&lt;br /&gt;
| {{yes|4096}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes|OpenVPN}}&lt;br /&gt;
| {{yes|OpenVPN}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes|SDHC, MMC}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! Thor Mod &amp;lt;ref&amp;gt;[http://www.linksysinfo.org/forums/showthread.php?t=61552 Thor] release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{yes|1.25&amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
| 8MB&lt;br /&gt;
| {{yes|8192}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| FTP only&lt;br /&gt;
| {{yes|OpenVPN}}&lt;br /&gt;
| {{yes|OpenVPN}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes|SDHC, MMC}}&lt;br /&gt;
| {{yes|NAS}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! Trzepako Mod &amp;lt;ref&amp;gt;[http://www.linksysinfo.org/forums/showthread.php?t=58722 Trzepako] release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{no|1.21}}&lt;br /&gt;
| 4MB&lt;br /&gt;
| &lt;br /&gt;
| {{yes}}&lt;br /&gt;
|&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! Victek Mod. Tomato RAF &amp;lt;ref&amp;gt;[http://www.linksysinfo.org/forums/showthread.php?t=62248 Victek Mod. Tomato RAF] release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{yes|1.25&amp;lt;sup&amp;gt;***&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
| 4MB&lt;br /&gt;
| {{yes|8192}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
! Tomato DualWAN Mod &amp;lt;ref&amp;gt;[http://www.dualwan.cn/index.php/download/category/12-1.23 Tomato DualWAN Mod] release announcement.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| {{yes|1.23&amp;lt;sup&amp;gt;***&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
| 4MB/8MB&lt;br /&gt;
| {{yes|10240}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes|PPTP}}&lt;br /&gt;
| {{yes|PPTP}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes|NAS, 3G USB Modem}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|}&lt;br /&gt;
{|cellspacing=3 cellpadding=0&lt;br /&gt;
|-&lt;br /&gt;
 | align=&amp;quot;right&amp;quot; | &amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&lt;br /&gt;
 | Tomato standard only&lt;br /&gt;
|-&lt;br /&gt;
 | align=&amp;quot;right&amp;quot; | &amp;lt;sup&amp;gt;**&amp;lt;/sup&amp;gt;&lt;br /&gt;
 | Tomato ND (New Driver) only&lt;br /&gt;
|-&lt;br /&gt;
 | align=&amp;quot;right&amp;quot; | &amp;lt;sup&amp;gt;***&amp;lt;/sup&amp;gt;&lt;br /&gt;
 | Tomato standard and ND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==License==&lt;br /&gt;
&lt;br /&gt;
Tomato is based on the GPL source code released by Linksys, but includes proprietary binary modules from the chipset manufacturer Broadcom. Portions of the code are licensed under the [[GNU General Public License]], but the source code for the user interface is under a more restrictive license which forbids use without the author&#039;s permission.&lt;br /&gt;
&lt;br /&gt;
==Compatible routers==&lt;br /&gt;
{{Main|wikibooks:Tomato (firmware)}}&lt;br /&gt;
&lt;br /&gt;
Tomato is compatible with many [[Broadcom]]-based routers, including [[Asus routers]], [[Buffalo Technology|Buffalo]] [[AirStation]], and the [[Linksys WRT54G series]].  Detailed information is available from [[wikibooks:Tomato (firmware)|the Wikibooks page on Tomato]].  WRT54G models of version 5 and newer are not compatible.  Tomato is generally recommended by Community Forums for Linksys Devices, Ex.. LinksysInfo.org, for users who desire an alternative to [[DD-WRT]], while not offering as much customization as the advanced [[OpenWrt]] firmware. Support for the Asus RT-N16, RT-N12, Linksys WRT-160Nv3 and Netgear WNR3500L/v2 has been added via a new [https://sourceforge.net/projects/tomatousb/ firmware modification] (based on Linux kernel 2.6).&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
{{Portal|Free software}}&lt;br /&gt;
&lt;br /&gt;
* [[List of wireless router firmware projects]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist|2}}&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
{{en:wikibooks|title=Tomato Firmware}}&lt;br /&gt;
{{Commons category|Tomato (firmware)}}&lt;br /&gt;
* [http://www.polarcloud.com/tomato Tomato Firmware] Official Homepage&lt;br /&gt;
* [http://www.linksysinfo.org/forums/showthread.php?t=57933 Tomato Modifications] Forum and listings of Tomato additions/distributions&lt;br /&gt;
* [http://en.wikibooks.org/wiki/Tomato_(firmware) Tomato Documentation] a Wikibook&lt;br /&gt;
* [http://lampiweb.com/tomato/about.htm Virtual Tomato GUI (ver. 1.07)]&lt;br /&gt;
* [http://lampiweb.com/virtual/Tomato_RAF/index.html Virtual Tomato RAF (victek mod)]&lt;br /&gt;
* [[Revision3]] - [[Systm]] - [http://revision3.com/systm/tomato/ Episode 71 on Tomato]&lt;br /&gt;
&lt;br /&gt;
{{Routing software}}&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Tomato (Firmware)}}&lt;br /&gt;
[[da:Tomato firmware]]&lt;br /&gt;
[[de:Tomato (Firmware)]]&lt;br /&gt;
[[pl:Tomato]]&lt;br /&gt;
[[zh:Tomato]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software and Tools]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Tiny6410&amp;diff=563</id>
		<title>Tiny6410</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Tiny6410&amp;diff=563"/>
		<updated>2026-08-21T05:17:54Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Project info==&lt;br /&gt;
Customer: internal&amp;lt;br&amp;gt;&lt;br /&gt;
Product: ARM11 evalution board&amp;lt;br&amp;gt;&lt;br /&gt;
Chip: Samsung S3C6410 / 533MHZ&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SVN info==&lt;br /&gt;
[[image:Tiny6410_REPO_20110926_01.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;camera&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/tiny6410/branches/camera&lt;br /&gt;
&lt;br /&gt;
==Release info==&lt;br /&gt;
==camera==&lt;br /&gt;
==== tiny6410-camera-0.0.0.1 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350OS/tags/&lt;br /&gt;
===== release date =====&lt;br /&gt;
===== release note =====&lt;br /&gt;
* disable preview thread&lt;br /&gt;
* add 176x144 size for USB Camera C200&lt;br /&gt;
* combine V4l2 process into picture thread&lt;br /&gt;
* store image in temp file and re-open to get image data for Camera.apk&lt;br /&gt;
(please create tommy_test.jpg in root for r/w, and need to optimize this process)&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Teensy_4.0&amp;diff=562</id>
		<title>Teensy 4.0</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Teensy_4.0&amp;diff=562"/>
		<updated>2026-08-21T05:17:54Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Technical Specifications ==&lt;br /&gt;
* ARM Cortex-M7 at 600 MHz&lt;br /&gt;
* 1024K RAM (512K is tightly coupled)&lt;br /&gt;
* 2048K Flash (64K reserved for recovery &amp;amp; EEPROM emulation)&lt;br /&gt;
* 2 USB ports, both 480 MBit/sec&lt;br /&gt;
* 3 CAN Bus (1 with CAN FD)&lt;br /&gt;
* 2 I2S Digital Audio&lt;br /&gt;
* 1 S/PDIF Digital Audio&lt;br /&gt;
* 1 SDIO (4 bit) native SD&lt;br /&gt;
* 3 SPI, all with 16 word FIFO&lt;br /&gt;
* 3 I2C, all with 4 byte FIFO&lt;br /&gt;
* 7 Serial, all with 4 byte FIFO&lt;br /&gt;
* 32 general purpose DMA channels&lt;br /&gt;
* 31 PWM pins&lt;br /&gt;
* 40 digital pins, all interrrupt capable&lt;br /&gt;
* 14 analog pins, 2 ADCs on chip&lt;br /&gt;
* Cryptographic Acceleration&lt;br /&gt;
* Random Number Generator&lt;br /&gt;
* RTC for date/time&lt;br /&gt;
* Programmable FlexIO&lt;br /&gt;
* Pixel Processing Pipeline&lt;br /&gt;
* Peripheral cross triggering&lt;br /&gt;
* Power On/Off management&lt;br /&gt;
* FPU support&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Teensy 4.0&#039;s Cortex-M7 processor includes a floating point unit (FPU) which supports both 64 bit &amp;quot;double&amp;quot; and 32 bit &amp;quot;float&amp;quot;. &lt;br /&gt;
With M4&#039;s FPU on Teensy 3.5 &amp;amp; 36, and also Atmel SAMD51 chips, only 32 bit float is hardware accelerated. &lt;br /&gt;
Any use of double, double functions like log(), sin(), cos() means slow software implemented math. &lt;br /&gt;
Teensy 4.0 executes all of these with FPU hardware.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIN assignment == &lt;br /&gt;
[[File:Card10a_rev1_web.png|500px|top side]]&lt;br /&gt;
[[File:Card10b_rev1_web.png|500px|back side]]&lt;br /&gt;
&lt;br /&gt;
== Schematic == &lt;br /&gt;
[[File:Schematic40.png|500px|Teensy 4.0 shematic]]&lt;br /&gt;
[[File:Schematic41.png|500px|Teensy 4.1 shematic]]&lt;br /&gt;
&lt;br /&gt;
== Memory Map ==&lt;br /&gt;
* Teensy 4.0 has 1 Mbyte of RAM and 2 Mbyte of Flash memory. The RAM is divided into 2 physically separate banks.&lt;br /&gt;
[[File:Teensy4_memory.png|Teensy 4.0 Memory Layout]]&lt;br /&gt;
&lt;br /&gt;
== Teensyduino IDE installation ==&lt;br /&gt;
* Download &amp;amp; Extract Arduino&lt;br /&gt;
* Install udev Rules&lt;br /&gt;
** The udev rule file gives non-root users permission to use the Teensy devices (serial, HID, etc). More Linux tips below.&lt;br /&gt;
&lt;br /&gt;
sudo cp 49-teensy.rules /etc/udev/rules.d/&lt;br /&gt;
&lt;br /&gt;
== PlatformIO ==&lt;br /&gt;
* Install VSCode(Visual Studio Code)&lt;br /&gt;
** Install PlatformIO from extensions&lt;br /&gt;
&lt;br /&gt;
== MCUXpresso IDE ==&lt;br /&gt;
&lt;br /&gt;
== MCUXpresso Config Tools ==&lt;br /&gt;
&lt;br /&gt;
== MCUXpresso SDK ==&lt;br /&gt;
&lt;br /&gt;
== NXP SDK ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export ARMGCC_DIR=$TOOLCHAIN_PATH&lt;br /&gt;
cd SDK_2.7.0_EVK-MIMXRT1060/boards/evkmimxrt1060/driver_examples/gpio/led_output/armgcc&lt;br /&gt;
chmod 777 build_all.sh&lt;br /&gt;
./build_all.sh&lt;br /&gt;
arm-none-eabi-objcopy  -O ihex flexspi_nor_release/igpio_led_output.elf flexspi_nor_release/igpio_led_output.hex&lt;br /&gt;
teensy_loader_cli -v -w --mcu=imxrt1062 flexspi_nor_release/igpio_led_output.hex&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* For led_output example, need to modify gpio mapping in board.h (refer to schematic)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*! @brief The USER_LED used for board */&lt;br /&gt;
#define LOGIC_LED_ON (0U)&lt;br /&gt;
#define LOGIC_LED_OFF (1U)&lt;br /&gt;
#ifndef BOARD_USER_LED_GPIO&lt;br /&gt;
#define BOARD_USER_LED_GPIO GPIO2  &amp;lt;----- modify&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef BOARD_USER_LED_GPIO_PIN&lt;br /&gt;
#define BOARD_USER_LED_GPIO_PIN (3U)  &amp;lt;----- modify&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Upload binary standalone ==&lt;br /&gt;
* teensy_loader_cli -mmcu=imxrt1062 -w evkmimxrt1060_freertos_hello_teensy.hex -v&lt;br /&gt;
&lt;br /&gt;
== SPI Timing ==&lt;br /&gt;
* CS_OFF around 40 ns&lt;br /&gt;
[[File:Teensy_4_spi_cs.jpg|400px|SPI CS_OFF width]]&lt;br /&gt;
&lt;br /&gt;
* SPI CLK in 16M&lt;br /&gt;
[[File:Teensy_4_spi_16M.jpg|400px|SPI CLK in 16M]]&lt;br /&gt;
&lt;br /&gt;
* Sampling rate evaluation&lt;br /&gt;
** CS_ON+CS_OFF around 1.46 us&lt;br /&gt;
** For 32 Ch in 16M SPI_CLK, the sampling rate for each channel would be:&lt;br /&gt;
*** (1000000/1.46*32)/1000=21.4KS&lt;br /&gt;
&lt;br /&gt;
== SDIO 4 bit ==&lt;br /&gt;
[[File:Teensy_4_sdio_4_bit.JPG|500px|SDIO4 bit mode]]&lt;br /&gt;
* Format SD before running &lt;br /&gt;
* Change pin define in code&lt;br /&gt;
** SD.begin(BUILTIN_SDCARD)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  SD card datalogger&lt;br /&gt;
 &lt;br /&gt;
 This example shows how to log data from three analog sensors &lt;br /&gt;
 to an SD card using the SD library.&lt;br /&gt;
 	&lt;br /&gt;
 The circuit:&lt;br /&gt;
 * analog sensors on analog ins 0, 1, and 2&lt;br /&gt;
 * SD card attached to SPI bus as follows:&lt;br /&gt;
 ** MOSI - pin 11, pin 7 on Teensy with audio board&lt;br /&gt;
 ** MISO - pin 12&lt;br /&gt;
 ** CLK - pin 13, pin 14 on Teensy with audio board&lt;br /&gt;
 ** CS - pin 4,  pin 10 on Teensy with audio board&lt;br /&gt;
 &lt;br /&gt;
 created  24 Nov 2010&lt;br /&gt;
 modified 9 Apr 2012&lt;br /&gt;
 by Tom Igoe&lt;br /&gt;
 &lt;br /&gt;
 This example code is in the public domain.&lt;br /&gt;
 	 &lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;SD.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// On the Ethernet Shield, CS is pin 4. Note that even if it&#039;s not&lt;br /&gt;
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,&lt;br /&gt;
// 53 on the Mega) must be left as an output or the SD library&lt;br /&gt;
// functions will not work.&lt;br /&gt;
&lt;br /&gt;
// change this to match your SD shield or module;&lt;br /&gt;
// Arduino Ethernet shield: pin 4&lt;br /&gt;
// Adafruit SD shields and modules: pin 10&lt;br /&gt;
// Sparkfun SD shield: pin 8&lt;br /&gt;
// Teensy audio board: pin 10&lt;br /&gt;
// Teensy 3.5 &amp;amp; 3.6 on-board: BUILTIN_SDCARD&lt;br /&gt;
// Wiz820+SD board: pin 4&lt;br /&gt;
// Teensy 2.0: pin 0&lt;br /&gt;
// Teensy++ 2.0: pin 20&lt;br /&gt;
//const int chipSelect = 36;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  //UNCOMMENT THESE TWO LINES FOR TEENSY AUDIO BOARD:&lt;br /&gt;
  //SPI.setMOSI(37);  // Audio shield has MOSI on pin 7&lt;br /&gt;
  //SPI.setSCK(36);  // Audio shield has SCK on pin 14&lt;br /&gt;
  &lt;br /&gt;
 // Open serial communications and wait for port to open:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
   while (!Serial) {&lt;br /&gt;
    ; // wait for serial port to connect. Needed for Leonardo only&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Initializing SD card...&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  // see if the card is present and can be initialized:&lt;br /&gt;
  if (!SD.begin(BUILTIN_SDCARD)) {&lt;br /&gt;
    Serial.println(&amp;quot;Card failed, or not present&amp;quot;);&lt;br /&gt;
    // don&#039;t do anything more:&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;card initialized.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  // make a string for assembling the data to log:&lt;br /&gt;
  String dataString = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  // read three sensors and append to the string:&lt;br /&gt;
  for (int analogPin = 0; analogPin &amp;lt; 3; analogPin++) {&lt;br /&gt;
    int sensor = analogRead(analogPin);&lt;br /&gt;
    dataString += String(sensor);&lt;br /&gt;
    if (analogPin &amp;lt; 2) {&lt;br /&gt;
      dataString += &amp;quot;,&amp;quot;; &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // open the file. note that only one file can be open at a time,&lt;br /&gt;
  // so you have to close this one before opening another.&lt;br /&gt;
  File dataFile = SD.open(&amp;quot;datalog.txt&amp;quot;, FILE_WRITE);&lt;br /&gt;
&lt;br /&gt;
  // if the file is available, write to it:&lt;br /&gt;
  if (dataFile) {&lt;br /&gt;
    dataFile.println(dataString);&lt;br /&gt;
    dataFile.close();&lt;br /&gt;
    // print to the serial port too:&lt;br /&gt;
    Serial.println(dataString);&lt;br /&gt;
  }  &lt;br /&gt;
  // if the file isn&#039;t open, pop up an error:&lt;br /&gt;
  else {&lt;br /&gt;
    Serial.println(&amp;quot;error opening datalog.txt&amp;quot;);&lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[application - ADS1256 ]] ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=TI,_CC3220SF&amp;diff=561</id>
		<title>TI, CC3220SF</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=TI,_CC3220SF&amp;diff=561"/>
		<updated>2026-08-21T05:17:54Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Ti-cc3220sf-launchxl-large.jpg|CC3220SF LAUNCHXL]]&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This guide is intended to assist users in the initial setup and demonstration of running their first sample application. The guide explains how to install the SimpleLinkTM CC3220TM SDK and lists the various other tools required to get started with the first application&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
The user is expected to have the following:&lt;br /&gt;
&lt;br /&gt;
* SimpleLink CC3220 LaunchPad&lt;br /&gt;
* At least one of the following IDE supported by the SimpleLink CC3220 SDK:&lt;br /&gt;
** CCS 7.3.0&lt;br /&gt;
** IAR for ARM 8.11.1 or higher&lt;br /&gt;
* GNU ARM Embedded Toolchain, 6-2017-q1&lt;br /&gt;
* FreeRTOSv9.0.0 (Optional)&lt;br /&gt;
** The SimpleLink CC3220 SDK does not deliver FreeRTOS sources.&lt;br /&gt;
** If the User wants to use FreeRTOS with the SDK, the user is expected to download the FreeRTOS sources from www.freertos.org&lt;br /&gt;
*TI Uniflash&lt;br /&gt;
&lt;br /&gt;
== SDK - Download and Installation ==&lt;br /&gt;
* You can also download the SimpleLink CC3220 SDK from TI Resource Explorer or the software product page on TI’s website.&lt;br /&gt;
&lt;br /&gt;
== Compile ==&lt;br /&gt;
* Running CCS&lt;br /&gt;
* Import the existing example from SDK&lt;br /&gt;
&lt;br /&gt;
== a:freeRTOS online example ==&lt;br /&gt;
[[File:ConnectToAWSIoT.jpg|thumb|Connect To AWS IoT]]&lt;br /&gt;
* Go to https://console.aws.amazon.com/iot/home?region=us-east-1#/software/freertos&lt;br /&gt;
* Software configurations&lt;br /&gt;
** Hardware platform - CC3220SF-LAUNCHXL&lt;br /&gt;
** Libraries &amp;amp; Demo projects&lt;br /&gt;
*** MQTT&lt;br /&gt;
*** Greengrass Discovery&lt;br /&gt;
*** OTA Updates&lt;br /&gt;
*** thing shadow&lt;br /&gt;
**** Edit AmazonFreeRTOS/demos/common/include/aws_clientcredential.h for &lt;br /&gt;
***** MQTT Broker endpoint, &lt;br /&gt;
***** clientcredentialIOT_THING_NAME&lt;br /&gt;
***** clientcredentialWIFI_SSID&lt;br /&gt;
***** clientcredentialWIFI_PASSWORD&lt;br /&gt;
** Give it a name and Create&lt;br /&gt;
&lt;br /&gt;
== Program FW ==&lt;br /&gt;
[[File:UserFile.jpg|thumb|User File]]&lt;br /&gt;
[[File:ImageCreator.jpg|thumb| Generate Image]]&lt;br /&gt;
* Running UniFlash&lt;br /&gt;
* User Files&lt;br /&gt;
** Add file&lt;br /&gt;
*** simplelink_cc32xx_sdk_1_02_02_00\tools\cc32xx_tools\certificate-playground\dummy-root-ca-cert&lt;br /&gt;
*** Select &amp;quot;Failsafe&amp;quot;&lt;br /&gt;
** Select MCU Image&lt;br /&gt;
*** YOUR_APP.bin&lt;br /&gt;
*** Select &amp;quot;Failsafe&amp;quot;, &amp;quot;Secure&amp;quot; and &amp;quot;Public Write&amp;quot;&lt;br /&gt;
*** Private key&lt;br /&gt;
**** simplelink_cc32xx_sdk_1_02_02_00\tools\cc32xx_tools\certificate-playground\dummy-root-ca-cert-key&lt;br /&gt;
*** Select &amp;quot;dummy-root-ca-cert&amp;quot; from &amp;quot;Certificate File name&amp;quot; dropdown menu&lt;br /&gt;
* Service Packed&lt;br /&gt;
** simplelink_cc32xx_sdk_1_02_02_00\tools\cc32xx_tools\servicepack-cc3x20\sp_3.2.0.0_2.0.0.0_2.2.0.4.bin&lt;br /&gt;
* Trusted Root Certificate Catalog&lt;br /&gt;
** Source File&lt;br /&gt;
*** simplelink_cc32xx_sdk_1_02_02_00\tools\cc32xx_tools\certificate-playground\certcatalogPlayGround20160911.lst&lt;br /&gt;
** Signature Source File&lt;br /&gt;
*** simplelink_cc32xx_sdk_1_02_02_00\tools\cc32xx_tools\certificate-playground\certcatalogPlayGround20160911.lst.signed.bin&lt;br /&gt;
* Generate Image&lt;br /&gt;
** Save Image as .sli and program later, or&lt;br /&gt;
** Program Image(Create &amp;amp; Program)&lt;br /&gt;
&lt;br /&gt;
== Console ==&lt;br /&gt;
* /dev/ttyACM0, 115200 8N1&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [http://dev.ti.com/tirex/#/, TI Resource Explorer]&lt;br /&gt;
* [https://console.aws.amazon.com/iot/home?region=us-east-1#/software/freertos, a:freeRTOS for MCUs]&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Software_version&amp;diff=560</id>
		<title>Software version</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Software_version&amp;diff=560"/>
		<updated>2026-08-21T05:17:53Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Software Engineering&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Schemes==&lt;br /&gt;
A variety of version numbering schemes have been created to keep track of different versions of a piece of software. The ubiquity (the ability to be everywhere at the same time) of computers has also led to these schemes being used in contexts outside computing.&lt;br /&gt;
&lt;br /&gt;
===Sequence-based identifiers===&lt;br /&gt;
[[Image:VersionNumbers.svg|right|Version number sequence|1000x500px]]&lt;br /&gt;
In sequence-based software versioning schemes, each [[software release]] is assigned a unique identifier that consists of one or more sequences of numbers or letters. This is the extent of the commonality, however: schemes vary widely in areas such as the quantity of sequences, the attribution of meaning to individual sequences, and the means of incrementing the sequences.&lt;br /&gt;
&lt;br /&gt;
====Change significance====&lt;br /&gt;
In some schemes, sequence-based identifiers are used to convey the significance of changes between releases: changes are classified by significance level, and the decision of which sequence to change between releases is based on the significance of the changes from the previous release, whereby the first sequence is changed for the most significant changes, and changes to sequences after the first represent changes of decreasing significance.&lt;br /&gt;
&lt;br /&gt;
For instance, in a scheme that uses a four-sequence identifier, the first sequence may be incremented only when the code is completely rewritten, while a change to the user interface or the documentation may only warrant a change to the fourth sequence.&lt;br /&gt;
&lt;br /&gt;
This practice permits users (or potential adopters) to evaluate how much real-world testing a given software release has undergone. If changes are made between, say, 1.3rc4 and the production release of 1.3, then that release, which asserts that it has had a production-grade level of testing in the real world, in fact contains changes which have not necessarily been tested in the real world &#039;&#039;at all&#039;&#039;.{{Clarify|January 2010|date=January 2010}} This approach commonly permits the third level of numbering (&amp;quot;change&amp;quot;), but does not apply this level of rigor to changes in that number: 1.3.1, 1.3.2, 1.3.3, 1.3.4... 1.4b1, etc.{{Clarify|January 2010|date=January 2010}}&lt;br /&gt;
&lt;br /&gt;
In principle, in subsequent releases, the &#039;&#039;major&#039;&#039; number is increased when there are significant jumps in functionality, the &#039;&#039;minor&#039;&#039; number is incremented when only minor features or significant fixes have been added, and the &#039;&#039;revision&#039;&#039; number is incremented when minor bugs are fixed. A typical product might use the numbers 0.9 (for beta software), 0.9.1, 0.9.2, 0.9.3, 1.0, 1.0.1, 1.0.2, 1.1, 1.1.1, 2.0, 2.0.1, 2.0.2, 2.1, 2.1.1, 2.1.2, 2.2, etc. Developers have at times jumped (for example) from version 5.0 to 5.5 to indicate that significant features have been added, but not enough to warrant incrementing the major version number, though this is [[Software_versioning#Separating_sequences|improper]].{{Clarify|January 2010|date=January 2010}}&lt;br /&gt;
&lt;br /&gt;
A different approach is to use the &#039;&#039;major&#039;&#039; and &#039;&#039;minor&#039;&#039; numbers, along with an alphanumeric string denoting the release type, i.e. &amp;quot;alpha&amp;quot;, &amp;quot;beta&amp;quot; or &amp;quot;release candidate&amp;quot;. A release train using this approach might look like 0.5, 0.6, 0.7, 0.8, 0.9 == 1.0b1, 1.0b2 (with some fixes), 1.0b3 (with more fixes) == 1.0rc1 (which, if it is stable &#039;&#039;enough&#039;&#039;) == 1.0. If 1.0rc1 turns out to have bugs which must be fixed, it turns into 1.0rc2, and so on. The important characteristic of this approach is that the first version of a given level (beta, RC, production) &#039;&#039;must be identical&#039;&#039; to the last version of the release below it: you cannot make any changes at all from the last beta to the first RC, or from the last RC to production. If you do, you must roll out another release at that lower level.&lt;br /&gt;
&lt;br /&gt;
However, since version numbers are human-generated, not computer-generated, there is nothing that prevents arbitrary changes that violate such guidelines: for example, the first sequence could be incremented between versions that differ by not even a single line of code, to give the (false) impression that very significant changes were made.&lt;br /&gt;
&lt;br /&gt;
Other schemes impart meaning on individual sequences:&lt;br /&gt;
:&#039;&#039;&amp;lt;nowiki&amp;gt;major.minor[.build[.revision]]&amp;lt;/nowiki&amp;gt;&#039;&#039; &lt;br /&gt;
or&lt;br /&gt;
:&#039;&#039;&amp;lt;nowiki&amp;gt;major.minor[.maintenance[.build]]&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Again, in these examples, the definition of what constitutes a &amp;quot;major&amp;quot; as opposed to a &amp;quot;minor&amp;quot; change is entirely arbitrary and up to the author, as is what defines a &amp;quot;build&amp;quot;, or how a &amp;quot;revision&amp;quot; differs from a &amp;quot;minor&amp;quot; change.&lt;br /&gt;
&lt;br /&gt;
In most proprietary software, the first released version of a software product has version 1.&lt;br /&gt;
&lt;br /&gt;
====Designating development stage====&lt;br /&gt;
Some schemes use a zero in the first sequence to designate [[Software release life cycle#Alpha|alpha]] or [[Software release life cycle#Beta|beta]] status for releases that are not stable enough for general or practical deployment and are intended for testing or internal use only.&lt;br /&gt;
&lt;br /&gt;
It can be used in the third position:&lt;br /&gt;
* 0 for alpha (status)&lt;br /&gt;
* 1 for beta (status)&lt;br /&gt;
* 2 for release candidate&lt;br /&gt;
* 3 for (public) release&lt;br /&gt;
&lt;br /&gt;
For instance:&lt;br /&gt;
* 1.2.0.1 instead of 1.2-a&lt;br /&gt;
* 1.2.1.2 instead of 1.2-b2 (beta with some bug fixes)&lt;br /&gt;
* 1.2.2.3 instead of 1.2-rc (release candidate)&lt;br /&gt;
* 1.2.3.0 instead of 1.2-r (commercial distribution)&lt;br /&gt;
* 1.2.3.5 instead of 1.2-r5 (commercial distribution with many bug fixes)&lt;br /&gt;
&lt;br /&gt;
====Separating sequences====&lt;br /&gt;
When printed, the sequences may be separated with characters. The choice of characters and their usage varies by scheme. The following list shows hypothetical examples of separation schemes for the same release (the thirteenth third-level revision to the fourth second-level revision to the second first-level revision):&lt;br /&gt;
&lt;br /&gt;
* A scheme may use the same character between all sequences: 2.4.13, 2/4/13, 2-4-13&lt;br /&gt;
* A scheme choice of which sequences to separate may be inconsistent, separating some sequences but not others: 2.413&lt;br /&gt;
* A scheme&#039;s choice of characters may be inconsistent within the same identifier: 2.4_13&lt;br /&gt;
&lt;br /&gt;
When a period is used to separate sequences, it does &#039;&#039;not&#039;&#039; represent a decimal point, and the sequences do &#039;&#039;not&#039;&#039; have positional significance. An identifier of &#039;&#039;2.5&#039;&#039;, for instance, is not &amp;quot;two and a half&amp;quot; or &amp;quot;half way to version three&amp;quot;, it is the &#039;&#039;fifth second-level revision of the second first-level revision&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Number of sequences====&lt;br /&gt;
 &lt;br /&gt;
There is sometimes a fourth, unpublished number which denotes the software build (as used by [[Microsoft]]). [[Adobe Flash]] notably publicly indicates a 4-part version, as in 10.1.53.64. Some companies also include the build date. Version numbers may also include letters and other characters, such as [[Lotus 1-2-3]] Release 1a.&lt;br /&gt;
&lt;br /&gt;
====Incrementing sequences====&lt;br /&gt;
&lt;br /&gt;
There are two schools of thought regarding how numeric version numbers are incremented: Most [[free software]] packages treat numbers as a continuous stream, therefore a free software or open source product may have version numbers 1.7.0, 1.8.0, 1.8.1, 1.9.0, 1.10.0, 1.11.0, 1.11.1, 1.11.2, etc.  An example of such a software package is [[MediaWiki]].  However, many programs treat version numbers in another way, generally as decimal numbers, and may have version numbers such as 1.7, 1.8, 1.81, 1.82, 1.9, etc.  In software packages using this way of numbering 1.81 is the next minor version after 1.8. Maintenance releases (i.e. bug fixes only) would generally be denoted as 1.81a, 1.81b, etc.&lt;br /&gt;
&lt;br /&gt;
The standard [[GNU]] version numbering scheme is major.minor.revision, but [[emacs]] is notably using another scheme where the major number (&amp;quot;1&amp;quot;) was dropped and a &amp;quot;user site&amp;quot; revision was added which is always zero in original emacs packages but increased by distributors.&amp;lt;ref name=&amp;quot;advogato&amp;quot;/&amp;gt; Similarly, [[Debian]] package numbers are prefixed with an optional &amp;quot;epoch&amp;quot;, which is used to allow the versioning scheme to be changed.&amp;lt;ref&amp;gt;Debian Policy Manual, [http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version 5.6.12 Version]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Using negative numbers====&lt;br /&gt;
There exist some projects that use negative version numbers.  One example is the [[smalleiffel]] compiler which started from -1.0 and counted upwards to 0.0.&amp;lt;ref name=&amp;quot;advogato&amp;quot;&amp;gt;{{Cite web|url=http://www.advogato.org/article/40.html|title=Advogato: Version numbering madness|accessdate=2009-04-11|date=2000-02-28}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Degree of compatibility====&lt;br /&gt;
Some projects use the major version number to indicate incompatible releases. Two examples are Apache APR&amp;lt;ref name=&amp;quot;apr&amp;quot;&amp;gt;{{Cite web|url=http://apr.apache.org/versioning.html|title=Versioning Numbering Concepts - The Apache Portable Runtime Project|accessdate=2009-04-11}}&amp;lt;/ref&amp;gt; and the FarCry CMS.&amp;lt;ref name=&amp;quot;farcry&amp;quot;&amp;gt;{{Cite web|url=http://blog.daemon.com.au/archives/000276.html|title=Daemonite: The science of version numbering|date=2004-09-14|accessdate=2009-04-11}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Date===&lt;br /&gt;
The [[Wine (software)|Wine]] project used a date versioning scheme, which uses the year followed by the month followed by the day of the release; for example, &amp;quot;Wine 20040505&amp;quot;. Wine is now on a &amp;quot;standard&amp;quot; release track; the most current stable version (as of [[2010]]) is 1.2. [[Ubuntu Linux]] uses a similar versioning scheme—Ubuntu 10.04, for example, was released April 2010.&lt;br /&gt;
&lt;br /&gt;
When using dates in versioning, for instance, file names, it is common to use the ISO scheme&amp;lt;ref name=&amp;quot;ISO Date&amp;quot;&amp;gt;{{Cite web|url=http://www.cl.cam.ac.uk/~mgk25/iso-time.html|title=International standard date and time notation|author=Markus Kuhn|accessdate=2009-04-11|date=2004-12-19|publisher=[[University of Cambridge]]}}&amp;lt;/ref&amp;gt;: YYYY-MM-DD, as this is easily string sorted to increasing/decreasing order. The hyphens are sometimes omitted.&lt;br /&gt;
&lt;br /&gt;
[[Microsoft Office]] build numbers are actually an encoded date.&amp;lt;ref name=&amp;quot;ms&amp;quot;&amp;gt;{{Cite web|url=http://www.codinghorror.com/blog/archives/000793.html|title=Coding Horror: What&#039;s In a Version Number, Anyway?|date=2007-02-15|accessdate=2009-04-11|author=Jeff Atwood}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Year of release===&lt;br /&gt;
Other examples, identifying versions by year ([[Adobe Illustrator]] 88, [[WordPerfect Office]] 2003).  Although when a date is used to denote version it is generally for marketing purposes, and an actual version number exists.  For example, [[Microsoft Windows 2000 Server]] is internally versioned as Windows NT 5.0 (&amp;quot;NT&amp;quot; being a reference to the original product name).&lt;br /&gt;
&lt;br /&gt;
===Alphanumeric codes=== &amp;lt;!-- explain? --&amp;gt;&lt;br /&gt;
Examples:&lt;br /&gt;
* [[Macromedia Flash]] MX&lt;br /&gt;
* [[Adobe Photoshop]] CS2&lt;br /&gt;
&lt;br /&gt;
===TeX===&lt;br /&gt;
[[TeX]] has an [[idiosyncratic]] version numbering system. Since version 3, updates have been indicated by adding an extra digit at the end, so that the version number [[asymptote|asymptotically]] approaches [[pi|π]]; this is a form of [[Unary numeral system|unary numbering]] – the version number is the number of digits. The current version is 3.1415926. This is a reflection of the fact that TeX is now very stable, and only minor updates are anticipated. TeX developer [[Donald Knuth]] has stated that the &amp;quot;absolutely final change (to be made after my death)&amp;quot; will be to change the version number to π, at which point all remaining bugs will become permanent features.&amp;lt;ref&amp;gt;Donald E. Knuth. [http://www.ntg.nl/maps/05/34.pdf &#039;&#039;The future of TeX and METAFONT&#039;&#039;], NTG journal MAPS (1990), 489. Reprinted as chapter 30 of &#039;&#039;Digital Typography&#039;&#039;, p. 571.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In a similar way, the version number of [[METAFONT]] asymptotically approaches [[E (mathematical constant)|e]].&lt;br /&gt;
&lt;br /&gt;
===Apple===&lt;br /&gt;
Apple has a formalised version number structure based around the NumVersion struct, which specifies a one- or two-digit major version, a one-digit minor version, a one-digit &amp;quot;bug&amp;quot; (i.e. revision) version, a stage indicator (drawn from the set development/prealpha, alpha, beta and final/release), and a one-byte (i.e. having values in the range 0–255) pre-release version, which is only used at stages prior to final. In writing these version numbers as strings, the convention is to omit any parts after the minor version whose value are zero (with &amp;quot;final&amp;quot; being considered the zero stage), thus writing 1.0.2b12, 1.0.2 (rather than 1.0.2f0), and 1.1 (rather than 1.1.0f0).&lt;br /&gt;
&lt;br /&gt;
===Other schemes===&lt;br /&gt;
Some software producers use different schemes to denote releases of their software. For example, the [[Microsoft Windows]] operating system was first labelled with standard numerical version numbers ([[Windows 1.0]] through [[Windows 3.1x|Windows 3.11]]).  Later, Microsoft started using separate version names for marketing purposes, first using years ([[Windows 95]] (4.0), [[Windows 98]] (4.10), [[Windows 2000]] (5.0)), then using alphanumeric codes ([[Windows Me]] (4.90), [[Windows XP]] (5.1)), then using brand names ([[Windows Vista]] (6.0)).  With the release of [[Windows 7]] it appears that Microsoft has returned to using numerical version numbers, although the official version number for Windows 7 is 6.1&amp;lt;ref&amp;gt;Enter the &amp;quot;ver&amp;quot; command in Windows 7 command prompt&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The [[Debian]] project uses a major/minor versioning scheme for releases of its operating system, but uses code names from the movie &#039;&#039;[[Toy Story]]&#039;&#039; during development to refer to stable, unstable and testing releases.&amp;lt;!-- FIXME with more accurate information and actual Debian code names --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Software Engineering]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Software_release_life_cycle&amp;diff=559</id>
		<title>Software release life cycle</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Software_release_life_cycle&amp;diff=559"/>
		<updated>2026-08-21T05:17:53Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Software Engineering&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Redirect|Development stage|other meanings|Stage of development (disambiguation)}}&lt;br /&gt;
{{Merge|software development process|date=July 2010}}&lt;br /&gt;
{{moreref|date=August 2010}}&lt;br /&gt;
{{Infobox&lt;br /&gt;
|above     = Software Development and Release Stages&lt;br /&gt;
|image     = [[Image:Software dev2.png]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;software release&#039;&#039;&#039; is the distribution of [[computer software|software]] code, documentation, and support materials.  The &#039;&#039;&#039;software release life cycle&#039;&#039;&#039; is composed of discrete phases that describe the software&#039;s maturity as it advances from planning and development to release and support phases.&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
=== Pre-Alpha ===&lt;br /&gt;
Pre-alpha refers to all activities performed during the software project prior to [[software testing|testing]]. These activities can include [[requirements analysis]], [[software design]], [[software development]] and [[unit testing]].&lt;br /&gt;
&lt;br /&gt;
In typical [[open source]] development, there are several types of pre-alpha versions. &#039;&#039;&#039;Milestone&#039;&#039;&#039; versions include specific sets of functions and are released as soon as the functionality is complete.&lt;br /&gt;
&lt;br /&gt;
=== Alpha === &amp;lt;!-- Many pages link to this section. Please take care if renaming or moving it. --&amp;gt;&lt;br /&gt;
The [[alpha (letter)|alpha]] phase of the release life cycle is the first phase to begin [[Software testing]].  In this phase, developers generally test the software using [[white box testing|white box techniques]]. Additional validation is then performed using [[black box testing|black box]] or gray box techniques, by another [[Software testing|testing team]]. Moving to black box testing inside the organization is known as &#039;&#039;alpha release&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Alpha software can be unstable and could cause crashes or data loss.&lt;br /&gt;
&lt;br /&gt;
The alpha phase usually ends with a [[Freeze (software engineering)|feature freeze]], indicating that no more features will be added to the software.  At this time, the software is said to be [[feature complete]].&lt;br /&gt;
&lt;br /&gt;
=== Beta === &amp;lt;!-- Many pages link to this section. Please take care if renaming or moving it. --&amp;gt;&lt;br /&gt;
&amp;quot;Beta&amp;quot; is the software development phase following alpha, named after the Greek letter [[Beta (letter)|beta]].  It generally begins when the software is [[feature complete]]. The focus of beta testing is reducing impacts to users, often incorporating [[usability testing]].  The process of delivering a beta version to the users is called &#039;&#039;&#039;beta release&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The users of a beta version are called &#039;&#039;beta testers&#039;&#039;. They are usually customers or prospective customers of the organization that develops the software, willing to test the software for free or for a reduced price.&lt;br /&gt;
&lt;br /&gt;
Beta version software is likely to be useful for internal demonstrations and previews to select customers. Some developers refer to this stage as a &#039;&#039;&#039;preview&#039;&#039;&#039;, a &#039;&#039;&#039;prototype&#039;&#039;&#039;, a &#039;&#039;&#039;technical preview&#039;&#039;&#039; (&#039;&#039;&#039;TP&#039;&#039;&#039;) or as an &#039;&#039;&#039;early access&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Open and closed beta ====&lt;br /&gt;
&lt;br /&gt;
Developers release either a &#039;&#039;&#039;closed beta&#039;&#039;&#039; or an &#039;&#039;&#039;open beta&#039;&#039;&#039;; closed beta versions are released to a select group of individuals for a user test, while open betas are to a larger community group, usually the general public. The testers report any bugs that they found and sometimes minor features they would like to see in the final version.&lt;br /&gt;
&lt;br /&gt;
Examples of a major public beta test were [[Microsoft]]&#039;s release of &#039;&#039;&#039;community technology preview&#039;&#039;&#039;s (&#039;&#039;&#039;CTP&#039;&#039;&#039;s) for [[Windows Vista]] in January 2005. In September 2000, a &#039;&#039;boxed version&#039;&#039; of Apple Computer&#039;s [[Mac OS X Public Beta]] operating system was released.&lt;br /&gt;
&lt;br /&gt;
=== Release candidate ===&lt;br /&gt;
The term &#039;&#039;&#039;release candidate&#039;&#039;&#039; (&#039;&#039;&#039;RC&#039;&#039;&#039;) refers to a version with potential to be a final product, ready to release unless fatal [[computer bug|bugs]] emerge. In this stage of product stabilization, all product features have been designed, coded and tested through one or more beta cycles with no known showstopper-class bug.&lt;br /&gt;
&lt;br /&gt;
During the 1990s, [[Apple Inc.]] used the term &amp;quot;[[golden master]]&amp;quot; for its release candidates, and the final golden master was used as the general availability release. Other Greek letters, such as &#039;&#039;&#039;gamma&#039;&#039;&#039; and &#039;&#039;&#039;delta&#039;&#039;&#039;, are sometimes used to indicate versions that are substantially complete, but still undergoing testing, with &#039;&#039;&#039;omega&#039;&#039;&#039; or &#039;&#039;&#039;zenith&#039;&#039;&#039; used to indicate final testing versions that are believed to be relatively bug-free, ready for production.&lt;br /&gt;
&lt;br /&gt;
A release is called &#039;&#039;&#039;code complete&#039;&#039;&#039; when the development team agrees that no entirely new source code will be added to this release. There may still be source code changes to fix defects. There may still be changes to documentation and data files, and to the code for test cases or utilities. New code may be added in a future release.&lt;br /&gt;
&lt;br /&gt;
=== Origin of alpha and beta terminology ===&lt;br /&gt;
{{Unreferenced section|date=August 2007}}&lt;br /&gt;
The term &#039;&#039;&#039;beta test&#039;&#039;&#039; comes from an [[IBM Product Test|IBM convention]], dating back to punched card tabulating and sorting machines.  Hardware first went through an &#039;&#039;&#039;alpha test&#039;&#039;&#039; for preliminary functionality and small scale manufacturing feasibility.  Then came a &#039;&#039;&#039;beta test&#039;&#039;&#039;, to verify that the hardware correctly performed the intended functions and could be manufactured at scale.  Ultimately, a &#039;&#039;&#039;gamma test&#039;&#039;&#039; was performed to verify safety.&lt;br /&gt;
&lt;br /&gt;
When IBM began testing software, it used the same terminology as it had for hardware. As other companies began developing their own software, the terminology stuck—and now is part of the common vocabulary.&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
=== RTM {{Anchors|RTM|Release to manufacturing|Release to marketing|RTM_or_RTW}} ===&lt;br /&gt;
The term &amp;quot;&#039;&#039;&#039;release to manufacturing&#039;&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;&#039;release to marketing&#039;&#039;&#039;&amp;quot; (both abbreviated RTM)—also known as &amp;quot;going gold&amp;quot;—is a term used to indicate that the software has reached a point that it is ready to or has been delivered or provided to the customer.  It is typically used in certain retail mass-production software contexts - as opposed to a specialized software production or project in a commercial or government production and distribution - where the software is sold as part a bundle in a related computer hardware sale and typically where the software and related hardware is ultimately to be available and sold on mass/public basis at retail stores to indicate that the software has met a defined quality level and is ready for mass retail distribution. RTM could also mean in other contexts that the software has been delivered or released to a client or customer for installation or distribution to the related hardware end user computers or machines.  The term does &#039;&#039;not&#039;&#039; define the delivery mechanism or volume; it only states that the quality is sufficient for mass distribution. The deliverable from the engineering organization is frequently in the form of a &#039;&#039;&#039;gold&#039;&#039;&#039; master CD used for duplication or to produce the image for the web.&lt;br /&gt;
&lt;br /&gt;
RTM happens prior to general availability ([[#GA|GA]]) when the product is released to the public.&lt;br /&gt;
&lt;br /&gt;
=== General availability {{Anchors|GA|General availability}} ===&lt;br /&gt;
&#039;&#039;&#039;General availability &#039;&#039;&#039;or&#039;&#039;&#039; General Acceptance&#039;&#039;&#039; (&#039;&#039;&#039;GA&#039;&#039;&#039;) is the point where all necessary commercialization activities have been completed and the software has been made available to the general market either via the web or physical media.&lt;br /&gt;
&lt;br /&gt;
Commercialization activities could include but are not limited to the availability of media world wide via dispersed distribution centers, marketing collateral is completed and available in as many languages as deemed necessary for the target market, the finishing of security and compliance tests, etc.  The time between RTM and GA can be from a week to months in some cases before a generally available release can be declared because of the time needed to complete all commercialization activities required by GA.&lt;br /&gt;
&lt;br /&gt;
Another term with a meaning almost identical to GA is &#039;&#039;&#039;FCS&#039;&#039;&#039;, for &#039;&#039;&#039;First Customer Shipment&#039;&#039;&#039;. Some companies (such as Sun Microsystems and Cisco) use FCS to describe a software version that has been shipped for revenue.&lt;br /&gt;
&lt;br /&gt;
It is also at this stage that the software is considered to have &amp;quot;gone live&amp;quot;. The &#039;&#039;&#039;production&#039;&#039;&#039;, &#039;&#039;&#039;live&#039;&#039;&#039; version is the final version of a particular product. A live release is considered to be very stable and relatively bug-free with a quality suitable for wide distribution and use by end users. In commercial software releases, this version may also be [[Code signing|signed]] (used to allow end-users to verify that code has not been modified since the release).  The expression that a software product &amp;quot;has gone live&amp;quot; means that the code has been completed and is ready for distribution.  Other terms for the live version include: live master, live release, or live build.&lt;br /&gt;
&lt;br /&gt;
In some areas of software development it is at this stage that the release is referred to as a &#039;&#039;&#039;gold&#039;&#039;&#039; release; this seems to be confined mainly to game software.&lt;br /&gt;
&lt;br /&gt;
== Support ==&lt;br /&gt;
=== Service release ===&lt;br /&gt;
{{Expand section|date=August 2009}}&lt;br /&gt;
During its supported lifetime, software is sometimes subjected to service releases, or [[service pack]]s. As a well used example, Microsoft&#039;s [[Windows XP]] has currently had 3 major [[Windows XP#Service packs|Service Packs]].&lt;br /&gt;
&lt;br /&gt;
Such service releases contain a collection of updates, fixes and/or enhancements, delivered in the form of a single installable package. They may also contain entirely new features.&lt;br /&gt;
&lt;br /&gt;
Certain software is released with the expectation of regular support. Classes of software that generally involve protracted support as the norm include [[Antivirus software|Anti-virus suites]] and [[Massively multiplayer online game|Massively Multiplayer Online Games]].&lt;br /&gt;
&lt;br /&gt;
=== End of life {{Anchors|EOL|End of life}} ===&lt;br /&gt;
{{See also|End-of-life (product)}}&lt;br /&gt;
When software is no longer sold or supported, the product is said to have reached end-of-life.&lt;br /&gt;
&lt;br /&gt;
== Impact of the World-Wide Web ==&lt;br /&gt;
&lt;br /&gt;
As the Internet has allowed for rapid and inexpensive distribution of software, companies have begun to take a more loose approach to use of the word &amp;quot;beta&amp;quot;.&amp;lt;ref&amp;gt;[http://www.tidbits.com/tb-issues/TidBITS-328.html#lnk5 &amp;quot;Waiting with Beta&#039;d Breath&amp;quot;] &#039;&#039;[[TidBITS]]&#039;&#039; #328 (May 13, 1996)&amp;lt;/ref&amp;gt; [[Netscape Communications]] was infamous for releasing alpha level versions of its [[Netscape (web browser)|Netscape web browser]] to the public and calling them &amp;quot;beta&amp;quot; releases.{{Citation needed|date=April 2010}} In February 2005, [[ZDNet]] published an article about the recent phenomenon of a beta version often staying for years and being used as if it were in production-level. It noted that [[Gmail]] and [[Google News]], for example, had been in beta for a long period of time and were not expected to drop the beta status despite the fact that they were widely used; however, Google News did leave beta in January 2006, followed by [[Google Apps]], including [[Gmail]], in July 2009.&amp;lt;ref&amp;gt;[http://googleblog.blogspot.com/2009/07/google-apps-is-out-of-beta-yes-really.html &amp;quot;Google Apps is out of beta (yes, really)&amp;quot;] &amp;quot;The Official Google Blog&amp;quot; (July 7, 2009)&amp;lt;/ref&amp;gt; This technique may also allow a developer to delay offering full support and/or responsibility for remaining issues. In the context of [[Web 2.0]], people even talk of [[perpetual beta]]s to signify that some software is meant to stay in beta state. Also, &amp;quot;beta&amp;quot; is sometimes used to indicate something more like a [[Software release life cycle#Release candidate|release candidate]], or as a form of time limited demo, or marketing technique.&amp;lt;ref&amp;gt;[http://www.gamesradar.com/f/the-inconvenient-truths-behind-betas/a-2010051712402686048 The inconvenient truths behind betas]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some users disparagingly refer to release candidates and even final &amp;quot;point oh&amp;quot; releases as &amp;quot;gamma test&amp;quot; software, suggesting that the developer has chosen to use its customers to test software that is not truly ready for general release. Beta testers, if privately selected, will often be credited for using the release candidate as though it were a finished product.&lt;br /&gt;
&lt;br /&gt;
=== Web release ===&lt;br /&gt;
A &#039;&#039;&#039;web release&#039;&#039;&#039; is a means of software delivery that utilizes the Internet for distribution.  No physical media are produced in this type of release mechanism by the manufacturer. This is sometimes also referred to as &#039;&#039;Release To Web&#039;&#039; (RTW).&lt;br /&gt;
&amp;lt;!-- Per [[Help:Section#Section_linking_and_redirects]], this is to inform that &amp;quot;Sims 3&amp;quot; article has a direct link to this header caption.  Please leave as is. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
*[[Paper launch]]&lt;br /&gt;
*[[Release engineering]]&lt;br /&gt;
*[[Release management]]&lt;br /&gt;
*[[Rolling release]]&lt;br /&gt;
*[[Software maintenance]]&lt;br /&gt;
*[[Software testing]]&lt;br /&gt;
*[[Software versioning]]&lt;br /&gt;
*[[Software deployment]]&lt;br /&gt;
*[[Vaporware]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;!--See http://en.wikipedia.org/wiki/Wikipedia:Footnotes for an explanation of how to generate footnotes using the &amp;lt;ref(erences/)&amp;gt; tags--&amp;gt;&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[http://developer.apple.com/technotes/tn/tn1132.html Apple, Inc. Version Territory]&lt;br /&gt;
*[http://www.tldp.org/HOWTO/Software-Proj-Mgmt-HOWTO/users.html#ALPHABETA Free Software Project Management HOWTO].&lt;br /&gt;
*[https://pide.dev.java.net/glossary-std.html Java Standard Terms].&lt;br /&gt;
*[http://www.se-cure.ch/Publications.html Software Release Decisions]&lt;br /&gt;
*[http://www.methodsandtools.com/archive/archive.php?id=55 A Methodology to Support Software Release Decisions]&lt;br /&gt;
*[http://www.editorial.co.in/software/software-testing-life-cycle.php Software Testing Life Cycle].&lt;br /&gt;
*[http://www.computeruser.com/resources/dictionary/definition.html?lookup=792 computeruser.com definition]&lt;br /&gt;
*[http://www.smartcomputing.com/editorial/dictionary/detail.asp?guid=&amp;amp;searchtype=&amp;amp;DicID=8430&amp;amp;RefType=Dictionary smartcomputing.com definition]&lt;br /&gt;
*[http://www.techweb.com/encyclopedia/defineterm.jhtml?term=betaware techweb.com definition]&lt;br /&gt;
*[http://semver.org/ Semantic versioning]&lt;br /&gt;
&lt;br /&gt;
[[ar:دورة حياة إصدار البرمجيات]]&lt;br /&gt;
[[de:Entwicklungsstadium (Software)]]&lt;br /&gt;
[[et:Tarkvara väljalaske elutsükkel]]&lt;br /&gt;
[[es:Fases del desarrollo de software]]&lt;br /&gt;
[[fa:چرخهٔ ارائهٔ نرم‌افزار]]&lt;br /&gt;
[[it:Release (informatica)]]&lt;br /&gt;
[[pl:Cykl życia programu]]&lt;br /&gt;
[[pt:Liberação de software]]&lt;br /&gt;
[[ru:Стадии разработки программного обеспечения]]&lt;br /&gt;
[[sl:programska izdaja]]&lt;br /&gt;
[[sv:Programvaruutveckling]]&lt;br /&gt;
[[zh:軟件出版週期]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software Engineering]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Seeed_%2B_Hackaday,_Tiny_BLE&amp;diff=558</id>
		<title>Seeed + Hackaday, Tiny BLE</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Seeed_%2B_Hackaday,_Tiny_BLE&amp;diff=558"/>
		<updated>2026-08-21T05:17:53Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Tiny_BLE.jpg|300px|HW]]&lt;br /&gt;
== Intro ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
The Tiny BLE is a Bluetooth Low Energy development board designed with low energy consumption and small size in mind. &lt;br /&gt;
It&#039;s integrated with current measurement feature to provide real time energy consumption data, which is essential for &lt;br /&gt;
developers to optimize software to design long battery life devices. It supports ARM mbed cloud-based IDE with an handy C/C++ SDK &lt;br /&gt;
and a large number of open source libraries, which makes prototyping and development extremely easy. Further, to keep it small, &lt;br /&gt;
we use modular design to enable it divide into two parts - CMSIS DAP interface part and BLE part.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:Tiny_ble.png|300px|HW]]&lt;br /&gt;
== LED power consumption ==&lt;br /&gt;
[[File:Tiny_ble_RGB_current.jpg|current consumption]]&lt;br /&gt;
== Reference ==&lt;br /&gt;
[https://github.com/Seeed-Studio/Tiny_BLE, Github - Seeed-Studio/Tiny_BLE]&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=ST,_STM32F4_Discovery&amp;diff=557</id>
		<title>ST, STM32F4 Discovery</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=ST,_STM32F4_Discovery&amp;diff=557"/>
		<updated>2026-08-21T05:17:53Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:IMAG4572 BURST001.jpg|thumb|200px|Dot matrix + servo + touch sensor]]&lt;br /&gt;
== Download the GNU/ARM toolchain ==&lt;br /&gt;
* tar -xvjf gcc-arm-none-eabi-4_8-2014q2-20131204-linux.tar.bz2&lt;br /&gt;
* export PATH=$PATH:~/gcc-arm-none-eabi-4_8-2014q2/bin&lt;br /&gt;
== Download and Build STLINK ==&lt;br /&gt;
* sudo apt-get install autoconf pkg-config libusb-1.0 git&lt;br /&gt;
* git clone https://github.com/texane/stlink.git&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/stlink&lt;br /&gt;
./autogen.sh&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Download STM32 Libraries and Blinky Example ==&lt;br /&gt;
* git clone https://github.com/rowol/stm32_discovery_arm_gcc&lt;br /&gt;
== Compile Your Source Code ==&lt;br /&gt;
* Edit Makefile&lt;br /&gt;
** STLINK=/home/rowol/stlink             #Example, change to your location&lt;br /&gt;
** STM_COMMON=/home/rowol/stm32_discovery_arm_gcc/STM32F4-DISCOVERY_FW_V1.1.0&lt;br /&gt;
** make it&lt;br /&gt;
== Program ARM&#039;s Flash and Run Code ==&lt;br /&gt;
* make burn&lt;br /&gt;
or&lt;br /&gt;
* st-flash write STM32F4-Discovery.bin 0x08000000&lt;br /&gt;
&lt;br /&gt;
== Using external ST-Link ==&lt;br /&gt;
* Remove CN3 jumper&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ST-Link     STM32F4&lt;br /&gt;
VCC            3V&lt;br /&gt;
SWIO           PA13&lt;br /&gt;
SWCLK          PA14&lt;br /&gt;
VDD            VDD ( depends on product, could range from 1.8v - 5v )&lt;br /&gt;
GND            GND&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GDB ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In the directory with your source code, I&#039;ve also add a .gdbinit file which contains:&lt;br /&gt;
&lt;br /&gt;
define reload&lt;br /&gt;
kill&lt;br /&gt;
monitor jtag_reset&lt;br /&gt;
load&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
target extended localhost:4242&lt;br /&gt;
load&lt;br /&gt;
&lt;br /&gt;
This will execute whenever you start GDB in the source directory&lt;br /&gt;
&lt;br /&gt;
To start up:&lt;br /&gt;
&lt;br /&gt;
~/stlink/st-util                 #Start GDB server&lt;br /&gt;
arm-none-eabi-gdb main.elf       #In a second terminal window, start GDB&lt;br /&gt;
&lt;br /&gt;
continue                         #Starts code running, or use other GDB commands to &lt;br /&gt;
                                 # set breakpoints, etc first...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[application - MPR121, capacitive touch sensor controller ]] ==&lt;br /&gt;
== [[application - MAX7219, Serially Interfaced, 8-Digit LED Display Drivers (interact with MPR121)]] ==&lt;br /&gt;
== [[application - MAX7219, Serially Interfaced, 8-Digit LED Display Drivers (scrolling text)]] ==&lt;br /&gt;
== [[application - CS43L22, built-in DAC(audio playback)]] ==&lt;br /&gt;
== [[application - MG90S, Metal Gear Servo]] ==&lt;br /&gt;
== [[application - Joystick]] ==&lt;br /&gt;
== [[application - nRF52, (BLE - UART - STM32F4)]] ==&lt;br /&gt;
== [[application - MeArm, mini robotic arm]] ==&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://launchpad.net/gcc-arm-embedded/+download, ARM toolchain]&lt;br /&gt;
* [http://www.wolinlabs.com/blog/linux.stm32.discovery.gcc.html, STM32 Discovery Development On Linux]&lt;br /&gt;
&lt;br /&gt;
* [http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF252419, STM32F4 Discovery Kit Resource Page]&lt;br /&gt;
* [http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php, CMSIS - Cortex Microcontroller Software Interface Standard]&lt;br /&gt;
* [http://rusefi.com/wiki/index.php?title=Hardware:stm32f4discovery_repair, Hardware:stm32f4discovery repair]&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=SCCB,_Arducam/OVM7251&amp;diff=556</id>
		<title>SCCB, Arducam/OVM7251</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=SCCB,_Arducam/OVM7251&amp;diff=556"/>
		<updated>2026-08-21T05:17:52Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Sensors and Modules&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:bp_rpi_ov7251.jpg|400px|bus priate hacking ovm7251]]&lt;br /&gt;
&lt;br /&gt;
== I2C init cmd ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HiZ&amp;gt;m&lt;br /&gt;
1. HiZ&lt;br /&gt;
2. 1-WIRE&lt;br /&gt;
3. UART&lt;br /&gt;
4. I2C&lt;br /&gt;
5. SPI&lt;br /&gt;
6. 2WIRE&lt;br /&gt;
7. 3WIRE&lt;br /&gt;
8. LCD&lt;br /&gt;
x. exit(without change)&lt;br /&gt;
&lt;br /&gt;
(1)&amp;gt;4&lt;br /&gt;
Set speed:&lt;br /&gt;
 1. ~5KHz&lt;br /&gt;
 2. ~50KHz&lt;br /&gt;
 3. ~100KHz&lt;br /&gt;
 4. ~400KHz&lt;br /&gt;
&lt;br /&gt;
(1)&amp;gt;4&lt;br /&gt;
Ready&lt;br /&gt;
I2C&amp;gt;P&lt;br /&gt;
Pull-up resistors ON&lt;br /&gt;
Warning: no voltage on Vpullup pin&lt;br /&gt;
I2C&amp;gt;W&lt;br /&gt;
POWER SUPPLIES ON&lt;br /&gt;
I2C&amp;gt;&lt;br /&gt;
HiZ&amp;gt;m&lt;br /&gt;
1. HiZ&lt;br /&gt;
2. 1-WIRE&lt;br /&gt;
3. UART&lt;br /&gt;
4. I2C&lt;br /&gt;
5. SPI&lt;br /&gt;
6. 2WIRE&lt;br /&gt;
7. 3WIRE&lt;br /&gt;
8. LCD&lt;br /&gt;
x. exit(without change)&lt;br /&gt;
&lt;br /&gt;
(1)&amp;gt;4&lt;br /&gt;
Set speed:&lt;br /&gt;
 1. ~5KHz&lt;br /&gt;
 2. ~50KHz&lt;br /&gt;
 3. ~100KHz&lt;br /&gt;
 4. ~400KHz&lt;br /&gt;
&lt;br /&gt;
(1)&amp;gt;4&lt;br /&gt;
Ready&lt;br /&gt;
I2C&amp;gt;P&lt;br /&gt;
Pull-up resistors ON&lt;br /&gt;
Warning: no voltage on Vpullup pin&lt;br /&gt;
I2C&amp;gt;W&lt;br /&gt;
POWER SUPPLIES ON&lt;br /&gt;
I2C&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SCCB Read/Write ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C&amp;gt;[0xc0 0x35 0x02][0xc1 r]&lt;br /&gt;
I2C START BIT&lt;br /&gt;
WRITE: 0xC0 ACK &lt;br /&gt;
WRITE: 0x35 ACK &lt;br /&gt;
WRITE: 0x02 ACK &lt;br /&gt;
I2C STOP BIT&lt;br /&gt;
I2C START BIT&lt;br /&gt;
WRITE: 0xC1 ACK &lt;br /&gt;
READ: 0x80 &lt;br /&gt;
NACK&lt;br /&gt;
I2C STOP BIT&lt;br /&gt;
&lt;br /&gt;
I2C&amp;gt;[0xc0 0x35 0x02 0xf0]&lt;br /&gt;
I2C START BIT&lt;br /&gt;
WRITE: 0xC0 ACK &lt;br /&gt;
WRITE: 0x35 ACK &lt;br /&gt;
WRITE: 0x02 ACK &lt;br /&gt;
WRITE: 0xF0 ACK &lt;br /&gt;
I2C STOP BIT&lt;br /&gt;
&lt;br /&gt;
I2C&amp;gt;[0xc0 0x35 0x02][0xc1 r]&lt;br /&gt;
I2C START BIT&lt;br /&gt;
WRITE: 0xC0 ACK &lt;br /&gt;
WRITE: 0x35 ACK &lt;br /&gt;
WRITE: 0x02 ACK &lt;br /&gt;
I2C STOP BIT&lt;br /&gt;
I2C START BIT&lt;br /&gt;
WRITE: 0xC1 ACK &lt;br /&gt;
READ: 0xF0 &lt;br /&gt;
NACK&lt;br /&gt;
I2C STOP BIT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:IMG_20201117_171416598.jpg|1200px|SCCB_write_01]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:IMG_20201117_171508585.jpg|1200px|SCCB_write_02]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Sensors and Modules]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=RoboPeak_Mini_USB_Display&amp;diff=555</id>
		<title>RoboPeak Mini USB Display</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=RoboPeak_Mini_USB_Display&amp;diff=555"/>
		<updated>2026-08-21T05:17:52Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Sensors and Modules&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rpusbdisp01.jpg|thumb|600px|rpusbdisp with RPi2]]&lt;br /&gt;
== RoboPeak Mini USB Display ==&lt;br /&gt;
# git clone https://github.com/robopeak/rpusbdisp&lt;br /&gt;
&lt;br /&gt;
Drivers and Tools for RoboPeak Mini USB Display Project&lt;br /&gt;
&lt;br /&gt;
Visit RoboPeak Website for details.&lt;br /&gt;
&lt;br /&gt;
== How to Integrate the Driver in the Kernel build operation ==&lt;br /&gt;
&lt;br /&gt;
1) Copy the content of linux-driver folder in your kernel source (ideally in a new folder called robopeak inside the drivers/video folder)&lt;br /&gt;
2) Replace the Makefile file by the NewMakefile one&lt;br /&gt;
3) Edit the Kconfig file of the drivers/video file and insert the line&lt;br /&gt;
   * source &amp;quot;drivers/video/robopeak/Kconfig&amp;quot;&lt;br /&gt;
   after the line&lt;br /&gt;
   * comment &amp;quot;Frame buffer hardware drivers&amp;quot;&lt;br /&gt;
4) Change the .config of your kernel through the menuconfig&lt;br /&gt;
   * make ARCH=your_architecture your_defconfig menuconfig&lt;br /&gt;
5) In the menu &amp;quot;Device Drivers -&amp;gt; Graphic supports -&amp;gt; Support for frame buffer display&amp;quot; a Robopeak USB Display menu appears&lt;br /&gt;
6) Set the Robopeak USB Display as module (this selection activates automatically the requested frame buffer option, see Prerequites of How to build the Linux Kernel Driver chapter)&lt;br /&gt;
7) Generate your kernel&lt;br /&gt;
&lt;br /&gt;
== How to Build the Linux Kernel Driver ==&lt;br /&gt;
&lt;br /&gt;
Here we only provide you the basic building process. Please refer to the related documents for details.&lt;br /&gt;
=== I. Prerequisite ===&lt;br /&gt;
&lt;br /&gt;
As a linux kernel driver, it requires you to provide the target system&#039;s kernel header or the full source code to build.&lt;br /&gt;
&lt;br /&gt;
Before building the driver, you may need to config the linux kernel to enable the features required by the driver. Otherwise, the building process will fail.&lt;br /&gt;
&lt;br /&gt;
If you want to use the driver with your current kernel (without recompiling the kernel and replacing it with the current one), please make sure the kernel header, the config and the related build scripts you used is belonged to this version of kernel.&lt;br /&gt;
&lt;br /&gt;
Please make sure the following kernel features have been enabled. (via make menuconfig under your kernel source)&lt;br /&gt;
&lt;br /&gt;
0) framebuffer support (CONFIG_FB=y)&lt;br /&gt;
&lt;br /&gt;
1) deferred io support in framebuffer (CONFIG_FB_DEFERRED_IO=y)&lt;br /&gt;
&lt;br /&gt;
2) fb file operation support&lt;br /&gt;
&lt;br /&gt;
   * CONFIG_FB_CFB_FILLRECT=y&lt;br /&gt;
   * CONFIG_FB_CFB_COPYAREA=y&lt;br /&gt;
   * CONFIG_FB_CFB_IMAGEBLIT=y&lt;br /&gt;
   * CONFIG_FB_SYS_FILLRECT=m&lt;br /&gt;
   * CONFIG_FB_SYS_COPYAREA=m&lt;br /&gt;
   * CONFIG_FB_SYS_IMAGEBLIT=m&lt;br /&gt;
   * CONFIG_FB_SYS_FOPS=m&lt;br /&gt;
   * CONFIG_FB_MODE_HELPERS=y&lt;br /&gt;
&lt;br /&gt;
3) Input event support (Generic input layer support)&lt;br /&gt;
&lt;br /&gt;
You may modify the .config directly to enable these features.&lt;br /&gt;
&lt;br /&gt;
Alternatively, here is a tricky method: Select the Displaylink display driver ( Device Drivers-&amp;gt; Graphics support -&amp;gt; Support for frame buffer devices-&amp;gt; Displaylink USB Framebuffer support) as an external module. By doing so, the above features will be selected by the menuconfiger.&lt;br /&gt;
&lt;br /&gt;
You may need to recompile the kernel if the above configuration changes have been made.&lt;br /&gt;
=== II. Native Build - build the kernel driver for the current machine ===&lt;br /&gt;
&lt;br /&gt;
You should have followed the steps described in the prerequisite section already. Here let&#039;s assume the location of the Linux kernel header(or source) is ~/workspace/linux-kernel.&lt;br /&gt;
&lt;br /&gt;
Enter the Robopeak USB Displayer linux kernel driver folder (i.e. rpusbdisp/drivers/linux-driver), using the following command:&lt;br /&gt;
&lt;br /&gt;
$ make KERNEL_SOURCE_DIR=~/workspace/linux-kernel&lt;br /&gt;
&lt;br /&gt;
You should find the build result under the current folder: rp_usbdisplay.ko&lt;br /&gt;
=== III. Cross Compile - build the kernel driver for other platforms ===&lt;br /&gt;
&lt;br /&gt;
You should have followed the steps described in the prerequisite section already. Here let&#039;s assume the location of the Linux kernel header(or source) is ~/workspace/target-linux-kernel.&lt;br /&gt;
&lt;br /&gt;
Let&#039;s also assume the target platform is ARMv7. We need to use the cross-compiler : arm-linux-gnueabihf-gcc.&lt;br /&gt;
&lt;br /&gt;
Enter the following command to build the kernel driver for the target:&lt;br /&gt;
&lt;br /&gt;
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm KERNEL_SOURCE_DIR=~/workspace/target-linux-kernel&lt;br /&gt;
&lt;br /&gt;
You should find the build result under the current folder: rp_usbdisplay.ko&lt;br /&gt;
== How to Use the Kernel Driver ==&lt;br /&gt;
=== I. Deploy the dependencies modules ===&lt;br /&gt;
&lt;br /&gt;
If you had re-configed and recompiled the Linux kernel as required by the building process, you need to deploy the new kernel and all the kernel modules to the target system.&lt;br /&gt;
&lt;br /&gt;
To be specific, you need to deploy AT LEAST the following kernel module to the target system&#039;s /lib/module/ folder along with the new kenrel image:&lt;br /&gt;
&lt;br /&gt;
    sysfillrect.ko&lt;br /&gt;
    syscopyarea.ko&lt;br /&gt;
    sysimgblt.ko&lt;br /&gt;
    fb_sys_fops.ko&lt;br /&gt;
&lt;br /&gt;
=== II. Deploy the compiled kernel driver ===&lt;br /&gt;
&lt;br /&gt;
Reboot the target system to using the new kernel. Copy the compiled usb display driver (rp_usbdisplay.ko) to the following location:&lt;br /&gt;
&lt;br /&gt;
/lib/modules/`uname -r`/kernel&lt;br /&gt;
&lt;br /&gt;
Enter the above folder and execute the following command:&lt;br /&gt;
&lt;br /&gt;
depmod &lt;br /&gt;
&lt;br /&gt;
=== III. Load the kernel driver ===&lt;br /&gt;
&lt;br /&gt;
Once you had deployed the kernel driver and all of its dependencies, you can ask the kernel to load the driver using :&lt;br /&gt;
&lt;br /&gt;
modprobe rp_usbdisplay&lt;br /&gt;
&lt;br /&gt;
By default the frame per seconds is set to 16. You can change it with the fps option when you load the driver :&lt;br /&gt;
&lt;br /&gt;
modprobe rp_usbdisplay fps=25&lt;br /&gt;
&lt;br /&gt;
In this case the frame per seconds is set to 25.&lt;br /&gt;
&lt;br /&gt;
If you want to let the kernel load the driver automatically each time when the system starts, you can added the following line into the file /etc/modules: rp_usbdisplay&lt;br /&gt;
&lt;br /&gt;
(i.e. echo rp_usbdisplay &amp;gt;&amp;gt; /etc/modules)&lt;br /&gt;
=== IV. Verify the driver ===&lt;br /&gt;
&lt;br /&gt;
Using the lsmod command to check whether the driver has been loaded correctlly. You should get the output similar to the following text:&lt;br /&gt;
&lt;br /&gt;
# lsmod&lt;br /&gt;
Module                  Size  Used by&lt;br /&gt;
rp_usbdisplay          12171  0 [permanent]&lt;br /&gt;
fb_sys_fops             1412  1 rp_usbdisplay&lt;br /&gt;
sysimgblt               2199  1 rp_usbdisplay&lt;br /&gt;
sysfillrect             3295  1 rp_usbdisplay&lt;br /&gt;
syscopyarea             3112  1 rp_usbdisplay&lt;br /&gt;
&lt;br /&gt;
Also, you should find the following message in the dmesg log:&lt;br /&gt;
&lt;br /&gt;
[    7.535799] input: RoboPeakUSBDisplayTS as /devices/virtual/input/input0&lt;br /&gt;
[    7.548115] usbcore: registered new interface driver rp-usbdisp&lt;br /&gt;
&lt;br /&gt;
To verify the driver work with the RoboPeak USB Display, connect the display to the target system via the USB cable. The display should display RoboPea Logo and turn to black (or something else) for about 3 second.&lt;br /&gt;
&lt;br /&gt;
If the display keeps showing the white noise animation and the message : Waiting for signal, you should check the dmesg to see what happens. Normally, the driver will prompt the following message when the display has been pluged in :&lt;br /&gt;
&lt;br /&gt;
[ 1814.173232] rp-usbdisp 4-1:1.0: RP USB Display found (#1), Firmware Version: X.XX, S/N: XXXXXXXXXXXX&lt;br /&gt;
&lt;br /&gt;
Once the driver recognizes the display, a framebuffer device will be created. (e.g. /dev/fb0)&lt;br /&gt;
&lt;br /&gt;
Use the following command to see whether framebuffer device is belonged to the USB display:&lt;br /&gt;
&lt;br /&gt;
# cat /proc/fb  &lt;br /&gt;
2 rpusbdisp-fb &amp;lt;&lt;br /&gt;
&lt;br /&gt;
In the above example, /dev/fb2 is the related framebuffer device. To test whether the framebuffer device works, you may using the following command:&lt;br /&gt;
&lt;br /&gt;
# cat /dev/urandom &amp;gt; /dev/fb2&lt;br /&gt;
&lt;br /&gt;
You should see the display screen is filled with random color dots.&lt;br /&gt;
=== V. Make X11 output to the USB display ===&lt;br /&gt;
&lt;br /&gt;
There is a sample X11 config file under the source folder: rpusbdisp/drivers/linux-driver/xserver_conf/10-disp.conf. You can use this sample file as the template to make X11 on your target system to output to the USB display.&lt;br /&gt;
&lt;br /&gt;
STEP1: determine the framebuffer device name of the display. use the command cat /proc/fb&lt;br /&gt;
&lt;br /&gt;
STEP2: modify the 10-disp.conf, change the framebuffer device name to the one determined in STEP1.&lt;br /&gt;
&lt;br /&gt;
STEP3: copy the file 10-disp.conf to the X11&#039;s config folder (/usr/share/X11/xorg.conf.d for most systems).&lt;br /&gt;
&lt;br /&gt;
STEP4: restart the X11 server&lt;br /&gt;
&lt;br /&gt;
The X11 desktop should appear on the USB display.&lt;br /&gt;
== User Mode SDK ==&lt;br /&gt;
&lt;br /&gt;
Besides the Linux kernel driver, we also provide a user mode sdk which is available on Windows, OS X, and Linux.&lt;br /&gt;
&lt;br /&gt;
You can find the SDK in the drivers/usermode-sdk subdirectory.&lt;br /&gt;
&lt;br /&gt;
== Useful commands ==&lt;br /&gt;
# you should see the display screen is filled with random color dots.&lt;br /&gt;
cat /dev/urandom &amp;gt; /dev/fb0&lt;br /&gt;
&lt;br /&gt;
=== Show a picture on the screen ===&lt;br /&gt;
# picture.bmp requirement is bmp format with a resolution of 320 * 240,16 bitmap&lt;br /&gt;
# In linux, use gimp -&amp;gt; save as -&amp;gt; advance options -&amp;gt; 16-bit color&lt;br /&gt;
cat /tmp/picture.bmp &amp;gt; /dev/fb0&lt;br /&gt;
&lt;br /&gt;
# Clear the screen&lt;br /&gt;
dd if=/dev/zero of=/dev/fb0&lt;br /&gt;
&lt;br /&gt;
# Save the contents of the fb0&lt;br /&gt;
dd if=/dev/fb0 of=fbfile&lt;br /&gt;
&lt;br /&gt;
# Write back in the screen&lt;br /&gt;
dd if=fbfile of=/dev/fb0&lt;br /&gt;
&lt;br /&gt;
=== Input string to display on screen ===&lt;br /&gt;
&lt;br /&gt;
Let’s check if the virtual console of the frame buffer has been created:&lt;br /&gt;
&lt;br /&gt;
# ls /sys/class/vtconsole/vtcon*&lt;br /&gt;
/sys/class/vtconsole/vtcon0:&lt;br /&gt;
bind       name       subsystem  uevent&lt;br /&gt;
/sys/class/vtconsole/vtcon1:&lt;br /&gt;
bind       name       subsystem  uevent&lt;br /&gt;
&lt;br /&gt;
The console has been created. Let’s check that it belongs to the frame buffer:&lt;br /&gt;
&lt;br /&gt;
# cat /sys/class/vtconsole/vtcon1/name&lt;br /&gt;
&lt;br /&gt;
(M) frame buffer device&lt;br /&gt;
&lt;br /&gt;
# cat /sys/class/vtconsole/vtcon1/bind&lt;br /&gt;
1&lt;br /&gt;
&lt;br /&gt;
#echo hellowrtnode &amp;gt; /dev/vcs1&lt;br /&gt;
&lt;br /&gt;
=== Input string to display on screen ===&lt;br /&gt;
Let’s check if the virtual console of the frame buffer has been created:&lt;br /&gt;
&lt;br /&gt;
# ls /sys/class/vtconsole/vtcon*&lt;br /&gt;
/sys/class/vtconsole/vtcon0:&lt;br /&gt;
bind       name       subsystem  uevent&lt;br /&gt;
/sys/class/vtconsole/vtcon1:&lt;br /&gt;
bind       name       subsystem  uevent&lt;br /&gt;
&lt;br /&gt;
The console has been created. Let’s check that it belongs to the frame buffer:&lt;br /&gt;
&lt;br /&gt;
# cat /sys/class/vtconsole/vtcon1/name&lt;br /&gt;
&lt;br /&gt;
(M) frame buffer device&lt;br /&gt;
&lt;br /&gt;
# cat /sys/class/vtconsole/vtcon1/bind&lt;br /&gt;
1&lt;br /&gt;
&lt;br /&gt;
#chmod 777 /dev/vcs1&lt;br /&gt;
#echo hellowrtnode &amp;gt; /dev/vcs1&lt;br /&gt;
&lt;br /&gt;
== Refresh firmware and do the following ==&lt;br /&gt;
&lt;br /&gt;
A new device has to be created in the directory /dev:&lt;br /&gt;
&lt;br /&gt;
#ls /dev/input/ -l&lt;br /&gt;
crw-r--r--    1 root     root       13,  64 Sep 17 18:44 event0&lt;br /&gt;
&lt;br /&gt;
#cat /proc/bus/input/devices&lt;br /&gt;
I: Bus=0003 Vendor=0000 Product=0000 Version=0000&lt;br /&gt;
N: Name=&amp;quot;RoboPeakUSBDisplayTS&amp;quot;&lt;br /&gt;
P: Phys=&lt;br /&gt;
S: Sysfs=/devices/virtual/input/input0&lt;br /&gt;
U: Uniq=&lt;br /&gt;
H: Handlers=event0&lt;br /&gt;
B: PROP=0&lt;br /&gt;
B: EV=b&lt;br /&gt;
B: KEY=400 0 0 0 0 0 0 0 0 0 0&lt;br /&gt;
B: ABS=1000003&lt;br /&gt;
&lt;br /&gt;
#cat /dev/input/event0 |hexdump&lt;br /&gt;
&lt;br /&gt;
Touch RoboPeak Mini USB Display, printed on the wrtnode&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [http://wiki.wrtnode.com/index.php?title=WRTnode_add_support_for_RoboPeak_Mini_USB_Display, WRTnode add support for RoboPeak Mini USB Display]&lt;br /&gt;
* [http://docs.robopeak.net/doku.php?id=rpusbdisp_faq#q11, RoboPeak Mini USB Display FAQ]&lt;br /&gt;
&lt;br /&gt;
[[Category:Sensors and Modules]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Raspberry_Pi&amp;diff=554</id>
		<title>Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Raspberry_Pi&amp;diff=554"/>
		<updated>2026-08-21T05:17:52Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== GPIO connector ===&lt;br /&gt;
RPi A+,B+ GPIO J8 40-pin pinout. &lt;br /&gt;
[http://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/Raspberry-Pi-B-Plus-V1.2-Schematics.pdf]&lt;br /&gt;
Models A and B have only the first 26 pins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! GPIO#&lt;br /&gt;
! 2nd fun&lt;br /&gt;
! pin#&lt;br /&gt;
!&lt;br /&gt;
! pin#&lt;br /&gt;
! 2nd fun&lt;br /&gt;
! GPIO#&lt;br /&gt;
|-&lt;br /&gt;
|      - &lt;br /&gt;
|  +3V3 &lt;br /&gt;
| style=&amp;quot;background:orange&amp;quot;| 1 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:red&amp;quot;| 2 &lt;br /&gt;
| +5V   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO2 &lt;br /&gt;
|  SDA1 (I2C)&lt;br /&gt;
| style=&amp;quot;background:#00FFFF&amp;quot;| 3 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:red&amp;quot;| 4 &lt;br /&gt;
| +5V   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO3 &lt;br /&gt;
|  SCL1 (I2C)&lt;br /&gt;
| style=&amp;quot;background:#00FFFF&amp;quot;| 5 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;| 6 &lt;br /&gt;
| GND   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO4 &lt;br /&gt;
|  GCLK &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;| 7 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:#00FF80&amp;quot;| 8 &lt;br /&gt;
| TXD0 (UART)&lt;br /&gt;
| GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|      - &lt;br /&gt;
|   GND &lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;| 9 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:#00FF80&amp;quot;|10 &lt;br /&gt;
| RXD0 (UART) &lt;br /&gt;
| GPIO15&lt;br /&gt;
|-&lt;br /&gt;
| GPIO17 &lt;br /&gt;
|  GEN0 &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|11 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|12 &lt;br /&gt;
| GEN1  &lt;br /&gt;
| GPIO18&lt;br /&gt;
|-&lt;br /&gt;
| GPIO27 &lt;br /&gt;
|  GEN2 &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|13 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|14 &lt;br /&gt;
| GND   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| GPIO22 &lt;br /&gt;
|  GEN3 &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|15 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|16 &lt;br /&gt;
| GEN4  &lt;br /&gt;
| GPIO23&lt;br /&gt;
|-&lt;br /&gt;
|      - &lt;br /&gt;
|  +3V3 &lt;br /&gt;
| style=&amp;quot;background:orange&amp;quot;|17 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|18 &lt;br /&gt;
| GEN5  &lt;br /&gt;
| GPIO24&lt;br /&gt;
|-&lt;br /&gt;
| GPIO10 &lt;br /&gt;
|  MOSI (SPI)&lt;br /&gt;
| style=&amp;quot;background:#FF00FF&amp;quot;|19 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|20 &lt;br /&gt;
| GND   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO9 &lt;br /&gt;
|  MISO (SPI)&lt;br /&gt;
| style=&amp;quot;background:#FF00FF&amp;quot;|21 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|22 &lt;br /&gt;
| GEN6  &lt;br /&gt;
| GPIO25&lt;br /&gt;
|-&lt;br /&gt;
| GPIO11 &lt;br /&gt;
|  SCLK (SPI)&lt;br /&gt;
| style=&amp;quot;background:#FF00FF&amp;quot;|23 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:#FF00FF&amp;quot;|24 &lt;br /&gt;
| CE0_N (SPI)&lt;br /&gt;
| GPIO8&lt;br /&gt;
|-&lt;br /&gt;
|      - &lt;br /&gt;
|   GND &lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|25 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:#FF00FF&amp;quot;|26 &lt;br /&gt;
| CE1_N (SPI)&lt;br /&gt;
| GPIO7&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; colspan=&amp;quot;7&amp;quot; | &#039;&#039;(Models A and B stop here)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EEPROM &lt;br /&gt;
| ID_SD &lt;br /&gt;
| style=&amp;quot;background:yellow&amp;quot;|27 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:yellow&amp;quot;|28 &lt;br /&gt;
| ID_SC &lt;br /&gt;
| EEPROM&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO5 &lt;br /&gt;
|     - &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|29 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|30 &lt;br /&gt;
| GND   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|  GPIO6 &lt;br /&gt;
|     - &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|31 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|32 &lt;br /&gt;
| -     &lt;br /&gt;
| GPIO12&lt;br /&gt;
|-&lt;br /&gt;
| GPIO13 &lt;br /&gt;
|     - &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|33 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|34 &lt;br /&gt;
| GND   &lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| GPIO19 &lt;br /&gt;
|     - &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|35 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|36 &lt;br /&gt;
| -     &lt;br /&gt;
| GPIO16&lt;br /&gt;
|-&lt;br /&gt;
| GPIO26 &lt;br /&gt;
|     - &lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|37 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|38 &lt;br /&gt;
| -     &lt;br /&gt;
| GPIO20&lt;br /&gt;
|-&lt;br /&gt;
|      - &lt;br /&gt;
|   GND &lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;|39 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|40 &lt;br /&gt;
| -     &lt;br /&gt;
| GPIO21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Model B rev 2 also has a pad P6 of 8 pins offering access to an additional 4 GPIO connections.&lt;br /&gt;
[http://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/Raspberry-Pi-Rev-2.1-Model-AB-Schematics.pdf]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function&lt;br /&gt;
! pin#&lt;br /&gt;
!&lt;br /&gt;
! pin#&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
|  +5V &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot;| 1 &lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:orange&amp;quot;| 2 &lt;br /&gt;
| +3V3  &lt;br /&gt;
|-&lt;br /&gt;
| GPIO_GEN7&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|3&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|4 &lt;br /&gt;
| GPIO_GEN8     &lt;br /&gt;
|-&lt;br /&gt;
| GPIO_GEN9&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|5&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:green&amp;quot;|6&lt;br /&gt;
| GPIO_GEN10     &lt;br /&gt;
|-&lt;br /&gt;
| GND&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background:black; color:white&amp;quot;| 8&lt;br /&gt;
| GND   &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Models A and B provide GPIO access to the ACT status LED using GPIO 16.&lt;br /&gt;
Models A+ and B+ provide GPIO access to the ACT status LED using GPIO 47, and the Power status LED using GPIO 35.&lt;br /&gt;
&lt;br /&gt;
== [[application - MX35LFxGE4AB, SPI NAND Flash ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - Keyes 38KHz IR Infrared Transmitter Module]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - u-blox NEO-6M, GPS module ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - DS1302 ,RTC module ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - HC-SR04, Ultrasonic ranging module ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - LPC1768, SPI communication ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - MAX7219, LED dot matrix  ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[bluetooth keyboard auto connect]] ==&lt;br /&gt;
&lt;br /&gt;
== [[RoboPeak Mini USB Display]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - Wifi AP ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - GPS tracker ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - Speech Recognition ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - Alexa ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[aoolication - Greengrass]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - Google Assistant ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - Monitor GPIO interrupt in userspace ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - 3-axis accelerometer, GID-SSS/U10 ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - RFID, PN532 ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[application - RFID, RC522 ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[u-boot]] ==&lt;br /&gt;
&lt;br /&gt;
== [[kernel]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Android]] ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=RTD1073&amp;diff=553</id>
		<title>RTD1073</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=RTD1073&amp;diff=553"/>
		<updated>2026-08-21T05:17:51Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Project info==&lt;br /&gt;
Customer: NetGear&amp;lt;br&amp;gt;&lt;br /&gt;
Product: IP media player&amp;lt;br&amp;gt;&lt;br /&gt;
Chip: RealTek RTD1073&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SVN info==&lt;br /&gt;
[[image:NTV350_REPO_20101123.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Diag&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/branches/diag&lt;br /&gt;
&#039;&#039;&#039;UI&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/branches/UI&lt;br /&gt;
&#039;&#039;&#039;RadioTime&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/branches/radioTime&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Diag kernel&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350OS/branches/diagOS&lt;br /&gt;
&#039;&#039;&#039;RadioTime kernel&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350OS/branches/radioTimeOS&lt;br /&gt;
&lt;br /&gt;
==Release info==&lt;br /&gt;
=== Diag ===&lt;br /&gt;
==== diag-1.0.0.0 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/diag-1.0.0.0&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/08/31&lt;br /&gt;
===== release note =====&lt;br /&gt;
First release with alpha version&amp;lt;br&amp;gt;&lt;br /&gt;
Supported command:&lt;br /&gt;
* play&lt;br /&gt;
* speed&lt;br /&gt;
* stop&lt;br /&gt;
* reset&lt;br /&gt;
* setDigiOutputMode&lt;br /&gt;
* setTVSystem&lt;br /&gt;
* usbDetect&lt;br /&gt;
* ver&lt;br /&gt;
* help&lt;br /&gt;
* exit&lt;br /&gt;
&lt;br /&gt;
==== NTV350_Diag_1.0.1.0 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.1.0&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/09/01&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Fix: Dummy message from USB scan&lt;br /&gt;
* Fix: exit command - kill self before leaving&lt;br /&gt;
* Add: &amp;quot;Unihan&amp;quot; sign before come in diag&lt;br /&gt;
* Add: Display &amp;quot;Firmware version&amp;quot; in ver command&lt;br /&gt;
==== NTV350_Diag_1.0.1.1 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.1.1&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/09/02&lt;br /&gt;
&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Add: add &amp;quot;getAppCRC&amp;quot; command for calculate and get crc of DvdPlayer&lt;br /&gt;
* Fix : Re-open the IR thread&lt;br /&gt;
* Add : Merge the card detecting solution&lt;br /&gt;
* Fix : Printf(&amp;quot;Firmware Version: v&amp;quot;) is printed with the version is found from DvdPlay binary file.&lt;br /&gt;
* Fix : memory card insert/remove message.&lt;br /&gt;
==== NTV350_Diag_1.0.1.2 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.1.2&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/09/03&lt;br /&gt;
&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Fix : trim the version string with control character in ASCII&lt;br /&gt;
==== NTV350_Diag_1.0.1.3 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.1.3&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/09/07&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Fix : system revision&lt;br /&gt;
==== NTV350_Diag_1.0.1.4 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.1.4&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/09/09&lt;br /&gt;
&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Add getKernelCRC command:calculate CRC of kernel, need size as input parameter.&lt;br /&gt;
* Add getSquashCRC command:calculate CRC of last block of SquashFS, need size as input parameter.&lt;br /&gt;
==== NTV350_Diag_1.0.2.0 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.2.0&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/09/27&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Enhance Diag launch time from ~11s to ~6s&lt;br /&gt;
Add: Remove sleep(5) in main.cpp to increase start up speed.&lt;br /&gt;
&lt;br /&gt;
==== NTV350_Diag_1.0.3.0 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.3.0&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/10/15&lt;br /&gt;
===== release note =====&lt;br /&gt;
*Add : Auto play default video(demp.mpg) from USB&lt;br /&gt;
*Add : Remove WatchDog before running diag&lt;br /&gt;
*Fix : Stopall utility not kill DvdPlayer all the time&lt;br /&gt;
==== NTV350_Diag_1.0.3.1 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.3.1&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/10/20&lt;br /&gt;
===== release note =====&lt;br /&gt;
==== NTV350_Diag_1.0.3.2 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.3.2&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/10/22 &lt;br /&gt;
===== release note =====&lt;br /&gt;
* Disable DHCP when DvdPlayer launched&lt;br /&gt;
* Add : play Demo1/Demo2&lt;br /&gt;
==== NTV350_Diag_1.0.3.3 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.3.3&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/10/27 &lt;br /&gt;
===== release note =====&lt;br /&gt;
-Fix: adjust searching Firmware and System version offset.&lt;br /&gt;
==== NTV350_Diag_1.0.3.4 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_Diag_1.0.3.4&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/11/23&lt;br /&gt;
===== release note =====&lt;br /&gt;
Add two command lines.&lt;br /&gt;
A. “play” command line:&lt;br /&gt;
  1. play Demo1          (Demo1 = HD-underwater.mpg)&lt;br /&gt;
  2. play Demo2          (Demo2 = Unihan_Jerry_CBARS100_1K_Tone.ts)&lt;br /&gt;
  3. play file_location    (example: play /mnt/usbmounts/sdb1/movie1.mpg)&lt;br /&gt;
  4. play link_url           (example: play http://192.168.50.194:8080/music/qianli.mp3)&lt;br /&gt;
B. “setVolumeRate” command line:&lt;br /&gt;
     setVolumeRate  rate_value      (where rate value = 0 ~ 30)&lt;br /&gt;
     Example: setVolumeRate  30   (set volume rate to MAX)&lt;br /&gt;
&lt;br /&gt;
=== RadioTime ===&lt;br /&gt;
==== NTV350_RadioTime_1.0.0.0 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_RadioTime_1.0.0.0&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/09/06&lt;br /&gt;
===== release note =====&lt;br /&gt;
* First release UI prototype to NetGear&lt;br /&gt;
* Including search function&lt;br /&gt;
* Still can not play stream from RadioTime due to DTS license&lt;br /&gt;
==== NTV350_RadioTime_1.0.0.1 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_RadioTime_1.0.0.1&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/09/07&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Remove network WORKGROUP layer&lt;br /&gt;
* Downsize the 20MB to 2MB for indexing&lt;br /&gt;
* Win7 PlayTo - Add backward &amp;amp; forward functions&lt;br /&gt;
==== NTV350_RadioTime_1.0.0.2 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_RadioTime_1.0.0.2&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/09/20&lt;br /&gt;
&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Add display status of xml,&lt;br /&gt;
* Add main menu for home and search submenu,&lt;br /&gt;
* Add new UI for NETGEAR,&lt;br /&gt;
* Add function to get radio channel bitrate and formats,&lt;br /&gt;
* Add category for each linking note.&lt;br /&gt;
* Add Netgear request UI(page1,page2,page3,search).&lt;br /&gt;
&lt;br /&gt;
==== NTV350_RadioTime_1.0.0.3 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_RadioTime_1.0.0.3&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/09/27&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Add WN111v2 driver and insert module automatically&lt;br /&gt;
* Add network connecting detection.&lt;br /&gt;
* Add first and last rolling detection.&lt;br /&gt;
* Modify UI as Netgear requested.&lt;br /&gt;
&lt;br /&gt;
==== NTV350_RadioTime_1.0.0.4 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_RadioTime_1.0.0.4&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/10/07&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Add rolling text in page2 and search.&lt;br /&gt;
* Change page3 to vertical scrolling.&lt;br /&gt;
==== NTV350_RadioTime_1.0.0.5 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350SDK/tags/NTV350_RadioTime_1.0.0.5&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/11/03&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Add check font length of scrolling string,&lt;br /&gt;
* Start scrolling after 1 second,&lt;br /&gt;
* Parsing M3U list for continue playing stream in list,&lt;br /&gt;
* Shrink logo screen and button,&lt;br /&gt;
* Add return playing error scheme.&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Qualcomm,_HDK8250(SM8250)&amp;diff=552</id>
		<title>Qualcomm, HDK8250(SM8250)</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Qualcomm,_HDK8250(SM8250)&amp;diff=552"/>
		<updated>2026-08-21T05:17:51Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Build tool ==&lt;br /&gt;
* Snapdragon LLVM Arm toolchain&lt;br /&gt;
&lt;br /&gt;
* GCC Linaro GNU 4.9 – 2014.07  &lt;br /&gt;
&lt;br /&gt;
* Install toolchain - Hexagon 8.3.04 and  Hexagon 8.3.06&lt;br /&gt;
** export HEXAGON_ROOT=$PATH_OF_INTALLL_DIR&lt;br /&gt;
&lt;br /&gt;
* Make bash in the default shell(symlink /bin/sh → dash to /bin/sh → bash)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	 sudo rm /bin/sh &lt;br /&gt;
	 sudo ln -s /bin/bash /bin/sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install repo (dependency with python and git) ... prefer to use python 2.7&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	curl https://storage.googleapis.com/git-repo-downloads/repo-1 &amp;gt; ~/bin/repo&lt;br /&gt;
	chmod a+x ~/bin/repo&lt;br /&gt;
	rm -rf ~/.repo* ~/.gnupg&lt;br /&gt;
	gpg --import&lt;br /&gt;
&lt;br /&gt;
-----BEGIN PGP PUBLIC KEY BLOCK-----&lt;br /&gt;
Version: GnuPG v1.4.11 (GNU/Linux)&lt;br /&gt;
&lt;br /&gt;
mQENBFHRvc8BCADFg45Xx/y6QDC+T7Y/gGc7vx0ww7qfOwIKlAZ9xG3qKunMxo+S&lt;br /&gt;
hPCnzEl3cq+6I1Ww/ndop/HB3N3toPXRCoN8Vs4/Hc7by+SnaLFnacrm+tV5/OgT&lt;br /&gt;
V37Lzt8lhay1Kl+YfpFwHYYpIEBLFV9knyfRXS/428W2qhdzYfvB15/AasRmwmor&lt;br /&gt;
py4NIzSs8UD/SPr1ihqNCdZM76+MQyN5HMYXW/ALZXUFG0pwluHFA7hrfPG74i8C&lt;br /&gt;
zMiP7qvMWIl/r/jtzHioH1dRKgbod+LZsrDJ8mBaqsZaDmNJMhss9g76XvfMyLra&lt;br /&gt;
9DI9/iFuBpGzeqBv0hwOGQspLRrEoyTeR6n1ABEBAAG0H0NvbmxleSBPd2VucyA8&lt;br /&gt;
Y2NvM0BhbmRyb2lkLmNvbT6JATgEEwECACIFAlHRvc8CGwMGCwkIBwMCBhUIAgkK&lt;br /&gt;
CwQWAgMBAh4BAheAAAoJEGe35EhpKzgsP6AIAJKJmNtn4l7hkYHKHFSo3egb6RjQ&lt;br /&gt;
zEIP3MFTcu8HFX1kF1ZFbrp7xqurLaE53kEkKuAAvjJDAgI8mcZHP1JyplubqjQA&lt;br /&gt;
xvv84gK+OGP3Xk+QK1ZjUQSbjOpjEiSZpRhWcHci3dgOUH4blJfByHw25hlgHowd&lt;br /&gt;
a/2PrNKZVcJ92YienaxxGjcXEUcd0uYEG2+rwllQigFcnMFDhr9B71MfalRHjFKE&lt;br /&gt;
fmdoypqLrri61YBc59P88Rw2/WUpTQjgNubSqa3A2+CKdaRyaRw+2fdF4TdR0h8W&lt;br /&gt;
zbg+lbaPtJHsV+3mJC7fq26MiJDRJa5ZztpMn8su20gbLgi2ShBOaHAYDDi5AQ0E&lt;br /&gt;
UdG9zwEIAMoOBq+QLNozAhxOOl5GL3StTStGRgPRXINfmViTsihrqGCWBBUfXlUE&lt;br /&gt;
OytC0mYcrDUQev/8ToVoyqw+iGSwDkcSXkrEUCKFtHV/GECWtk1keyHgR10YKI1R&lt;br /&gt;
mquSXoubWGqPeG1PAI74XWaRx8UrL8uCXUtmD8Q5J7mDjKR5NpxaXrwlA0bKsf2E&lt;br /&gt;
Gp9tu1kKauuToZhWHMRMqYSOGikQJwWSFYKT1KdNcOXLQF6+bfoJ6sjVYdwfmNQL&lt;br /&gt;
Ixn8QVhoTDedcqClSWB17VDEFDFa7MmqXZz2qtM3X1R/MUMHqPtegQzBGNhRdnI2&lt;br /&gt;
V45+1Nnx/uuCxDbeI4RbHzujnxDiq70AEQEAAYkBHwQYAQIACQUCUdG9zwIbDAAK&lt;br /&gt;
CRBnt+RIaSs4LNVeB/0Y2pZ8I7gAAcEM0Xw8drr4omg2fUoK1J33ozlA/RxeA/lJ&lt;br /&gt;
I3KnyCDTpXuIeBKPGkdL8uMATC9Z8DnBBajRlftNDVZS3Hz4G09G9QpMojvJkFJV&lt;br /&gt;
By+01Flw/X+eeN8NpqSuLV4W+AjEO8at/VvgKr1AFvBRdZ7GkpI1o6DgPe7ZqX+1&lt;br /&gt;
dzQZt3e13W0rVBb/bUgx9iSLoeWP3aq/k+/GRGOR+S6F6BBSl0SQ2EF2+dIywb1x&lt;br /&gt;
JuinEP+AwLAUZ1Bsx9ISC0Agpk2VeHXPL3FGhroEmoMvBzO0kTFGyoeT7PR/BfKv&lt;br /&gt;
+H/g3HsL2LOB9uoIm8/5p2TTU5ttYCXMHhQZ81AY&lt;br /&gt;
=AUp4&lt;br /&gt;
-----END PGP PUBLIC KEY BLOCK-----&lt;br /&gt;
&lt;br /&gt;
[Ctrl-D]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sync Android ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd sxr2130-la-1-0-sdx55-tn-1-0_amss_standard_oem_apq.git/sxr2130_apps/LINUX/android&lt;br /&gt;
./sync.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build the application processor Android HLOS images ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install libxml*&lt;br /&gt;
source build/envsetup.sh&lt;br /&gt;
lunch kona-userdebug&lt;br /&gt;
./build.sh dist -j8 |&amp;amp; tee make-log.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Location of Android HLOS images ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ls out/target/product/kona&lt;br /&gt;
abl.elf                            dtb.img                             installed-files-vendor.json   persist                         shareduid_violation_modules.json&lt;br /&gt;
android-info.txt                   dtbo.img                            installed-files-vendor.txt    persist.img                     signed&lt;br /&gt;
appcompat                          dynamic_partition_metadata.txt      integrity                     pgo_profile_file_missing.txt    signed_encrypted&lt;br /&gt;
appcompat.zip                      fake_packages                       ipa                           prebuilt_dtbo.img               soong_to_convert.txt&lt;br /&gt;
boot-debug.img                     filesmap                            kernel                        previous_build_config.mk        super_empty.img&lt;br /&gt;
boot.img                           gen                                 kona-apps-eng.ganzin.zip      product_copy_files_ignored.txt  super.img&lt;br /&gt;
boot.zip                           gensecimage_target.timestamp        kona-coverage-eng.ganzin.zip  product.img                     symbols&lt;br /&gt;
build_fingerprint.txt              installed-files-odm.json            kona-img-eng.ganzin.zip       ramdisk                         system&lt;br /&gt;
build_system_stats.txt             installed-files-odm.txt             kona-symbols-eng.ganzin.zip   ramdisk-debug.img               system.img&lt;br /&gt;
build_thumbprint.txt               installed-files-ramdisk-debug.json  metadata                      ramdisk.img                     testcases&lt;br /&gt;
certificate_violation_modules.txt  installed-files-ramdisk-debug.txt   metadata.img                  ramdisk-recovery.img            userdata.img&lt;br /&gt;
clean_steps.mk                     installed-files-ramdisk.json        module-info.json              recovery                        vbmeta.img&lt;br /&gt;
coverage                           installed-files-ramdisk.txt         obj                           recovery.id                     vbmeta_system.img&lt;br /&gt;
data                               installed-files-recovery.json       obj_arm                       recovery.img                    vendor&lt;br /&gt;
debug_ramdisk                      installed-files-recovery.txt        odm                           recovery-two-step.img           vendor.img&lt;br /&gt;
dexpreopt.config                   installed-files-root.json           odm.img                       root                            verified_assembled_vendor_manifest.xml&lt;br /&gt;
dlkm                               installed-files-root.txt            otatools.zip                  secimage.log                    wall_werror.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NON-HLOS images ==&lt;br /&gt;
=== bootloader ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install libtinfo* gcc-8 p7zip-full&lt;br /&gt;
cd &amp;lt;target_root&amp;gt;/boot_images/QcomPkg/	&lt;br /&gt;
python ./buildex.py --variant LAA -r RELEASE -t 8250,QcomToolsPkg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aDSP ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd sxr2130_adsp/adsp_proc/build/ms&lt;br /&gt;
python build_variant.py 8250.adsp.prod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== cDSP ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd sxr2130_cdsp/cdsp_proc/build/ms&lt;br /&gt;
python build_variant.py 8250.cdsp.prod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SLIP ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp nanopb-0.3.6-linux-x86.tar.gz sxr2130_slpi/slpi_proc/ssc_api&lt;br /&gt;
cd sxr2130_slpi/slpi_proc&lt;br /&gt;
python ssc_api/build/config_nanopb_dependency.py -f nanopb-0.3.6-linux-x86&lt;br /&gt;
cd sxr2130_slpi/slpi_proc/build/ms&lt;br /&gt;
python ./build_variant.py 8250.slpi.prod SENSOR_VARIANT=xr USES_FLAGS=USES_SXR2130_ENABLE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Program images ==&lt;br /&gt;
* boot into fastboot mode in device&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#get device console first, and run following command&lt;br /&gt;
reboot bootloader&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Check device availability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tommy@tommy-ThinkPad-X1-Carbon-5th:~/projects/ganzin/kona_img$ fastboot devices&lt;br /&gt;
45ff8ad1	fastboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Pre load test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tommy@tommy-ThinkPad-X1-Carbon-5th:~/projects/ganzin/kona_img$ fastboot boot boot.img &lt;br /&gt;
downloading &#039;boot.img&#039;...&lt;br /&gt;
OKAY [  2.831s]&lt;br /&gt;
booting...&lt;br /&gt;
OKAY [  0.063s]&lt;br /&gt;
finished. total time: 2.893s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start flash image if boot normally.....&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tommy@tommy-ThinkPad-X1-Carbon-5th:~/projects/ganzin/kona_img$ fastboot flash boot_a boot.img &lt;br /&gt;
target reported max download size of 805306368 bytes&lt;br /&gt;
sending &#039;boot_a&#039; (98304 KB)...&lt;br /&gt;
OKAY [  2.950s]&lt;br /&gt;
writing &#039;boot_a&#039;...&lt;br /&gt;
OKAY [  0.209s]&lt;br /&gt;
finished. total time: 3.159s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Check marker in boot log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#get console first!&lt;br /&gt;
&lt;br /&gt;
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x51df805e]&lt;br /&gt;
[    0.000000] Linux version 4.19.81+ (ganzin@ganzin-sw) (clang version 8.0.12 for Android NDK) #1 SMP PREEMPT Wed Jun 24 19:31:22 CST 2020&lt;br /&gt;
[    0.000000] Machine model: Qualcomm Technologies, Inc. kona HDK&lt;br /&gt;
[    0.000000] earlycon: msm_geni_serial0 at MMIO 0x0000000000a90000 (options &#039;&#039;)&lt;br /&gt;
[    0.000000] bootconsole [msm_geni_serial0] enabled&lt;br /&gt;
[    0.000000] efi: Getting EFI parameters from FDT:&lt;br /&gt;
[    0.000000] efi: UEFI not found.&lt;br /&gt;
[    0.000000] Memory limit set/overridden to 5065MB&lt;br /&gt;
[    0.000000] OF: reserved mem: OVERLAP DETECTED!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=PWM_to_DC&amp;diff=551</id>
		<title>PWM to DC</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=PWM_to_DC&amp;diff=551"/>
		<updated>2026-08-21T05:17:51Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Sensors and Modules&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:pwm2dc_test.jpg|400px|PWM to DC]]&lt;br /&gt;
[[File:pwm2dc.jpg|300px|PWM to DC]]&lt;br /&gt;
== Description ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PWM轉電壓模塊&lt;br /&gt;
這是一個線性轉換模塊,經內部芯片處理輸出PWM數據用電壓信號表達。&lt;br /&gt;
模塊參數&lt;br /&gt;
1、供電電壓：9V ～ 24V&lt;br /&gt;
2、信號輸入電壓範圍：4～24V&lt;br /&gt;
3、信號輸入頻率範圍：50Hz～10KHz&lt;br /&gt;
4、信號輸入佔空比範圍：0～100%&lt;br /&gt;
5、輸出電壓：0.00V ～ 5.00V/0.00V ～ 10.00V&lt;br /&gt;
6、輸入方式：電路板上的S1焊盤：默認是開路, 還沒有使用到。&lt;br /&gt;
7、輸出方式：電路板上的S2焊盤：開路(輸出0.00V ～ 5.00V);短接(輸出0.00V ～ 10.00V),默認是開路。&lt;br /&gt;
8、應用範圍：遠程數據採集與控制設備；&lt;br /&gt;
9、尺寸：(長)26mm * (寬)23mm * (高)10mm&lt;br /&gt;
10、模塊接口：&lt;br /&gt;
24V：電源正極接口(9V ～ 24V)。&lt;br /&gt;
G： 電源地接口。&lt;br /&gt;
IN： 信號輸入正極接口。&lt;br /&gt;
G： 信號輸入負極接口。&lt;br /&gt;
OUT：信號的輸出接口(0.00V ～ 5.00V/0.00V ～ 10.00V)。&lt;br /&gt;
G： 電源地接口。&lt;br /&gt;
注意：輸出0.00V ～ 10.00V時，電源電壓要15伏供電。&lt;br /&gt;
輸出(0.00V ～ 5.00V) 分辨率：0.050V/D(伏/每佔空比)&lt;br /&gt;
輸出(0.00V ～ 10.00V)分辨率：0.100V/D(伏/每佔空比)&lt;br /&gt;
計算被測佔空比公式:(輸出電壓(V)/分辨率) = 佔空比(%)。&lt;br /&gt;
例如: 輸出(0.00V ～ 5.00V) 輸出為2.5V&lt;br /&gt;
(2.5(V)/0.05) = 50(%)。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Testing data ==&lt;br /&gt;
[[File:Pwm2dc_test_data.jpg|PWM to DC testing result]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Sensors and Modules]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=OpenSync&amp;diff=550</id>
		<title>OpenSync</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=OpenSync&amp;diff=550"/>
		<updated>2026-08-21T05:17:51Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Software and Tools&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Yocto ==&lt;br /&gt;
* tree&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
project-spec/meta-user/recipes-apps/opensync&lt;br /&gt;
├── files&lt;br /&gt;
│   ├── opensync-master.zip&lt;br /&gt;
│   └── protobuf-c.patch&lt;br /&gt;
├── opensync.bb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*opensync.bb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# Copyright (C) 2019 Tommy C. Liu&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
SUMMARY = &amp;quot;Opensync&amp;quot;&lt;br /&gt;
SECTION = &amp;quot;PETALINUX/apps&amp;quot;&lt;br /&gt;
LICENSE = &amp;quot;MIT&amp;quot;&lt;br /&gt;
LIC_FILES_CHKSUM = &amp;quot;file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302&amp;quot;&lt;br /&gt;
&lt;br /&gt;
SRC_URI = &amp;quot;file://opensync-master.zip \&lt;br /&gt;
           file://protobuf-c.patch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
S = &amp;quot;${WORKDIR}/opensync-master&amp;quot;&lt;br /&gt;
DEPENDS = &amp;quot;mosquitto libev jansson openssl protobuf-c libpcap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
INHIBIT_PACKAGE_STRIP = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DIST_NAME = &amp;quot;zynq&amp;quot;&lt;br /&gt;
CPU_TYPE = &amp;quot;arm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EXTRA_OEMAKE = &amp;quot;DIST_NAME=&#039;${DIST_NAME}&#039; CPU_TYPE=&#039;${CPU_TYPE}&#039; STRIP=&#039;${STRIP}&#039; LD=&#039;${LD}&#039; CC=&#039;${CC}&#039; CFLAGS=&#039;${CFLAGS} -DCONFIG_INET_GRE_USE_GRETAP -DTARGET_NAME=&amp;quot;\&amp;quot;$(TARGET)\&amp;quot;&amp;quot;&#039; LDFLAGS=&#039;${LDFLAGS} -Iljansson&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
do_install() {&lt;br /&gt;
             install -d ${D}/${bindir}&lt;br /&gt;
             install -m 0755 ${S}/work/native-${DIST_NAME}-${CPU_TYPE}/rootfs/usr/plume/bin/* ${D}/${bindir}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*files - protobuf-c.patch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff -Nur a/src/lib/datapipeline/src/dppline.c b/src/lib/datapipeline/src/dppline.c&lt;br /&gt;
--- a/src/lib/datapipeline/src/dppline.c        2019-01-31 16:28:16.706026178 +0800&lt;br /&gt;
+++ b/src/lib/datapipeline/src/dppline.c        2019-02-01 12:07:44.301173505 +0800&lt;br /&gt;
@@ -27,7 +27,7 @@&lt;br /&gt;
 #include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
-#include &amp;lt;protobuf-c.h&amp;gt;&lt;br /&gt;
+#include &amp;lt;protobuf-c/protobuf-c.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;target.h&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OpenWrt ==&lt;br /&gt;
*tree&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openwrt/package/network/utils/opensync/&lt;br /&gt;
├── Makefile&lt;br /&gt;
└── patches&lt;br /&gt;
    ├── 000-arm-mk.patch&lt;br /&gt;
    ├── 001-ssize.patch&lt;br /&gt;
    └── 002-protobuf-c.patch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Makefile&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# Copyright (C) 2019 Tommy C. Liu&lt;br /&gt;
#&lt;br /&gt;
# This is free software, licensed under the GNU General Public License v2.&lt;br /&gt;
# See /LICENSE for more information.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
include $(TOPDIR)/rules.mk&lt;br /&gt;
&lt;br /&gt;
PKG_NAME:=opensync&lt;br /&gt;
PKG_VERSION:=master&lt;br /&gt;
PKG_RELEASE:=1&lt;br /&gt;
PKG_MAINTAINER:=Tommy C. Liu &amp;lt;tommy.using@gmail.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz&lt;br /&gt;
&lt;br /&gt;
PKG_LICENSE:=GPL-2.0&lt;br /&gt;
PKG_LICENSE_FILES:=docs/LICENSE&lt;br /&gt;
&lt;br /&gt;
PKG_USE_MIPS16:=0&lt;br /&gt;
#PKG_AUTOMAKE_PATHS:=src&lt;br /&gt;
&lt;br /&gt;
PKG_SOURCE_PROTO:=git&lt;br /&gt;
PKG_SOURCE_URL:=https://github.com/plume-design/opensync&lt;br /&gt;
PKG_SOURCE_VERSION:=e368be0df2763895ed7877ae9e802c40fd38af40&lt;br /&gt;
PKG_MIRROR_HASH:=2036cedd366c9f38583986d27b1aabb49a0e120641cc9e9023c83e4ac5dae5ed&lt;br /&gt;
&lt;br /&gt;
include $(INCLUDE_DIR)/package.mk&lt;br /&gt;
#CONFIGURE_PATH:=src&lt;br /&gt;
#MAKE_PATH:=src&lt;br /&gt;
&lt;br /&gt;
define Package/opensync&lt;br /&gt;
  SECTION:=net&lt;br /&gt;
  CATEGORY:=Network&lt;br /&gt;
  SUBMENU:=wireless&lt;br /&gt;
  TITLE:=Cloud-agnostic software for the delivery, curation, and management of services for the modern home.&lt;br /&gt;
  URL:=https://github.com/plume-design/opensync&lt;br /&gt;
  DEPENDS:=+jansson +libev +libprotobuf-c +libopenssl +libmosquitto +zlib&lt;br /&gt;
  CFLAGS=&amp;quot;$(TARGET_CFLAGS) -Wall&amp;quot;&lt;br /&gt;
endef&lt;br /&gt;
&lt;br /&gt;
define Package/opensync/description&lt;br /&gt;
It acts as a silicon, CPE, and cloud-agnostic connection between in-home hardware devices and the cloud. It provides modern utilities for collecting measurements and statistics from devices, controlling and managing devices, and provides capabilities for specific services including Wi-Fi meshing, access control, cyber security, parental controls, and IoT onboarding and telemetry.&lt;br /&gt;
endef&lt;br /&gt;
&lt;br /&gt;
define Build/Compile&lt;br /&gt;
        $(call Build/Compile/Default)&lt;br /&gt;
endef&lt;br /&gt;
&lt;br /&gt;
define Package/opensync/install&lt;br /&gt;
	$(INSTALL_DIR) $(1)/usr/sbin&lt;br /&gt;
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/work/native/bin/* $(1)/usr/sbin/&lt;br /&gt;
endef&lt;br /&gt;
&lt;br /&gt;
$(eval $(call BuildPackage,opensync))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*patche - 000-arm-mk.patch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff -Nur build/arm.mk build.new/arm.mk&lt;br /&gt;
--- a/build/arm.mk	1970-01-01 08:00:00.000000000 +0800&lt;br /&gt;
+++ b/build.new/arm.mk	2019-01-30 14:07:56.003034972 +0800&lt;br /&gt;
@@ -0,0 +1,61 @@&lt;br /&gt;
+# Copyright (c) 2015, Plume Design Inc. All rights reserved.&lt;br /&gt;
+# &lt;br /&gt;
+# Redistribution and use in source and binary forms, with or without&lt;br /&gt;
+# modification, are permitted provided that the following conditions are met:&lt;br /&gt;
+#    1. Redistributions of source code must retain the above copyright&lt;br /&gt;
+#       notice, this list of conditions and the following disclaimer.&lt;br /&gt;
+#    2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
+#       notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
+#       documentation and/or other materials provided with the distribution.&lt;br /&gt;
+#    3. Neither the name of the Plume Design Inc. nor the&lt;br /&gt;
+#       names of its contributors may be used to endorse or promote products&lt;br /&gt;
+#       derived from this software without specific prior written permission.&lt;br /&gt;
+# &lt;br /&gt;
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND&lt;br /&gt;
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED&lt;br /&gt;
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE&lt;br /&gt;
+# DISCLAIMED. IN NO EVENT SHALL Plume Design Inc. BE LIABLE FOR ANY&lt;br /&gt;
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES&lt;br /&gt;
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;&lt;br /&gt;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND&lt;br /&gt;
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT&lt;br /&gt;
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
+&lt;br /&gt;
+#&lt;br /&gt;
+# native configuration&lt;br /&gt;
+#&lt;br /&gt;
+&lt;br /&gt;
+BUILD_SHARED_LIB = n&lt;br /&gt;
+&lt;br /&gt;
+DIST_NAME = $(shell if [ -e /etc/os-release ]; then . /etc/os-release; echo $$ID$$VERSION_ID; fi)&lt;br /&gt;
+ifneq ($(DIST_NAME),)&lt;br /&gt;
+endif&lt;br /&gt;
+&lt;br /&gt;
+SDK_ROOTFS     = $(OBJDIR)/rootfs&lt;br /&gt;
+&lt;br /&gt;
+CC             = arm-none-eabi-gcc&lt;br /&gt;
+CXX            = arm-none-eabi-g++&lt;br /&gt;
+AR             = arm-none-eabi-ar&lt;br /&gt;
+STRIP          = arm-none-eabi-strip -g&lt;br /&gt;
+&lt;br /&gt;
+&lt;br /&gt;
+# Includes&lt;br /&gt;
+CFLAGS += -I/usr/include/protobuf-c&lt;br /&gt;
+# Flags&lt;br /&gt;
+CFLAGS += -O3 -pipe&lt;br /&gt;
+CFLAGS += -rdynamic&lt;br /&gt;
+CFLAGS += -fno-caller-saves&lt;br /&gt;
+CFLAGS += -fno-strict-aliasing&lt;br /&gt;
+CFLAGS += -fasynchronous-unwind-tables&lt;br /&gt;
+CFLAGS += -Wno-error=unused-but-set-variable&lt;br /&gt;
+CFLAGS += -Wno-error=cpp&lt;br /&gt;
+&lt;br /&gt;
+# Defines&lt;br /&gt;
+CFLAGS += -D_U_=&amp;quot;__attribute__((unused))&amp;quot;&lt;br /&gt;
+&lt;br /&gt;
+export CC&lt;br /&gt;
+export CXX&lt;br /&gt;
+export CFLAGS&lt;br /&gt;
+export LIBS&lt;br /&gt;
+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*patche - 001-ssize.patch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff -Nur a/src/lib/read_until/inc/read_until.h b/src/lib/read_until/inc/read_until.h&lt;br /&gt;
--- a/src/lib/read_until/inc/read_until.h	2019-01-30 14:26:18.296457064 +0800&lt;br /&gt;
+++ b/src/lib/read_until/inc/read_until.h	2019-01-30 14:25:59.911734213 +0800&lt;br /&gt;
@@ -29,6 +29,7 @@&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
+#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * This is quite similar to fgets() except that it works with non-blocking I/O&lt;br /&gt;
Binary files /home/tommy/Projects/plume/openwrt/build_dir/target-arm_cortex-a9+neon_musl_eabi/opensync-master/src/lib/read_until/inc/.read_until.h.swp and /home/tommy/Projects/plume/openwrt/build_dir/target-arm_cortex-a9+neon_musl_eabi/opensync-master.new/src/lib/read_until/inc/.read_until.h.swp differ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*patche - 002-protobuf-c.patch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff -Nur a/src/lib/datapipeline/src/dppline.c b/src/lib/datapipeline/src/dppline.c&lt;br /&gt;
--- a/src/lib/datapipeline/src/dppline.c	2019-01-30 14:56:43.275897685 +0800&lt;br /&gt;
+++ b/src/lib/datapipeline/src/dppline.c	2019-01-30 14:56:11.527669148 +0800&lt;br /&gt;
@@ -27,7 +27,7 @@&lt;br /&gt;
 #include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
-#include &amp;lt;protobuf-c.h&amp;gt;&lt;br /&gt;
+#include &amp;lt;protobuf-c/protobuf-c.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;target.h&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Software and Tools]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=ODROID-C4&amp;diff=549</id>
		<title>ODROID-C4</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=ODROID-C4&amp;diff=549"/>
		<updated>2026-08-21T05:17:50Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:C4_k.jpg|500px|ODROID-C4]]&lt;br /&gt;
&lt;br /&gt;
== Board Description ==&lt;br /&gt;
[[File:C4_board.jpg|600px|ODROID-C4 Board]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:C4_board_detail.png|600px|ODROID-C4 Detail]]&lt;br /&gt;
&lt;br /&gt;
== Pin definition ==&lt;br /&gt;
[[file:C4_40pinmap_rev0.4.png|500px|]]&lt;br /&gt;
&lt;br /&gt;
* UART signals are driven at 1.8V.&lt;br /&gt;
&lt;br /&gt;
== Build Android ==&lt;br /&gt;
&lt;br /&gt;
=== Download Toolchains ===&lt;br /&gt;
; U-boot&lt;br /&gt;
: http://releases.linaro.org/archive/14.09/components/toolchain/binaries/gcc-linaro-aarch64-none-elf-4.9-2014.09_linux.tar.xz&lt;br /&gt;
: http://releases.linaro.org/archive/14.04/components/toolchain/binaries/gcc-linaro-arm-none-eabi-4.8-2014.04_linux.tar.xz&lt;br /&gt;
; Linux kernel&lt;br /&gt;
: https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz&lt;br /&gt;
&lt;br /&gt;
=== Set PATH ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ export PATH=$PATH:/opt/toolchains/gcc-linaro-aarch64-none-elf-4.9-2014.09_linux/bin&lt;br /&gt;
$ export PATH=$PATH:/opt/toolchains/gcc-linaro-arm-none-eabi-4.8-2014.04_linux/bin&lt;br /&gt;
$ export PATH=$PATH:/opt/toolchains/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Check out full source code ===&lt;br /&gt;
; 32 bit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir odroid-c4&lt;br /&gt;
$ cd odroid-c4&lt;br /&gt;
$ repo init -u https://github.com/hardkernel/android.git -b g12_9.0.0_master&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
; 64 bit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mkdir odroid-c4&lt;br /&gt;
$ cd odroid-c4&lt;br /&gt;
$ repo init -u https://github.com/hardkernel/android.git -b g12_9.0.0_64_master&lt;br /&gt;
$ repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Build ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ source build/envsetup.sh&lt;br /&gt;
$ lunch odroidc4-eng&lt;br /&gt;
$ make -j&amp;lt;core number&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== One touch self install ==&lt;br /&gt;
; Create image&lt;br /&gt;
: make -j&amp;lt;core number&amp;gt; selfinstall&lt;br /&gt;
&lt;br /&gt;
; Burn image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo dd if=out/target/product/odroidc4/selfinstall-odroidc4.img of=/dev/sdd&lt;br /&gt;
$ sync&lt;br /&gt;
$ sudo eject /dev/sdd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Android note ==&lt;br /&gt;
* Disable ICMP for enable ping&lt;br /&gt;
** sysctl -w net.ipv4.icmp_echo_ignore_all=0&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://wiki.odroid.com/odroid-c4/software/building_android, ODROID-C4 Building android]&lt;br /&gt;
* [https://wiki.odroid.com/odroid-c4/odroid-c4, ODROID-C4]&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Nordic,_nRF52_Preview_DK&amp;diff=548</id>
		<title>Nordic, nRF52 Preview DK</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Nordic,_nRF52_Preview_DK&amp;diff=548"/>
		<updated>2026-08-21T05:17:50Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prepare ==&lt;br /&gt;
=== Install SDK ===&lt;br /&gt;
# Get latest SDK from https://developer.nordicsemi.com/nRF52_SDK/nRF52_SDK_v0.x.x/ (ex. nRF52_SDK_0.9.2_dbc28c9.zip)&lt;br /&gt;
# Get SDK with FreeRTOS example from http://developer.nordicsemi.com/nRF5_SDK/nRF5_SDK_v11.x.x/ (nRF5_SDK_11.0.0-2.alpha_bc3f6a0.zip)&lt;br /&gt;
# Edit ./components/toolchain/gcc/Makefile.posix to fit your toolchain setting if necessary&lt;br /&gt;
&lt;br /&gt;
=== Install JLink ===&lt;br /&gt;
# Download &amp;quot;Software and Document pack&amp;quot; from https://www.segger.com/jlink-software.html according your platform (ex. x86_64)&lt;br /&gt;
# decompress and make a symbolic to /opt/SEGGER/JLink&lt;br /&gt;
## ln -s ~/Downloads/JLink_Linux_V510c_x86_64 /opt/SEGGER/JLink&lt;br /&gt;
=== Toolchain ===&lt;br /&gt;
sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install gcc-arm-none-eabi&lt;br /&gt;
=== Programming ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Softdevice&lt;br /&gt;
    ex.&lt;br /&gt;
    sudo /home/tommy/projects/mbed/nRF52/NrfJProg_7_7_0_Linux/nrfjprog --family NRF52 --program ~/projects/mbed/nRF52/s132_nrf52_1.0.0-3.alpha/s132_nrf52_1.0.0-3.alpha_softdevice.hex&lt;br /&gt;
&lt;br /&gt;
2. change dir to example &lt;br /&gt;
    ex.&lt;br /&gt;
    sudo ~/projects/mbed/nRF52/NrfJProg_7_7_0_Linux/nrfjprog --sectorerase --family nRF52 --program _build/nrf52832_xxaa_s132.hex&lt;br /&gt;
&lt;br /&gt;
3. sudo ~/projects/mbed/nRF52/NrfJProg_7_7_0_Linux/nrfjprog --sectorerase --family nRF52 --program _build/nrf52832_xxaa.hex&lt;br /&gt;
4. power recycle to take effect&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tommy@tommy-HP-EliteBook-Folio-1040-G2:~/projects/mbed/nordic/nRF52/nRF5_SDK_11.0.0_89a8197/examples/ble_peripheral/ble_app_beacon/pca10040/s132/armgcc$ sudo ~/projects/mbed/nordic/tools/nrfjprog --sectorerase --family nRF52 --program ~/projects/mbed/nordic/nRF52/s132/s132_nrf52_1.0.0-3.alpha_softdevice.hex &lt;br /&gt;
Parsing hex file.&lt;br /&gt;
Erasing page at address 0x0.&lt;br /&gt;
Erasing page at address 0x3000.&lt;br /&gt;
Erasing page at address 0x4000.&lt;br /&gt;
Erasing page at address 0x5000.&lt;br /&gt;
Erasing page at address 0x6000.&lt;br /&gt;
Erasing page at address 0x7000.&lt;br /&gt;
Erasing page at address 0x8000.&lt;br /&gt;
Erasing page at address 0x9000.&lt;br /&gt;
Erasing page at address 0xA000.&lt;br /&gt;
Erasing page at address 0xB000.&lt;br /&gt;
Erasing page at address 0xC000.&lt;br /&gt;
Erasing page at address 0xD000.&lt;br /&gt;
Erasing page at address 0xE000.&lt;br /&gt;
Erasing page at address 0xF000.&lt;br /&gt;
Erasing page at address 0x10000.&lt;br /&gt;
Erasing page at address 0x11000.&lt;br /&gt;
Erasing page at address 0x12000.&lt;br /&gt;
Erasing page at address 0x13000.&lt;br /&gt;
Erasing page at address 0x14000.&lt;br /&gt;
Erasing page at address 0x15000.&lt;br /&gt;
Erasing page at address 0x16000.&lt;br /&gt;
Erasing page at address 0x17000.&lt;br /&gt;
Erasing page at address 0x18000.&lt;br /&gt;
Erasing page at address 0x19000.&lt;br /&gt;
Erasing page at address 0x1A000.&lt;br /&gt;
Erasing page at address 0x1B000.&lt;br /&gt;
Erasing page at address 0x1C000.&lt;br /&gt;
Erasing page at address 0x1D000.&lt;br /&gt;
Applying system reset.&lt;br /&gt;
Checking that the area to write is not protected.&lt;br /&gt;
Programing device.&lt;br /&gt;
tommy@tommy-HP-EliteBook-Folio-1040-G2:~/projects/mbed/nordic/nRF52/nRF5_SDK_11.0.0_89a8197/examples/ble_peripheral/ble_app_beacon/pca10040/s132/armgcc$ sudo ~/projects/mbed/nordic/tools/nrfjprog --sectorerase --family nRF52 --program _build/nrf52832_xxaa_s132.hex &lt;br /&gt;
Parsing hex file.&lt;br /&gt;
Erasing page at address 0x1C000.&lt;br /&gt;
Erasing page at address 0x1D000.&lt;br /&gt;
Erasing page at address 0x1E000.&lt;br /&gt;
Erasing page at address 0x1F000.&lt;br /&gt;
Applying system reset.&lt;br /&gt;
Checking that the area to write is not protected.&lt;br /&gt;
Programing device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Console, UART ===&lt;br /&gt;
[[File:nrf52_cp2105.jpg|border|350px|nRF52 preview DK + CP2105]]&lt;br /&gt;
* cp2105 in host&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nRF52        Host&lt;br /&gt;
-----------------&lt;br /&gt;
RX           TX&lt;br /&gt;
CTS          RTS&lt;br /&gt;
TX           RX&lt;br /&gt;
RTS          CTS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tool, nRF Connect ===&lt;br /&gt;
[[File:Nrf-connect.png|border|350px|nRF Connect v1.0]]&lt;br /&gt;
&lt;br /&gt;
=== App source ===&lt;br /&gt;
* git clone https://github.com/NordicSemiconductor/Android-nRF-Toolbox&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
* git clone https://bitbucket.org/tommy0804/nrf52 (based on nRF52_SDK_0.9.2_dbc28c9.zip)&lt;br /&gt;
&lt;br /&gt;
== [[nRF52 Application - HMC5883L( 3 Axis Digital Compass)]] ==&lt;br /&gt;
&lt;br /&gt;
== [[ nRF52 Application - MAX7219, Serially Interfaced, 8-Digit LED Display Drivers (scrolling text) ]] ==&lt;br /&gt;
&lt;br /&gt;
== [[ nRF52 Application - zephyr, small, scalable real-time operating system ]] ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Netgem&amp;diff=547</id>
		<title>Netgem</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Netgem&amp;diff=547"/>
		<updated>2026-08-21T05:17:50Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Project info==&lt;br /&gt;
Customer: Netgem&amp;lt;br&amp;gt;&lt;br /&gt;
Product: VDSL/LTE/2.4G/5G media gateway&amp;lt;br&amp;gt;&lt;br /&gt;
Main Chip: Lantiq GRX388&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SVN info==&lt;br /&gt;
*Main SDK&lt;br /&gt;
** svn+ssh://172.16.1.4/var/svn/Netgem/UGW-5.4/trunk&lt;br /&gt;
** file:///var/svn/Netgem/UGW-5.4/trunk&lt;br /&gt;
*AR9580&lt;br /&gt;
** svn+ssh://172.16.1.4/var/svn/Netgem/atherous/trunk&lt;br /&gt;
** file:///var/svn/Netgem/atherous/trunk&lt;br /&gt;
&lt;br /&gt;
==Build note==&lt;br /&gt;
* Using GNU make-3.80 to build the SDK&lt;br /&gt;
* Change profile&lt;br /&gt;
** ./scripts/ltq_change_environment.sh switch&lt;br /&gt;
* Build package only&lt;br /&gt;
** make package/feeds/open_applications/protobuf-compile V=99&lt;br /&gt;
* Config kernel_only&lt;br /&gt;
** If you want, you can also modify the kernel config for the selected target system. &lt;br /&gt;
** simply run &amp;quot;make kernel_menuconfig&amp;quot; and the build system will unpack the kernel sources (if necessary), run menuconfig inside of the kernel tree, and then copy the kernel config to target/linux/&amp;lt;platform&amp;gt;/config so that it is preserved over &amp;quot;make clean&amp;quot; calls. &lt;br /&gt;
* texinfo &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;should under version 5&amp;lt;/span&amp;gt;, for example, texinfo-4.12.tar.gz&lt;br /&gt;
* Reference &lt;br /&gt;
** http://www.landley.net/writing/rootfs-howto.html&lt;br /&gt;
* Default ID / PASS : root / admin&lt;br /&gt;
&lt;br /&gt;
==Programming note==&lt;br /&gt;
* switch jumper to UART mode&lt;br /&gt;
** cat ARX388_GW_HE_ADSL_SLCNAND_SAMPLE/u-boot.asc &amp;gt; /dev/ttyUSB0&lt;br /&gt;
** run update_gphyfirmware&lt;br /&gt;
** &amp;lt;&amp;lt;before update_nandboot, may run &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;nand scrub&amp;lt;/span&amp;gt; to erase whole nand first&amp;gt;&amp;gt;&lt;br /&gt;
** run update_nandboot&lt;br /&gt;
* switch jumper to NAND&lt;br /&gt;
** run update_gphyfirmware&lt;br /&gt;
** check &amp;quot;Internal phy firmware version: &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;0x8434&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Release info==&lt;br /&gt;
=== Netgem-GRX388-1.0.0.0 ===&lt;br /&gt;
==== release date ====&lt;br /&gt;
* 2013/09/24&lt;br /&gt;
&lt;br /&gt;
==== release note ====&lt;br /&gt;
* Day0 patch&lt;br /&gt;
* Sync Led with LTE plug/unplug Tx/Rx&lt;br /&gt;
* Add plug/unplug script (etc/hotplug.d/usb/netgem_load_drv.hotplug)&lt;br /&gt;
* Add Lte routing script (etc/hotplug.d/net/netgem.hotplug)&lt;br /&gt;
* Copy wifi &amp;amp; lte deamons into usr/sbin &lt;br /&gt;
* Backup .config for SDK and kernel in unihan folder&lt;br /&gt;
* Mdify config/VRX388_GW_HE_VDSL_NON_BOND_LTE_SLCNAND_SAMPLE/.config for Netgem HW design&lt;br /&gt;
&lt;br /&gt;
=== Netgem-GRX388-1.0.0.1 ===&lt;br /&gt;
==== release date ====&lt;br /&gt;
2013/10/07&lt;br /&gt;
==== release note ====&lt;br /&gt;
* Change UGW path to trunk in atherous Makefile&lt;br /&gt;
* Skip copy iwconfig into UGW from atherous porting&lt;br /&gt;
* Fixing the PPA warning msgs during LTE UL throughput test&lt;br /&gt;
* Add release note in SDK&lt;br /&gt;
* Move /sbin behind /usr/sbin in order to avoid using wong iwconfig&lt;br /&gt;
* Add SW version&lt;br /&gt;
&lt;br /&gt;
=== Netgem-GRX388-1.0.0.2 ===&lt;br /&gt;
==== release date ====&lt;br /&gt;
2013/10/14&lt;br /&gt;
==== release note ====&lt;br /&gt;
* Enable Statistic/System Performance in Web&lt;br /&gt;
&lt;br /&gt;
=== Netgem-GRX388-1.0.0.3 ===&lt;br /&gt;
==== release date ====&lt;br /&gt;
2013/10/15&lt;br /&gt;
==== release note ====&lt;br /&gt;
* Add 5G security WPA2 &amp;amp; pass:12345678&lt;br /&gt;
* Ath still needs wireless_tools under /sbin&lt;br /&gt;
For LTQ 2.4G iwconfig version issue, just do not copy iwconfig to /sbin&lt;br /&gt;
* Force 5G to HT40 MCS rate&lt;br /&gt;
&lt;br /&gt;
=== Netgem-GRX388-1.0.0.4 ===&lt;br /&gt;
==== release date ====&lt;br /&gt;
2013/10/18&lt;br /&gt;
==== release note ====&lt;br /&gt;
* Change usb0 as lte0 for performance graphic&lt;br /&gt;
&lt;br /&gt;
=== Netgem-GRX388-1.0.0.5 ===&lt;br /&gt;
==== release date ====&lt;br /&gt;
2013/10/18&lt;br /&gt;
==== release note ====&lt;br /&gt;
* No more change but atherous SDK which remove wireless_tools for confuse 2.4G/5G switching&lt;br /&gt;
* Add dual WAN support in config/VRX388_GW_HE_VDSL_NON_BOND_LTE_SLCNAND_SAMPLE&lt;br /&gt;
=== Netgem-GRX388-1.0.1.0 ===&lt;br /&gt;
==== release date ====&lt;br /&gt;
2013/12/11&lt;br /&gt;
==== release note ====&lt;br /&gt;
* Sync led when TX/RX&lt;br /&gt;
* Fixed - 2.4G/5G switching issue by patches&lt;br /&gt;
** patch 01-01-00-UGW-5.4-SW-CD-WLAN-patch&lt;br /&gt;
** patch 02-01-00-UGW-5.4-SW-CD-WLAN-3.4.1-patch&lt;br /&gt;
** patch UGW-5.4-ATHEROS-CD&lt;br /&gt;
* Support 5G control from web&lt;br /&gt;
=== Netgem-GRX388-1.0.1.1 ===&lt;br /&gt;
==== release date ====&lt;br /&gt;
2013/12/20&lt;br /&gt;
&lt;br /&gt;
==== release note ====&lt;br /&gt;
* To indicate the wifi deamon the AP is down or up&lt;br /&gt;
* Add Dual_Wan and DNS solutions which provided by Ltq&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=NXP,_i.MX_6UL&amp;diff=546</id>
		<title>NXP, i.MX 6UL</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=NXP,_i.MX_6UL&amp;diff=546"/>
		<updated>2026-08-21T05:17:49Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Mcimx6ul-evk.jpg|500px|i.MX 6UL EVB]]&lt;br /&gt;
== Build ==&lt;br /&gt;
* Get fsl_yocto-L4.1.15_2.0.0-ga.tar.gz&lt;br /&gt;
** Install the `repo` utility: (only need to do this once)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$: mkdir ~/bin&lt;br /&gt;
$: curl http://commondatastorage.googleapis.com/git-repo-downloads/repo  &amp;gt; ~/bin/repo&lt;br /&gt;
$: chmod a+x ~/bin/repo&lt;br /&gt;
$: PATH=${PATH}:~/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
** Download the BSP Yocto Project Environment into your directory&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$: mkdir fsl-arm-yocto-bsp&lt;br /&gt;
$: cd fsl-arm-yocto-bsp&lt;br /&gt;
$: repo init -u git://git.freescale.com/imx/fsl-arm-yocto-bsp.git -b imx-4.1-krogoth&lt;br /&gt;
$: repo sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patches - m4-1.4.17 ==&lt;br /&gt;
* fseeko.patch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--- ./tmp/work/x86_64-linux/m4-native/1.4.17-r0/m4-1.4.17/lib/fseeko.c	2019-11-13 22:03:56.999217823 +0800&lt;br /&gt;
+++ /home/tommy/Downloads/gnulib/lib/fseeko.c	2019-11-13 21:49:41.532465868 +0800&lt;br /&gt;
@@ -1,9 +1,9 @@&lt;br /&gt;
 /* An fseeko() function that, together with fflush(), is POSIX compliant.&lt;br /&gt;
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.&lt;br /&gt;
+   Copyright (C) 2007-2019 Free Software Foundation, Inc.&lt;br /&gt;
 &lt;br /&gt;
    This program is free software; you can redistribute it and/or modify&lt;br /&gt;
    it under the terms of the GNU General Public License as published by&lt;br /&gt;
-   the Free Software Foundation; either version 3, or (at your option)&lt;br /&gt;
+   the Free Software Foundation; either version 2, or (at your option)&lt;br /&gt;
    any later version.&lt;br /&gt;
 &lt;br /&gt;
    This program is distributed in the hope that it will be useful,&lt;br /&gt;
@@ -12,7 +12,7 @@&lt;br /&gt;
    GNU General Public License for more details.&lt;br /&gt;
 &lt;br /&gt;
    You should have received a copy of the GNU General Public License along&lt;br /&gt;
-   with this program; if not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.  */&lt;br /&gt;
+   with this program; if not, see &amp;lt;https://www.gnu.org/licenses/&amp;gt;.  */&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;config.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
@@ -33,9 +33,9 @@&lt;br /&gt;
 #endif&lt;br /&gt;
 #if _GL_WINDOWS_64_BIT_OFF_T&lt;br /&gt;
 # undef fseeko&lt;br /&gt;
-# if HAVE__FSEEKI64 /* msvc, mingw64 */&lt;br /&gt;
+# if HAVE__FSEEKI64 &amp;amp;&amp;amp; HAVE_DECL__FSEEKI64 /* msvc, mingw since msvcrt8.0, mingw64 */&lt;br /&gt;
 #  define fseeko _fseeki64&lt;br /&gt;
-# else /* mingw */&lt;br /&gt;
+# else /* mingw before msvcrt8.0 */&lt;br /&gt;
 #  define fseeko fseeko64&lt;br /&gt;
 # endif&lt;br /&gt;
 #endif&lt;br /&gt;
@@ -47,11 +47,13 @@&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
   /* These tests are based on fpurge.c.  */&lt;br /&gt;
-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */&lt;br /&gt;
+#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1&lt;br /&gt;
+  /* GNU libc, BeOS, Haiku, Linux libc5 */&lt;br /&gt;
   if (fp-&amp;gt;_IO_read_end == fp-&amp;gt;_IO_read_ptr&lt;br /&gt;
       &amp;amp;&amp;amp; fp-&amp;gt;_IO_write_ptr == fp-&amp;gt;_IO_write_base&lt;br /&gt;
       &amp;amp;&amp;amp; fp-&amp;gt;_IO_save_base == NULL)&lt;br /&gt;
-#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */&lt;br /&gt;
+#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__&lt;br /&gt;
+  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */&lt;br /&gt;
 # if defined __SL64 &amp;amp;&amp;amp; defined __SCLE /* Cygwin */&lt;br /&gt;
   if ((fp-&amp;gt;_flags &amp;amp; __SL64) == 0)&lt;br /&gt;
     {&lt;br /&gt;
@@ -79,7 +81,7 @@&lt;br /&gt;
 #elif defined __minix               /* Minix */&lt;br /&gt;
   if (fp_-&amp;gt;_ptr == fp_-&amp;gt;_buf&lt;br /&gt;
       &amp;amp;&amp;amp; (fp_-&amp;gt;_ptr == NULL || fp_-&amp;gt;_count == 0))&lt;br /&gt;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */&lt;br /&gt;
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */&lt;br /&gt;
   if (fp_-&amp;gt;_ptr == fp_-&amp;gt;_base&lt;br /&gt;
       &amp;amp;&amp;amp; (fp_-&amp;gt;_ptr == NULL || fp_-&amp;gt;_cnt == 0))&lt;br /&gt;
 #elif defined __UCLIBC__            /* uClibc */&lt;br /&gt;
@@ -115,17 +117,20 @@&lt;br /&gt;
       off_t pos = lseek (fileno (fp), offset, whence);&lt;br /&gt;
       if (pos == -1)&lt;br /&gt;
         {&lt;br /&gt;
-#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */&lt;br /&gt;
+#if defined __sferror || defined __DragonFly__ || defined __ANDROID__&lt;br /&gt;
+          /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */&lt;br /&gt;
           fp_-&amp;gt;_flags &amp;amp;= ~__SOFF;&lt;br /&gt;
 #endif&lt;br /&gt;
           return -1;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */&lt;br /&gt;
+#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1&lt;br /&gt;
+      /* GNU libc, BeOS, Haiku, Linux libc5 */&lt;br /&gt;
       fp-&amp;gt;_flags &amp;amp;= ~_IO_EOF_SEEN;&lt;br /&gt;
       fp-&amp;gt;_offset = pos;&lt;br /&gt;
-#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */&lt;br /&gt;
-# if defined __CYGWIN__&lt;br /&gt;
+#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__&lt;br /&gt;
+      /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */&lt;br /&gt;
+# if defined __CYGWIN__ || (defined __NetBSD__ &amp;amp;&amp;amp; __NetBSD_Version__ &amp;gt;= 600000000) || defined __minix&lt;br /&gt;
       /* fp_-&amp;gt;_offset is typed as an integer.  */&lt;br /&gt;
       fp_-&amp;gt;_offset = pos;&lt;br /&gt;
 # else&lt;br /&gt;
@@ -147,8 +152,8 @@&lt;br /&gt;
       fp_-&amp;gt;_flags &amp;amp;= ~__SEOF;&lt;br /&gt;
 #elif defined __EMX__               /* emx+gcc */&lt;br /&gt;
       fp-&amp;gt;_flags &amp;amp;= ~_IOEOF;&lt;br /&gt;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */&lt;br /&gt;
-      fp-&amp;gt;_flag &amp;amp;= ~_IOEOF;&lt;br /&gt;
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */&lt;br /&gt;
+      fp_-&amp;gt;_flag &amp;amp;= ~_IOEOF;&lt;br /&gt;
 #elif defined __MINT__              /* Atari FreeMiNT */&lt;br /&gt;
       fp-&amp;gt;__offset = pos;&lt;br /&gt;
       fp-&amp;gt;__eof = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* freadahead.patch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--- ./tmp/work/x86_64-linux/m4-native/1.4.17-r0/m4-1.4.17/lib/freadahead.c	2013-09-22 14:15:20.000000000 +0800&lt;br /&gt;
+++ /home/tommy/Downloads/gnulib/lib/freadahead.c	2019-11-13 21:49:41.528465850 +0800&lt;br /&gt;
@@ -1,5 +1,5 @@&lt;br /&gt;
 /* Retrieve information about a FILE stream.&lt;br /&gt;
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.&lt;br /&gt;
+   Copyright (C) 2007-2019 Free Software Foundation, Inc.&lt;br /&gt;
 &lt;br /&gt;
    This program is free software: you can redistribute it and/or modify&lt;br /&gt;
    it under the terms of the GNU General Public License as published by&lt;br /&gt;
@@ -12,7 +12,7 @@&lt;br /&gt;
    GNU General Public License for more details.&lt;br /&gt;
 &lt;br /&gt;
    You should have received a copy of the GNU General Public License&lt;br /&gt;
-   along with this program.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.  */&lt;br /&gt;
+   along with this program.  If not, see &amp;lt;https://www.gnu.org/licenses/&amp;gt;.  */&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;config.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
@@ -22,16 +22,26 @@&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;stdio-impl.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
+#if defined __DragonFly__&lt;br /&gt;
+/* Defined in libc, but not declared in &amp;lt;stdio.h&amp;gt;.  */&lt;br /&gt;
+extern size_t __sreadahead (FILE *);&lt;br /&gt;
+#endif&lt;br /&gt;
+&lt;br /&gt;
+/* This file is not used on systems that have the __freadahead function,&lt;br /&gt;
+   namely musl libc.  */&lt;br /&gt;
+&lt;br /&gt;
 size_t&lt;br /&gt;
 freadahead (FILE *fp)&lt;br /&gt;
 {&lt;br /&gt;
-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */&lt;br /&gt;
+#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1&lt;br /&gt;
+  /* GNU libc, BeOS, Haiku, Linux libc5 */&lt;br /&gt;
   if (fp-&amp;gt;_IO_write_ptr &amp;gt; fp-&amp;gt;_IO_write_base)&lt;br /&gt;
     return 0;&lt;br /&gt;
   return (fp-&amp;gt;_IO_read_end - fp-&amp;gt;_IO_read_ptr)&lt;br /&gt;
          + (fp-&amp;gt;_flags &amp;amp; _IO_IN_BACKUP ? fp-&amp;gt;_IO_save_end - fp-&amp;gt;_IO_save_base :&lt;br /&gt;
             0);&lt;br /&gt;
-#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */&lt;br /&gt;
+#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__&lt;br /&gt;
+  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */&lt;br /&gt;
   if ((fp_-&amp;gt;_flags &amp;amp; __SWR) != 0 || fp_-&amp;gt;_r &amp;lt; 0)&lt;br /&gt;
     return 0;&lt;br /&gt;
 # if defined __DragonFly__&lt;br /&gt;
@@ -52,7 +62,7 @@&lt;br /&gt;
   if ((fp_-&amp;gt;_flags &amp;amp; _IOWRITING) != 0)&lt;br /&gt;
     return 0;&lt;br /&gt;
   return fp_-&amp;gt;_count;&lt;br /&gt;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */&lt;br /&gt;
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */&lt;br /&gt;
   if ((fp_-&amp;gt;_flag &amp;amp; _IOWRT) != 0)&lt;br /&gt;
     return 0;&lt;br /&gt;
   return fp_-&amp;gt;_cnt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stdio-impl.patch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--- ./tmp/work/x86_64-linux/m4-native/1.4.17-r0/m4-1.4.17/lib/stdio-impl.h	2013-09-22 14:20:02.000000000 +0800&lt;br /&gt;
+++ /home/tommy/Downloads/gnulib/lib/stdio-impl.h	2019-11-13 21:49:41.568466035 +0800&lt;br /&gt;
@@ -1,5 +1,5 @@&lt;br /&gt;
 /* Implementation details of FILE streams.&lt;br /&gt;
-   Copyright (C) 2007-2008, 2010-2013 Free Software Foundation, Inc.&lt;br /&gt;
+   Copyright (C) 2007-2008, 2010-2019 Free Software Foundation, Inc.&lt;br /&gt;
 &lt;br /&gt;
    This program is free software: you can redistribute it and/or modify&lt;br /&gt;
    it under the terms of the GNU General Public License as published by&lt;br /&gt;
@@ -12,12 +12,23 @@&lt;br /&gt;
    GNU General Public License for more details.&lt;br /&gt;
 &lt;br /&gt;
    You should have received a copy of the GNU General Public License&lt;br /&gt;
-   along with this program.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.  */&lt;br /&gt;
+   along with this program.  If not, see &amp;lt;https://www.gnu.org/licenses/&amp;gt;.  */&lt;br /&gt;
 &lt;br /&gt;
 /* Many stdio implementations have the same logic and therefore can share&lt;br /&gt;
    the same implementation of stdio extension API, except that some fields&lt;br /&gt;
    have different naming conventions, or their access requires some casts.  */&lt;br /&gt;
 &lt;br /&gt;
+/* Glibc 2.28 made _IO_UNBUFFERED and _IO_IN_BACKUP private.  For now, work&lt;br /&gt;
+   around this problem by defining them ourselves.  FIXME: Do not rely on glibc&lt;br /&gt;
+   internals.  */&lt;br /&gt;
+#if defined _IO_EOF_SEEN&lt;br /&gt;
+# if !defined _IO_UNBUFFERED&lt;br /&gt;
+#  define _IO_UNBUFFERED 0x2&lt;br /&gt;
+# endif&lt;br /&gt;
+# if !defined _IO_IN_BACKUP&lt;br /&gt;
+#  define _IO_IN_BACKUP 0x100&lt;br /&gt;
+# endif&lt;br /&gt;
+#endif&lt;br /&gt;
 &lt;br /&gt;
 /* BSD stdio derived implementations.  */&lt;br /&gt;
 &lt;br /&gt;
@@ -28,10 +39,11 @@&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;errno.h&amp;gt;                             /* For detecting Plan9.  */&lt;br /&gt;
 &lt;br /&gt;
-#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */&lt;br /&gt;
+#if defined __sferror || defined __DragonFly__ || defined __ANDROID__&lt;br /&gt;
+  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */&lt;br /&gt;
 &lt;br /&gt;
 # if defined __DragonFly__          /* DragonFly */&lt;br /&gt;
-  /* See &amp;lt;http://www.dragonflybsd.org/cvsweb/src/lib/libc/stdio/priv_stdio.h?rev=HEAD&amp;amp;content-type=text/x-cvsweb-markup&amp;gt;.  */&lt;br /&gt;
+  /* See &amp;lt;https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/lib/libc/stdio/priv_stdio.h&amp;gt;.  */&lt;br /&gt;
 #  define fp_ ((struct { struct __FILE_public pub; \&lt;br /&gt;
                          struct { unsigned char *_base; int _size; } _bf; \&lt;br /&gt;
                          void *cookie; \&lt;br /&gt;
@@ -48,30 +60,89 @@&lt;br /&gt;
                          fpos_t _offset; \&lt;br /&gt;
                          /* More fields, not relevant here.  */ \&lt;br /&gt;
                        } *) fp)&lt;br /&gt;
-  /* See &amp;lt;http://www.dragonflybsd.org/cvsweb/src/include/stdio.h?rev=HEAD&amp;amp;content-type=text/x-cvsweb-markup&amp;gt;.  */&lt;br /&gt;
+  /* See &amp;lt;https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/include/stdio.h&amp;gt;.  */&lt;br /&gt;
 #  define _p pub._p&lt;br /&gt;
 #  define _flags pub._flags&lt;br /&gt;
 #  define _r pub._r&lt;br /&gt;
 #  define _w pub._w&lt;br /&gt;
+# elif defined __ANDROID__ /* Android */&lt;br /&gt;
+#  ifdef __LP64__&lt;br /&gt;
+#   define _gl_flags_file_t int&lt;br /&gt;
+#  else&lt;br /&gt;
+#   define _gl_flags_file_t short&lt;br /&gt;
+#  endif&lt;br /&gt;
+  /* Up to this commit from 2015-10-12&lt;br /&gt;
+     &amp;lt;https://android.googlesource.com/platform/bionic.git/+/f0141dfab10a4b332769d52fa76631a64741297a&amp;gt;&lt;br /&gt;
+     the innards of FILE were public, and fp_ub could be defined like for OpenBSD,&lt;br /&gt;
+     see &amp;lt;https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/fileext.h&amp;gt;&lt;br /&gt;
+     and &amp;lt;https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/local.h&amp;gt;.&lt;br /&gt;
+     After this commit, the innards of FILE are hidden.  */&lt;br /&gt;
+#  define fp_ ((struct { unsigned char *_p; \&lt;br /&gt;
+                         int _r; \&lt;br /&gt;
+                         int _w; \&lt;br /&gt;
+                         _gl_flags_file_t _flags; \&lt;br /&gt;
+                         _gl_flags_file_t _file; \&lt;br /&gt;
+                         struct { unsigned char *_base; size_t _size; } _bf; \&lt;br /&gt;
+                         int _lbfsize; \&lt;br /&gt;
+                         void *_cookie; \&lt;br /&gt;
+                         void *_close; \&lt;br /&gt;
+                         void *_read; \&lt;br /&gt;
+                         void *_seek; \&lt;br /&gt;
+                         void *_write; \&lt;br /&gt;
+                         struct { unsigned char *_base; size_t _size; } _ext; \&lt;br /&gt;
+                         unsigned char *_up; \&lt;br /&gt;
+                         int _ur; \&lt;br /&gt;
+                         unsigned char _ubuf[3]; \&lt;br /&gt;
+                         unsigned char _nbuf[1]; \&lt;br /&gt;
+                         struct { unsigned char *_base; size_t _size; } _lb; \&lt;br /&gt;
+                         int _blksize; \&lt;br /&gt;
+                         fpos_t _offset; \&lt;br /&gt;
+                         /* More fields, not relevant here.  */ \&lt;br /&gt;
+                       } *) fp)&lt;br /&gt;
 # else&lt;br /&gt;
 #  define fp_ fp&lt;br /&gt;
 # endif&lt;br /&gt;
 &lt;br /&gt;
-# if (defined __NetBSD__ &amp;amp;&amp;amp; __NetBSD_Version__ &amp;gt;= 105270000) || defined __OpenBSD__ || defined __ANDROID__ /* NetBSD &amp;gt;= 1.5ZA, OpenBSD, Android */&lt;br /&gt;
+# if (defined __NetBSD__ &amp;amp;&amp;amp; __NetBSD_Version__ &amp;gt;= 105270000) || defined __OpenBSD__ || defined __minix /* NetBSD &amp;gt;= 1.5ZA, OpenBSD, Minix 3 */&lt;br /&gt;
   /* See &amp;lt;http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&amp;amp;content-type=text/x-cvsweb-markup&amp;gt;&lt;br /&gt;
-     and &amp;lt;http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&amp;amp;content-type=text/x-cvsweb-markup&amp;gt; */&lt;br /&gt;
+     and &amp;lt;https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&amp;amp;content-type=text/x-cvsweb-markup&amp;gt;&lt;br /&gt;
+     and &amp;lt;https://github.com/Stichting-MINIX-Research-Foundation/minix/blob/master/lib/libc/stdio/fileext.h&amp;gt; */&lt;br /&gt;
   struct __sfileext&lt;br /&gt;
     {&lt;br /&gt;
       struct  __sbuf _ub; /* ungetc buffer */&lt;br /&gt;
       /* More fields, not relevant here.  */&lt;br /&gt;
     };&lt;br /&gt;
 #  define fp_ub ((struct __sfileext *) fp-&amp;gt;_ext._base)-&amp;gt;_ub&lt;br /&gt;
+# elif defined __ANDROID__                     /* Android */&lt;br /&gt;
+  struct __sfileext&lt;br /&gt;
+    {&lt;br /&gt;
+      struct { unsigned char *_base; size_t _size; } _ub; /* ungetc buffer */&lt;br /&gt;
+      /* More fields, not relevant here.  */&lt;br /&gt;
+    };&lt;br /&gt;
+#  define fp_ub ((struct __sfileext *) fp_-&amp;gt;_ext._base)-&amp;gt;_ub&lt;br /&gt;
 # else                                         /* FreeBSD, NetBSD &amp;lt;= 1.5Z, DragonFly, Mac OS X, Cygwin */&lt;br /&gt;
 #  define fp_ub fp_-&amp;gt;_ub&lt;br /&gt;
 # endif&lt;br /&gt;
 &lt;br /&gt;
 # define HASUB(fp) (fp_ub._base != NULL)&lt;br /&gt;
 &lt;br /&gt;
+# if defined __ANDROID__ /* Android */&lt;br /&gt;
+  /* Needed after this commit from 2016-01-25&lt;br /&gt;
+     &amp;lt;https://android.googlesource.com/platform/bionic.git/+/e70e0e9267d069bf56a5078c99307e08a7280de7&amp;gt; */&lt;br /&gt;
+#  ifndef __SEOF&lt;br /&gt;
+#   define __SLBF 1&lt;br /&gt;
+#   define __SNBF 2&lt;br /&gt;
+#   define __SRD 4&lt;br /&gt;
+#   define __SWR 8&lt;br /&gt;
+#   define __SRW 0x10&lt;br /&gt;
+#   define __SEOF 0x20&lt;br /&gt;
+#   define __SERR 0x40&lt;br /&gt;
+#  endif&lt;br /&gt;
+#  ifndef __SOFF&lt;br /&gt;
+#   define __SOFF 0x1000&lt;br /&gt;
+#  endif&lt;br /&gt;
+# endif&lt;br /&gt;
+&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
@@ -80,7 +151,7 @@&lt;br /&gt;
 #ifdef __TANDEM                     /* NonStop Kernel */&lt;br /&gt;
 # ifndef _IOERR&lt;br /&gt;
 /* These values were determined by the program &#039;stdioext-flags&#039; at&lt;br /&gt;
-   &amp;lt;http://lists.gnu.org/archive/html/bug-gnulib/2010-12/msg00165.html&amp;gt;.  */&lt;br /&gt;
+   &amp;lt;https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html&amp;gt;.  */&lt;br /&gt;
 #  define _IOERR   0x40&lt;br /&gt;
 #  define _IOREAD  0x80&lt;br /&gt;
 #  define _IOWRT    0x4&lt;br /&gt;
@@ -98,6 +169,8 @@&lt;br /&gt;
                          int _file; \&lt;br /&gt;
                          unsigned int _flag; \&lt;br /&gt;
                        } *) fp)&lt;br /&gt;
+# elif defined __VMS                /* OpenVMS */&lt;br /&gt;
+#  define fp_ ((struct _iobuf *) fp)&lt;br /&gt;
 # else&lt;br /&gt;
 #  define fp_ fp&lt;br /&gt;
 # endif&lt;br /&gt;
@@ -109,4 +182,31 @@&lt;br /&gt;
 #  define _flag __flag&lt;br /&gt;
 # endif&lt;br /&gt;
 &lt;br /&gt;
+#elif defined _WIN32 &amp;amp;&amp;amp; ! defined __CYGWIN__  /* newer Windows with MSVC */&lt;br /&gt;
+&lt;br /&gt;
+/* &amp;lt;stdio.h&amp;gt; does not define the innards of FILE any more.  */&lt;br /&gt;
+# define WINDOWS_OPAQUE_FILE&lt;br /&gt;
+&lt;br /&gt;
+struct _gl_real_FILE&lt;br /&gt;
+{&lt;br /&gt;
+  /* Note: Compared to older Windows and to mingw, it has the fields&lt;br /&gt;
+     _base and _cnt swapped. */&lt;br /&gt;
+  unsigned char *_ptr;&lt;br /&gt;
+  unsigned char *_base;&lt;br /&gt;
+  int _cnt;&lt;br /&gt;
+  int _flag;&lt;br /&gt;
+  int _file;&lt;br /&gt;
+  int _charbuf;&lt;br /&gt;
+  int _bufsiz;&lt;br /&gt;
+};&lt;br /&gt;
+# define fp_ ((struct _gl_real_FILE *) fp)&lt;br /&gt;
+&lt;br /&gt;
+/* These values were determined by a program similar to the one at&lt;br /&gt;
+   &amp;lt;https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html&amp;gt;.  */&lt;br /&gt;
+# define _IOREAD   0x1&lt;br /&gt;
+# define _IOWRT    0x2&lt;br /&gt;
+# define _IORW     0x4&lt;br /&gt;
+# define _IOEOF    0x8&lt;br /&gt;
+# define _IOERR   0x10&lt;br /&gt;
+&lt;br /&gt;
 #endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patches - bison_3.0.4.bb ==&lt;br /&gt;
* fseterr.patch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--- ./tmp/work/x86_64-linux/bison-native/3.0.4-r0/bison-3.0.4/lib/fseterr.c	2015-01-05 00:43:50.000000000 +0800&lt;br /&gt;
+++ /home/tommy/Downloads/gnulib/lib/fseterr.c	2019-11-13 21:49:41.532465868 +0800&lt;br /&gt;
@@ -1,5 +1,5 @@&lt;br /&gt;
 /* Set the error indicator of a stream.&lt;br /&gt;
-   Copyright (C) 2007-2015 Free Software Foundation, Inc.&lt;br /&gt;
+   Copyright (C) 2007-2019 Free Software Foundation, Inc.&lt;br /&gt;
 &lt;br /&gt;
    This program is free software: you can redistribute it and/or modify&lt;br /&gt;
    it under the terms of the GNU General Public License as published by&lt;br /&gt;
@@ -12,7 +12,7 @@&lt;br /&gt;
    GNU General Public License for more details.&lt;br /&gt;
 &lt;br /&gt;
    You should have received a copy of the GNU General Public License&lt;br /&gt;
-   along with this program.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.  */&lt;br /&gt;
+   along with this program.  If not, see &amp;lt;https://www.gnu.org/licenses/&amp;gt;.  */&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;config.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
@@ -23,21 +23,26 @@&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;stdio-impl.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
+/* This file is not used on systems that have the __fseterr function,&lt;br /&gt;
+   namely musl libc.  */&lt;br /&gt;
+&lt;br /&gt;
 void&lt;br /&gt;
 fseterr (FILE *fp)&lt;br /&gt;
 {&lt;br /&gt;
   /* Most systems provide FILE as a struct and the necessary bitmask in&lt;br /&gt;
      &amp;lt;stdio.h&amp;gt;, because they need it for implementing getc() and putc() as&lt;br /&gt;
      fast macros.  */&lt;br /&gt;
-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */&lt;br /&gt;
+#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1&lt;br /&gt;
+  /* GNU libc, BeOS, Haiku, Linux libc5 */&lt;br /&gt;
   fp-&amp;gt;_flags |= _IO_ERR_SEEN;&lt;br /&gt;
-#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */&lt;br /&gt;
+#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__&lt;br /&gt;
+  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */&lt;br /&gt;
   fp_-&amp;gt;_flags |= __SERR;&lt;br /&gt;
 #elif defined __EMX__               /* emx+gcc */&lt;br /&gt;
   fp-&amp;gt;_flags |= _IOERR;&lt;br /&gt;
 #elif defined __minix               /* Minix */&lt;br /&gt;
   fp-&amp;gt;_flags |= _IOERR;&lt;br /&gt;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */&lt;br /&gt;
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */&lt;br /&gt;
   fp_-&amp;gt;_flag |= _IOERR;&lt;br /&gt;
 #elif defined __UCLIBC__            /* uClibc */&lt;br /&gt;
   fp-&amp;gt;__modeflags |= __FLAG_ERROR;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patches - rpm-native ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: rpm/rpmio/rpmio.h&lt;br /&gt;
===================================================================&lt;br /&gt;
--- rpm.orig/rpmio/rpmio.h&lt;br /&gt;
+++ rpm/rpmio/rpmio.h&lt;br /&gt;
@@ -23,7 +23,9 @@&lt;br /&gt;
  */&lt;br /&gt;
 /*@{*/&lt;br /&gt;
 #if !defined(__LCLINT__) &amp;amp;&amp;amp; !defined(__UCLIBC__) &amp;amp;&amp;amp; defined(__GLIBC__) &amp;amp;&amp;amp; \&lt;br /&gt;
-       (__GLIBC__ &amp;gt; 2 || (__GLIBC__ == 2 &amp;amp;&amp;amp; __GLIBC_MINOR__ &amp;gt;= 2))&lt;br /&gt;
+       (__GLIBC__ &amp;gt; 2 || (__GLIBC__ == 2 &amp;amp;&amp;amp; __GLIBC_MINOR__ &amp;gt;= 2)) &amp;amp;&amp;amp; \&lt;br /&gt;
+       !defined(__UCLIBC__)&lt;br /&gt;
 #define USE_COOKIE_SEEK_POINTER 1&lt;br /&gt;
+#define _IO_off64_t __off64_t&lt;br /&gt;
 typedef _IO_off64_t    _libio_off_t;&lt;br /&gt;
 typedef _libio_off_t * _libio_pos_t;&lt;br /&gt;
Index: rpm/rpmio/rpmio.h&lt;br /&gt;
===================================================================&lt;br /&gt;
--- rpm.orig/rpmio/bson.c&lt;br /&gt;
+++ rpm/rpmio/bson.c&lt;br /&gt;
@@ -3586,7 +3586,7 @@&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #if defined(__linux__)&lt;br /&gt;
-static uint16_t&lt;br /&gt;
+__pid_t&lt;br /&gt;
 gettid (void)&lt;br /&gt;
 {&lt;br /&gt;
    return syscall (SYS_gettid);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=NXP,_LPC1768&amp;diff=545</id>
		<title>NXP, LPC1768</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=NXP,_LPC1768&amp;diff=545"/>
		<updated>2026-08-21T05:17:49Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPIO connector ==&lt;br /&gt;
[[File:Lpc1768_pinout.jpg|border|350px|LPC1768 pinout]]&lt;br /&gt;
&lt;br /&gt;
== program image ==&lt;br /&gt;
# copy *.bin into target through USB&lt;br /&gt;
# It seems like will running the latest *.bin after power re-cycle&lt;br /&gt;
== Application ==&lt;br /&gt;
* [[ CAN bus ]]&lt;br /&gt;
* [[ APDS-9960, Digital RGB, ambient light, proximity and gesture sensors ]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Microchip,_8-bit&amp;diff=544</id>
		<title>Microchip, 8-bit</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Microchip,_8-bit&amp;diff=544"/>
		<updated>2026-08-21T05:17:49Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LPCXpresso IDE installation ==&lt;br /&gt;
=== Download IDE ===&lt;br /&gt;
MPLABX-v3.40-linux-installer.tar&lt;br /&gt;
=== Compiler ===&lt;br /&gt;
MPLAB® XC8 Compiler v1.38&lt;br /&gt;
=== Binary ===&lt;br /&gt;
# Resulting in dist/default/production&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tommy@hvs-tpe:~/projects/mbed/microchip/XC8_UG_EE/Example1.X$ tree&lt;br /&gt;
.&lt;br /&gt;
├── build&lt;br /&gt;
│   └── default&lt;br /&gt;
│       └── production&lt;br /&gt;
│           ├── example1.p1&lt;br /&gt;
│           ├── example1.p1.d&lt;br /&gt;
│           └── example1.pre&lt;br /&gt;
├── debug&lt;br /&gt;
│   └── default&lt;br /&gt;
├── dist&lt;br /&gt;
│   └── default&lt;br /&gt;
│       └── production&lt;br /&gt;
│           ├── Example1.X.production.cmf&lt;br /&gt;
│           ├── Example1.X.production.elf&lt;br /&gt;
│           ├── Example1.X.production.hex&lt;br /&gt;
│           ├── Example1.X.production.hxl&lt;br /&gt;
│           ├── Example1.X.production.lst&lt;br /&gt;
│           ├── Example1.X.production.map&lt;br /&gt;
│           ├── Example1.X.production.mum&lt;br /&gt;
│           ├── Example1.X.production.obj&lt;br /&gt;
│           ├── Example1.X.production.rlf&lt;br /&gt;
│           ├── Example1.X.production.sdb&lt;br /&gt;
│           ├── Example1.X.production.sym&lt;br /&gt;
│           └── memoryfile.xml&lt;br /&gt;
├── example1.c&lt;br /&gt;
├── Makefile&lt;br /&gt;
└── nbproject&lt;br /&gt;
    ├── configurations.xml&lt;br /&gt;
    ├── Makefile-default.mk&lt;br /&gt;
    ├── Makefile-genesis.properties&lt;br /&gt;
    ├── Makefile-impl.mk&lt;br /&gt;
    ├── Makefile-local-default.mk&lt;br /&gt;
    ├── Makefile-variables.mk&lt;br /&gt;
    ├── Package-default.bash&lt;br /&gt;
    ├── private&lt;br /&gt;
    │   ├── configurations.xml&lt;br /&gt;
    │   └── private.xml&lt;br /&gt;
    └── project.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmer ==&lt;br /&gt;
PICkit2 Microchip Development Programmer with USB ICSP Pic Kit 2&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [http://www.microchip.com/mplab/mplab-x-ide, MPLAB X IDE]&lt;br /&gt;
* [https://www.microchip.com/mplab/compilers, XC Compilers]&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Maixduino&amp;diff=543</id>
		<title>Maixduino</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Maixduino&amp;diff=543"/>
		<updated>2026-08-21T05:17:48Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Booting message == &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[MAIXPY]Pll0:freq:832000000&lt;br /&gt;
[MAIXPY]Pll1:freq:398666666&lt;br /&gt;
[MAIXPY]Pll2:freq:45066666&lt;br /&gt;
[MAIXPY]cpu:freq:416000000&lt;br /&gt;
[MAIXPY]kpu:freq:398666666&lt;br /&gt;
[MAIXPY]Flash:0xc8:0x17&lt;br /&gt;
open second core...&lt;br /&gt;
mallocmallocmallocmallocgc heap=0x8027ccb0-0x802fccb0(524288)&lt;br /&gt;
[MaixPy] init end&lt;br /&gt;
&lt;br /&gt;
 __  __              _____  __   __  _____   __     __&lt;br /&gt;
|  \/  |     /\     |_   _| \ \ / / |  __ \  \ \   / /&lt;br /&gt;
| \  / |    /  \      | |    \ V /  | |__) |  \ \_/ /&lt;br /&gt;
| |\/| |   / /\ \     | |     &amp;gt; &amp;lt;   |  ___/    \   /&lt;br /&gt;
| |  | |  / ____ \   _| |_   / . \  | |         | |&lt;br /&gt;
|_|  |_| /_/    \_\ |_____| /_/ \_\ |_|         |_|&lt;br /&gt;
&lt;br /&gt;
Official Site : https://www.sipeed.com&lt;br /&gt;
Wiki          : https://maixpy.sipeed.com&lt;br /&gt;
&lt;br /&gt;
MicroPython v0.5.0 on 2019-12-11; Sipeed_M1 with kendryte-k210&lt;br /&gt;
Type &amp;quot;help()&amp;quot; for more information.&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Toolchain ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/kendryte/kendryte-gnu-toolchain&lt;br /&gt;
cd kendryte-gnu-toolchain&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Build ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./configure --prefix=/opt/kendryte-toolchain --with-cmodel=medany --with-arch=rv64imafc --with-abi=lp64f&lt;br /&gt;
make -j8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FW ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/sipeed/MaixPy.git&lt;br /&gt;
git submodule update --recursive --init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Install dependencies ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install python3 python3-pip build-essential cmake&lt;br /&gt;
sudo pip3 install -r requirements.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Configure project ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd MaixPy&lt;br /&gt;
cd projects/maixpy_k210&lt;br /&gt;
python3 project.py --toolchain /opt/kendryte-toolchain/bin --toolchain-prefix riscv64-unknown-elf- config &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Customize FW ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 project.py menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Build ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 project.py build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Flash to the board ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 project.py -B maixduino -p /dev/ttyUSB0 -b 1500000 -S flash&lt;br /&gt;
or,&lt;br /&gt;
kflash -B maixduino -p /dev/ttyUSB0 hello_world.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import sensor&lt;br /&gt;
import image&lt;br /&gt;
import lcd&lt;br /&gt;
 &lt;br /&gt;
lcd.init()&lt;br /&gt;
sensor.reset()&lt;br /&gt;
sensor.set_pixformat(sensor.RGB565)&lt;br /&gt;
sensor.set_framesize(sensor.QVGA)&lt;br /&gt;
sensor.run(1)&lt;br /&gt;
while True:&lt;br /&gt;
    img=sensor.snapshot()&lt;br /&gt;
    lcd.display(img)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=MTK,_MT7697&amp;diff=542</id>
		<title>MTK, MT7697</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=MTK,_MT7697&amp;diff=542"/>
		<updated>2026-08-21T05:17:48Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Mt7697.jpg|thumb|300px|MT7697]]&lt;br /&gt;
== Pin definition ==&lt;br /&gt;
[[File:1492592079643473.png|MT7697 pin define]]&lt;br /&gt;
== SDK Architecture ==&lt;br /&gt;
[[File:MT7697_SDK_architecture.PNG|MT7697 SDK Arch]]&lt;br /&gt;
== Build FW ==&lt;br /&gt;
* ./build.sh linkit7697_hdk freertos_ledcube&lt;br /&gt;
* Or, go to the mt7697/project/linkit7697_hdk/templates/freertos_ledcube/GCC, then, make&lt;br /&gt;
== FW Programming ==&lt;br /&gt;
* git clone https://github.com/MediaTek-Labs/mt76x7-uploader&lt;br /&gt;
* python ./upload.py -c /dev/ttyUSB0 -f ./out/linkit7697_hdk/freertos_ledcube/freertos_ledcube.bin -t cm4 -p mt7697&lt;br /&gt;
&lt;br /&gt;
== module ON or OFF feature option ==&lt;br /&gt;
* Edit inc/hal_feature_config.h in each example code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define HAL_ADC_MODULE_ENABLED&lt;br /&gt;
//#define HAL_AES_MODULE_ENABLED&lt;br /&gt;
#define HAL_CACHE_MODULE_ENABLED&lt;br /&gt;
//#define HAL_DES_MODULE_ENABLED&lt;br /&gt;
//#define HAL_EINT_MODULE_ENABLED&lt;br /&gt;
//#define HAL_FLASH_MODULE_ENABLED&lt;br /&gt;
#define HAL_GDMA_MODULE_ENABLED&lt;br /&gt;
//#define HAL_GPC_MODULE_ENABLED&lt;br /&gt;
#define HAL_GPIO_MODULE_ENABLED&lt;br /&gt;
#define HAL_GPT_MODULE_ENABLED&lt;br /&gt;
//#define HAL_I2C_MASTER_MODULE_ENABLED&lt;br /&gt;
//#define HAL_I2S_MODULE_ENABLED&lt;br /&gt;
//#define HAL_IRRX_MODULE_ENABLED&lt;br /&gt;
//#define HAL_IRTX_MODULE_ENABLED&lt;br /&gt;
//#define HAL_MD5_MODULE_ENABLED&lt;br /&gt;
#define HAL_NVIC_MODULE_ENABLED&lt;br /&gt;
//#define HAL_PWM_MODULE_ENABLED&lt;br /&gt;
//#define HAL_RTC_MODULE_ENABLED&lt;br /&gt;
//#define HAL_SHA_MODULE_ENABLED&lt;br /&gt;
#define HAL_SPI_MASTER_MODULE_ENABLED&lt;br /&gt;
//#define HAL_SPI_SLAVE_MODULE_ENABLED&lt;br /&gt;
#define HAL_TRNG_MODULE_ENABLED&lt;br /&gt;
#define HAL_UART_MODULE_ENABLED&lt;br /&gt;
//#define HAL_WDT_MODULE_ENABLED&lt;br /&gt;
&lt;br /&gt;
#define MTK_HAL_PLAIN_LOG_ENABLE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PWM example ==&lt;br /&gt;
[[File:Mt7697_pwm_100k_50.png|600px|MT7697 PWM 100K duty 50]]&lt;br /&gt;
[[File:Mt7697_pwm_200k_30.png|600px|MT7697 PWM 200K duty 30]]&lt;br /&gt;
&lt;br /&gt;
== I2C example ==&lt;br /&gt;
[[File:Mtk7697_i2c.png|600px|MT7697 I2C]]&lt;br /&gt;
&lt;br /&gt;
== [[application - wifi relay (Alexa + IFTTT)]] ==&lt;br /&gt;
== [[application - audio spectrum]] ==&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [http://labs.mediatek.com/api/mt7697/index.html, MT7697 API Reference]&lt;br /&gt;
* [https://docs.labs.mediatek.com/resource/mt7687-mt7697/en, MT7687/MT7697 Resources]&lt;br /&gt;
* [https://github.com/MediaTek-Labs/mt76x7-uploader, MT76x7 Uploader]&lt;br /&gt;
* [https://docs.labs.mediatek.com/resource/mt7687-mt7697/en/get-started-linkit-7697-hdk/keil-vision-ide-linkit-7697/download-and-debugging-projects-linkit-7697, Setup Hardware Debugger]&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=LilyPad,_nano51822&amp;diff=541</id>
		<title>LilyPad, nano51822</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=LilyPad,_nano51822&amp;diff=541"/>
		<updated>2026-08-21T05:17:48Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Nano51822.jpg|50px|Lilypad]][[File:Nano51822.jpg|150px|Lilypad]][[File:Nano51822.jpg|250px|Lilypad]]&lt;br /&gt;
== LPCXpresso IDE installation ==&lt;br /&gt;
=== i386 libraries dependency ===&lt;br /&gt;
# sudo apt-get install libgtk2.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 libidn11:i386 libglu1-mesa:i386 libxtst6:i386 libncurses5:i386&lt;br /&gt;
=== Install ===&lt;br /&gt;
# tar -zxvf Installer_LPCXpresso_8.1.0_597_Linux-x86.tar.gz&lt;br /&gt;
# ./Installer_LPCXpresso_8.1.0_597_Linux-x86&lt;br /&gt;
&lt;br /&gt;
=== Uninstall ===&lt;br /&gt;
# rm -rf /usr/local/lpcxpresso_8.1.0_597/&lt;br /&gt;
# rm -rf ~/.eclipse/org.eclipse.platform_4.5.1_1432965327_linux_gtk_x86/  &lt;br /&gt;
# ls ~/.eclipse/org.eclipse.platform_4.5.1_1432965327_linux_gtk_x86/plugins/ &amp;lt;---installed software&lt;br /&gt;
&lt;br /&gt;
=== Running IDE ===&lt;br /&gt;
# /usr/local/lpcxpresso_8.1.0_597/lpcxpresso/lpcxpresso&lt;br /&gt;
&lt;br /&gt;
=== Install Plugin-in ===&lt;br /&gt;
# Go to &amp;quot;Help / Install New Software...&amp;quot; and press &amp;quot;Add&amp;quot;&lt;br /&gt;
## Name: Eclipse Juno&lt;br /&gt;
##Location: http://download.eclipse.org/releases/juno&lt;br /&gt;
# Select Plug-in&lt;br /&gt;
## General Purpose Tools / Marketplace Client&lt;br /&gt;
## Mobile and Device Development / Target Management Terminal&lt;br /&gt;
# Go to &amp;quot;Help / Install New Software...&amp;quot; and press &amp;quot;Add&amp;quot;&lt;br /&gt;
## Name: RXTX &lt;br /&gt;
##Location: http://archive.eclipse.org/tm/updates/rxtx&lt;br /&gt;
# Go to &amp;quot;Help / Eclipse Marketplace&amp;quot; and search &amp;quot;SVN&amp;quot;&lt;br /&gt;
## Install &amp;quot;Subversive - SVN Team Provider&amp;quot;&lt;br /&gt;
# Got to &amp;quot;Window / Show View / Other...&amp;quot; and select &amp;quot;SVN / SVN Repositories&amp;quot;&lt;br /&gt;
## Install &amp;quot;Subversive SVN Connector / SVN Kit 1.8.11&amp;quot; &amp;lt;--- select latest version&lt;br /&gt;
&lt;br /&gt;
=== Checkout SDK ===&lt;br /&gt;
# Go to &amp;quot;SVN Repositories&amp;quot; tag and press &amp;quot;New Repositories Locations&amp;quot;&lt;br /&gt;
# Add URL &amp;quot;https://github.com/ucxpresso/nano51822&amp;quot;&lt;br /&gt;
# Expand the SVN repository and right click the &amp;quot;trunk / uCXpresso.NRF&amp;quot; to checkout the base&lt;br /&gt;
&lt;br /&gt;
=== Checkout example &amp;amp; compile it ===&lt;br /&gt;
# Expand the SVN repository and right click the &amp;quot;trunk / examples&amp;quot; to checkout the code&lt;br /&gt;
# Go to Workspace and select the example you want to compile&lt;br /&gt;
# Go to &amp;quot;Quickstart Panel&amp;quot; and run &amp;quot;Build &#039;xxx&#039;[Debug]&amp;quot;&lt;br /&gt;
# The image(xxx.hex) will under Debug folder&lt;br /&gt;
&lt;br /&gt;
=== Upgrade FW through DFU===&lt;br /&gt;
# Install &amp;quot;Master Control Pannel&amp;quot;(MCP)APP for Android&lt;br /&gt;
# Upload .hex to dropbox&lt;br /&gt;
# DFU over the air&lt;br /&gt;
## Switch to DFU mode by long press DFU button(~3 secs)&lt;br /&gt;
## scan &amp;amp; connect to &amp;quot;nanoDFU&#039; device[[File:NanoDFU.jpg|thumb|150px|nanoDFU]]&lt;br /&gt;
## press dfu to start upgrade[[File:Dfu_button.png|thumb|150px|DFU button]]&lt;br /&gt;
## Select file type&lt;br /&gt;
## Choose your source &lt;br /&gt;
## Press &amp;quot;No&amp;quot; for Init Packet without CRC checking&lt;br /&gt;
## waiting for finish&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [http://www.howmuchsnow.com/arduino/airquality/, Air Quality Monitoring]&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Kernel&amp;diff=540</id>
		<title>Kernel</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Kernel&amp;diff=540"/>
		<updated>2026-08-21T05:17:48Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Software and Tools&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== source ==&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;git clone git://github.com/raspberrypi/linux.git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;svn co file:///var/svn/rpi_linux/trunk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== toolchain ==&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;git clone https://github.com/raspberrypi/tools&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prepare SD ==&lt;br /&gt;
* Transfer the following files from the firmware/boot directory to the Raspberry pi /boot directory:&lt;br /&gt;
    bootcode.bin&lt;br /&gt;
    fixup.dat&lt;br /&gt;
    start.elf&lt;br /&gt;
&lt;br /&gt;
* cp firmware/hardfp/opt/ /media/root/opt/ -rf&lt;br /&gt;
&lt;br /&gt;
== build ==&lt;br /&gt;
* make mrproper&lt;br /&gt;
* cp arch/arm/configs/bcmrpi_defconfig .config&lt;br /&gt;
* export CCPREFIX=/path/to/your/compiler/binary/prefix-of-binary-&lt;br /&gt;
* make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig&lt;br /&gt;
* make ARCH=arm CROSS_COMPILE=${CCPREFIX}&lt;br /&gt;
&lt;br /&gt;
== libraries ==&lt;br /&gt;
* pi@raspberrypi:~$ ls /lib/ &amp;lt;br&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf                   libip4tc.so.0         libnih.so.1.0.0&amp;lt;br&amp;gt;&lt;br /&gt;
cpp                                   libip4tc.so.0.1.0     libxtables.so.7&amp;lt;br&amp;gt;&lt;br /&gt;
firmware                              libip6tc.so.0         libxtables.so.7.0.0&amp;lt;br&amp;gt;&lt;br /&gt;
init                                  libip6tc.so.0.1.0     lsb&amp;lt;br&amp;gt;&lt;br /&gt;
klibc-sO6SifHCdmbehHGtm0y1yHu6vb0.so  libipq.so.0           modprobe.d&amp;lt;br&amp;gt;&lt;br /&gt;
ld-linux-armhf.so.3                   libipq.so.0.0.0       modules&amp;lt;br&amp;gt;&lt;br /&gt;
ld-linux.so.3                         libiptc.so.0          systemd&amp;lt;br&amp;gt;&lt;br /&gt;
libaudit.so.0                         libiptc.so.0.0.0      terminfo&amp;lt;br&amp;gt;&lt;br /&gt;
libaudit.so.0.0.0                     libnih-dbus.so.1      udev&amp;lt;br&amp;gt;&lt;br /&gt;
libauparse.so.0                       libnih-dbus.so.1.0.0  xtables&amp;lt;br&amp;gt;&lt;br /&gt;
libauparse.so.0.0.0                   libnih.so.1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update kernel in Raspbian ==&lt;br /&gt;
=== Get source ===&lt;br /&gt;
# $ git clone --depth=1 https://github.com/raspberrypi/linux&lt;br /&gt;
# $ sudo apt-get install bc&lt;br /&gt;
=== Raspberry Pi 1 (or Compute Module) Default Build Configuration ===&lt;br /&gt;
# $ cd linux&lt;br /&gt;
# $ KERNEL=kernel&lt;br /&gt;
# $ make bcmrpi_defconfig&lt;br /&gt;
=== Raspberry Pi 2 Default Build Configuration ===&lt;br /&gt;
# $ cd linux&lt;br /&gt;
# $ KERNEL=kernel7&lt;br /&gt;
# $ make bcm2709_defconfig&lt;br /&gt;
=== Build and install the kernel, modules and Device Tree blobs ===&lt;br /&gt;
# $ make zImage modules dtbs&lt;br /&gt;
# $ sudo make modules_install&lt;br /&gt;
# $ sudo cp arch/arm/boot/dts/*.dtb /boot/&lt;br /&gt;
# $ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/&lt;br /&gt;
# $ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/&lt;br /&gt;
# $ sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img&lt;br /&gt;
&lt;br /&gt;
Note: On a Raspberry Pi 2, adding -j4 (make -j4 zImage modules dtbs) splits the work between all four cores, speeding up compilation significantly.&lt;br /&gt;
&lt;br /&gt;
=== Cross Compile ===&lt;br /&gt;
#$ git clone https://github.com/raspberrypi/tools&lt;br /&gt;
#add /tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin to your $PATH&lt;br /&gt;
# make bcm2709_defconfig ARCH=arm&lt;br /&gt;
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4&lt;br /&gt;
&lt;br /&gt;
==reference ==&lt;br /&gt;
* [http://elinux.org/RPi_Kernel_Compilation RPi Kernel Compilation]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/linux/kernel/building.md Kernel Building]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software and Tools]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Jenkins&amp;diff=539</id>
		<title>Jenkins</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Jenkins&amp;diff=539"/>
		<updated>2026-08-21T05:17:47Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Software and Tools&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setup ==&lt;br /&gt;
* sudo java -jar ./jenkins.war --httpPort=9090 --httpListenAddress=192.168.1.100&lt;br /&gt;
&lt;br /&gt;
== work with SCM ==&lt;br /&gt;
* Add build script in repo&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pipeline {&lt;br /&gt;
   agent any&lt;br /&gt;
&lt;br /&gt;
   stages {&lt;br /&gt;
      stage(&#039;Build&#039;) {&lt;br /&gt;
        steps {&lt;br /&gt;
          echo &#039;Building...&#039;&lt;br /&gt;
	  dir(&amp;quot;${env.WORKSPACE}&amp;quot;){&lt;br /&gt;
	  sh &amp;quot;pwd&amp;quot;&lt;br /&gt;
    	  sh &amp;quot;make&amp;quot;&lt;br /&gt;
	  }&lt;br /&gt;
          echo &amp;quot;Running ${env.BUILD_ID} ${env.BUILD_DISPLAY_NAME} on ${env.NODE_NAME} and JOB ${env.JOB_NAME}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
   }&lt;br /&gt;
   stage(&#039;Test&#039;) {&lt;br /&gt;
     steps {&lt;br /&gt;
        echo &#039;Testing...&#039;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   stage(&#039;Deploy&#039;) {&lt;br /&gt;
     steps {&lt;br /&gt;
       echo &#039;Deploying...&#039;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Configure&lt;br /&gt;
[[File:Jenkins-config.jpg|800px|Jenkins-config]]&lt;br /&gt;
* Build Now&lt;br /&gt;
[[File:Jenkins-wiki.jpg|800px|Jenkins-build]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software and Tools]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Hikey960&amp;diff=538</id>
		<title>Hikey960</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Hikey960&amp;diff=538"/>
		<updated>2026-08-21T05:17:47Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Refactor: add Category:Boards and SoCs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Hikey-960-SD-front.jpg|300px|Hikey960 Front]]&lt;br /&gt;
[[File:Hikey-960-SD-back.jpg|300px|Hikey960 Back]]&lt;br /&gt;
&lt;br /&gt;
== Pin definition ==&lt;br /&gt;
[[file:Hikey960-pin-def.jpg]]&lt;br /&gt;
&lt;br /&gt;
* UART signals are driven at 1.8V.&lt;br /&gt;
&lt;br /&gt;
== Build FW ==&lt;br /&gt;
&lt;br /&gt;
* Download the Android source tree:&lt;br /&gt;
** repo init -u https://android.googlesource.com/platform/manifest -b master&lt;br /&gt;
** repo sync -j8&lt;br /&gt;
&lt;br /&gt;
*Build:&lt;br /&gt;
** . ./build/envsetup.sh&lt;br /&gt;
** lunch hikey960-userdebug&lt;br /&gt;
** make -j24&lt;br /&gt;
&lt;br /&gt;
== Installing initial images ==&lt;br /&gt;
*Select fastboot mode by turning ON switch 3 (for details, refer to the HiKey 960 Getting Started guide).&lt;br /&gt;
*Power the board.&lt;br /&gt;
*Flash initial images:&lt;br /&gt;
** cd device/linaro/hikey/installer/hikey960&lt;br /&gt;
*Turn OFF switch 3 and power cycle the board.&lt;br /&gt;
&lt;br /&gt;
== Flashing images ==&lt;br /&gt;
*Enter fastboot mode by turning ON switch 3.&lt;br /&gt;
*Flash images by running the following commands:&lt;br /&gt;
** fastboot flash boot out/target/product/hikey960/boot.img&lt;br /&gt;
*Turn OFF switch 3 and power cycle the board.&lt;br /&gt;
&lt;br /&gt;
== Building the kernel ==&lt;br /&gt;
*Run the following commands:&lt;br /&gt;
**mkdir repo-common&lt;br /&gt;
**cd repo-common&lt;br /&gt;
**repo init -u https://android.googlesource.com/kernel/manifest -b hikey-linaro-android-4.19&lt;br /&gt;
**repo sync -j8 -c&lt;br /&gt;
**rm -rf out&lt;br /&gt;
**rm build.config&lt;br /&gt;
**BUILD_CONFIG=hikey-linaro/build.config.hikey960 ./build/build.sh&lt;br /&gt;
*Update the kernel in the boot image.&lt;br /&gt;
**Copy hi3660-hikey960.dtb (out/android-hikey-linaro-4.19/dist/hi3660-hikey960.dtb) to the hikey-kernel directory as file hi3660-hikey960.dtb-4.19.&lt;br /&gt;
**Copy the Image file (out/android-hikey-linaro-4.19/dist/Image.gz-dtb) to the hikey-kernel directory as file Image.gz-dtb-hikey960-4.19.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 cp repo-common/out/android-hikey-linaro-4.19/dist/hi3660-hikey960.dtb hikey960/device/linaro/hikey-kernel/hi3660-hikey960.dtb-4.19&lt;br /&gt;
 cp repo-common/out/android-hikey-linaro-4.19/dist/Image.gz-dtb hikey960/device/linaro/hikey-kernel/Image.gz-dtb-hikey960-4.19&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Make the boot image:&lt;br /&gt;
**make bootimage -j24&lt;br /&gt;
&lt;br /&gt;
== Enable UART ==&lt;br /&gt;
* In repo-common/hikey-linaro&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff --git a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi&lt;br /&gt;
index 80334e500..a2f1de30b 100644&lt;br /&gt;
--- a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi&lt;br /&gt;
+++ b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi&lt;br /&gt;
@@ -494,7 +494,7 @@&lt;br /&gt;
                        clock-names = &amp;quot;uartclk&amp;quot;, &amp;quot;apb_pclk&amp;quot;;&lt;br /&gt;
                        pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
                        pinctrl-0 = &amp;lt;&amp;amp;uart0_pmx_func &amp;amp;uart0_cfg_func&amp;gt;;&lt;br /&gt;
-                       status = &amp;quot;disabled&amp;quot;;&lt;br /&gt;
+                       status = &amp;quot;ok&amp;quot;;&lt;br /&gt;
                };&lt;br /&gt;
&lt;br /&gt;
                uart1: serial@fdf00000 {&lt;br /&gt;
@@ -508,7 +508,7 @@&lt;br /&gt;
                        clock-names = &amp;quot;uartclk&amp;quot;, &amp;quot;apb_pclk&amp;quot;;&lt;br /&gt;
                        pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
                        pinctrl-0 = &amp;lt;&amp;amp;uart1_pmx_func &amp;amp;uart1_cfg_func&amp;gt;;&lt;br /&gt;
-                       status = &amp;quot;disabled&amp;quot;;&lt;br /&gt;
+                       status = &amp;quot;ok&amp;quot;;&lt;br /&gt;
                };&lt;br /&gt;
&lt;br /&gt;
                uart2: serial@fdf03000 {&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting the serial number ==&lt;br /&gt;
=== To set the random serial number, run ===&lt;br /&gt;
**fastboot getvar nve:SN@16\_DIGIT\_NUMBER&lt;br /&gt;
*Bootloader exports the generated serial number to the kernel using androidboot.serialno=.&lt;br /&gt;
&lt;br /&gt;
=== Setting monitor resolution ===&lt;br /&gt;
*Edit the device/linaro/hikey/hikey960/BoardConfig.mk parameter BOARD_KERNEL_CMDLINE and configure the video setting. For example, the setting for a 24-inch monitor is video=HDMI-A-1:1280x800@60.&lt;br /&gt;
&lt;br /&gt;
== Android note ==&lt;br /&gt;
* Disable ICMP for enable ping&lt;br /&gt;
** sysctl -w net.ipv4.icmp_echo_ignore_all=0&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://source.android.com/setup/build/devices, Build steps]&lt;br /&gt;
* [https://snapshots.linaro.org/96boards/hikey960/linaro/aosp-master/latest/, Pre build image]&lt;br /&gt;
&lt;br /&gt;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
</feed>