<?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-10-05T23:23:59Z</updated>
	<subtitle>使用者貢獻</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=MediaWiki:Common.css&amp;diff=764</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=764"/>
		<updated>2026-09-09T08:11:22Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Sci-fi dark HUD theme for Timeless: dark palette, cyan/amber accents, HUD headings, dark pygments tokens, print stays light&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ============================================================================&lt;br /&gt;
   &amp;quot;flip the world&amp;quot; — DARK HUD sci-fi theme&lt;br /&gt;
   Target skin: Timeless (site default). MediaWiki 1.43.&lt;br /&gt;
   Loaded from MediaWiki:Common.css, so it applies to every skin and every&lt;br /&gt;
   namespace; the structural selectors below are Timeless-specific and are&lt;br /&gt;
   simply inert under other skins.&lt;br /&gt;
&lt;br /&gt;
   Palette:  bg #0a0f1a / panel #0e1524 / text #c8d6e5&lt;br /&gt;
             cyan #35e0ff (structure, links, headings)&lt;br /&gt;
             amber #ffb340 (markers, emphasis, keywords)&lt;br /&gt;
             mint #7cf6c8 (strings, positive)&lt;br /&gt;
   No animation, no scanlines: this wiki is meant to be read.&lt;br /&gt;
   ============================================================================ */&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
	--sf-bg: #0a0f1a;&lt;br /&gt;
	--sf-bg-deep: #060b14;&lt;br /&gt;
	--sf-panel: #0e1524;&lt;br /&gt;
	--sf-panel-2: #111c2e;&lt;br /&gt;
	--sf-panel-3: #16233a;&lt;br /&gt;
	--sf-fg: #c8d6e5;&lt;br /&gt;
	--sf-fg-dim: #8a9cb2;&lt;br /&gt;
	--sf-fg-faint: #63758c;&lt;br /&gt;
	--sf-cyan: #35e0ff;&lt;br /&gt;
	--sf-cyan-2: #7ceaff;&lt;br /&gt;
	--sf-amber: #ffb340;&lt;br /&gt;
	--sf-mint: #7cf6c8;&lt;br /&gt;
	--sf-red: #ff5f6d;&lt;br /&gt;
	--sf-violet: #c9a6ff;&lt;br /&gt;
	--sf-line: rgba( 53, 224, 255, 0.22 );&lt;br /&gt;
	--sf-line-soft: rgba( 53, 224, 255, 0.09 );&lt;br /&gt;
	--sf-glow: 0 0 8px rgba( 53, 224, 255, 0.3 );&lt;br /&gt;
	--sf-mono: &#039;JetBrains Mono&#039;, &#039;SFMono-Regular&#039;, &#039;Menlo&#039;, &#039;Consolas&#039;, &#039;Noto Sans Mono&#039;, &#039;DejaVu Sans Mono&#039;, monospace;&lt;br /&gt;
	--sf-display: &#039;Eurostile&#039;, &#039;Bahnschrift&#039;, &#039;DIN Alternate&#039;, &#039;Segoe UI Semibold&#039;, &#039;Noto Sans&#039;, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Native widgets, scrollbars and form controls follow the theme. */&lt;br /&gt;
html {&lt;br /&gt;
	color-scheme: dark;&lt;br /&gt;
	background-color: var(--sf-bg-deep);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
	background-color: var(--sf-bg-deep);&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
::selection {&lt;br /&gt;
	background: rgba( 53, 224, 255, 0.3 );&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------------------------------------------------------------- Header -- */&lt;br /&gt;
&lt;br /&gt;
#mw-header-container {&lt;br /&gt;
	background: linear-gradient( 180deg, #0b1322 0%, var(--sf-bg) 100% );&lt;br /&gt;
	border-bottom: 1px solid var(--sf-line);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-header-container.ts-container {&lt;br /&gt;
	box-shadow: 0 1px 12px rgba( 0, 0, 0, 0.6 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site title, top left. */&lt;br /&gt;
#p-logo-text a {&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
	font-family: var(--sf-display);&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
	letter-spacing: 0.07em;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	text-shadow: var(--sf-glow);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-logo-text a:hover {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
	text-shadow: 0 0 10px rgba( 53, 224, 255, 0.7 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The Maker Faire robot is flat red art on a white square. Inverting it turns&lt;br /&gt;
   the white to black and the red to cyan; `lighten` then drops the black out&lt;br /&gt;
   against the dark header, so it reads as a cyan HUD glyph with no re-upload. */&lt;br /&gt;
#p-logo img,&lt;br /&gt;
#p-logo a.mw-wiki-logo,&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;
/* Apply the inversion to the image only — putting it on the &amp;lt;a&amp;gt; as well would&lt;br /&gt;
   invert twice and hand the red robot back. */&lt;br /&gt;
#p-logo img {&lt;br /&gt;
	filter: invert( 1 ) saturate( 1.35 );&lt;br /&gt;
	mix-blend-mode: lighten;&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;br /&gt;
&lt;br /&gt;
/* Accent stripe under the header: red/blue/green -&amp;gt; cyan/amber HUD bar. */&lt;br /&gt;
.color-left {&lt;br /&gt;
	background: linear-gradient( 90deg, rgba( 53, 224, 255, 0 ) 0%, var(--sf-cyan) 100% );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.color-right {&lt;br /&gt;
	background: linear-gradient( 90deg, var(--sf-amber) 0%, rgba( 255, 179, 64, 0 ) 100% );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.color-middle {&lt;br /&gt;
	background: var(--sf-cyan);&lt;br /&gt;
	box-shadow: 0 0 10px rgba( 53, 224, 255, 0.5 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------------------------------------------------------------- Search -- */&lt;br /&gt;
&lt;br /&gt;
#simpleSearch {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	box-shadow: inset 0 0 12px rgba( 53, 224, 255, 0.06 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#simpleSearch:focus-within {&lt;br /&gt;
	border-color: var(--sf-cyan);&lt;br /&gt;
	box-shadow: 0 0 0 1px rgba( 53, 224, 255, 0.35 ), inset 0 0 12px rgba( 53, 224, 255, 0.1 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#searchInput {&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
	font-family: var(--sf-mono);&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#searchInput::placeholder {&lt;br /&gt;
	color: var(--sf-fg-faint);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Skin search glyph is a dark grey SVG; lift it onto the dark field. */&lt;br /&gt;
#searchButton,&lt;br /&gt;
#mw-searchButton {&lt;br /&gt;
	filter: invert( 1 ) brightness( 1.1 );&lt;br /&gt;
	opacity: 0.75;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.suggestions .suggestions-results,&lt;br /&gt;
.suggestions .suggestions-special {&lt;br /&gt;
	background: var(--sf-panel-2);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.suggestions .suggestions-result {&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.suggestions .suggestions-result-current,&lt;br /&gt;
.suggestions .suggestions-special.suggestions-result-current {&lt;br /&gt;
	background: var(--sf-panel-3);&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --------------------------------------------------- Page / content shell -- */&lt;br /&gt;
&lt;br /&gt;
#mw-content-container {&lt;br /&gt;
	background-color: var(--sf-bg);&lt;br /&gt;
	/* Skin ships a decorative cat as a backdrop; replace with a soft glow. */&lt;br /&gt;
	background-image: radial-gradient( 900px 420px at 50% -120px, rgba( 53, 224, 255, 0.08 ), transparent 70% );&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
	background-position: center top;&lt;br /&gt;
	border-bottom: 1px solid var(--sf-cyan);&lt;br /&gt;
	box-shadow: inset 0 -1px 14px rgba( 53, 224, 255, 0.18 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The main reading panel. */&lt;br /&gt;
#mw-content {&lt;br /&gt;
	background: var(--sf-panel);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	box-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.5 ), 0 8px 30px rgba( 0, 0, 0, 0.45 );&lt;br /&gt;
	position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Corner bracket, top right — HUD framing without clipping any menus. */&lt;br /&gt;
#mw-content::before {&lt;br /&gt;
	content: &#039;&#039;;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	top: -1px;&lt;br /&gt;
	right: -1px;&lt;br /&gt;
	width: 22px;&lt;br /&gt;
	height: 22px;&lt;br /&gt;
	border-top: 2px solid var(--sf-cyan);&lt;br /&gt;
	border-right: 2px solid var(--sf-cyan);&lt;br /&gt;
	box-shadow: var(--sf-glow);&lt;br /&gt;
	pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content::after {&lt;br /&gt;
	content: &#039;&#039;;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	bottom: -1px;&lt;br /&gt;
	left: -1px;&lt;br /&gt;
	width: 22px;&lt;br /&gt;
	height: 22px;&lt;br /&gt;
	border-bottom: 2px solid var(--sf-cyan);&lt;br /&gt;
	border-left: 2px solid var(--sf-cyan);&lt;br /&gt;
	box-shadow: var(--sf-glow);&lt;br /&gt;
	pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ------------------------------------------------------------- Sidebars -- */&lt;br /&gt;
&lt;br /&gt;
#mw-site-navigation .sidebar-chunk,&lt;br /&gt;
#mw-related-navigation .sidebar-chunk {&lt;br /&gt;
	background: var(--sf-panel-2);&lt;br /&gt;
	border: 1px solid var(--sf-line-soft);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	box-shadow: 0 4px 18px rgba( 0, 0, 0, 0.4 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-site-navigation .sidebar-inner,&lt;br /&gt;
#mw-related-navigation .sidebar-inner {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sidebar-chunk .mw-portlet h3,&lt;br /&gt;
#mw-site-navigation h3,&lt;br /&gt;
#mw-related-navigation h3,&lt;br /&gt;
#personal h3 {&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
	font-family: var(--sf-display);&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
	letter-spacing: 0.18em;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
	border-bottom: 1px solid var(--sf-line-soft);&lt;br /&gt;
	padding-bottom: 0.35em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Leading marker on every nav link. */&lt;br /&gt;
.sidebar-chunk .mw-portlet-body li,&lt;br /&gt;
#personal-inner .mw-portlet-body li {&lt;br /&gt;
	list-style: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sidebar-chunk .mw-portlet-body li a::before,&lt;br /&gt;
#personal-inner .mw-portlet-body li a::before {&lt;br /&gt;
	content: &#039;\203A\00a0&#039;;&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
	opacity: 0.55;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sidebar-chunk .mw-portlet-body li a:hover::before {&lt;br /&gt;
	opacity: 1;&lt;br /&gt;
	color: var(--sf-amber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Personal tools dropdown (top right). */&lt;br /&gt;
#personal-inner.dropdown,&lt;br /&gt;
#personal .dropdown {&lt;br /&gt;
	background: var(--sf-panel-2);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	box-shadow: 0 6px 24px rgba( 0, 0, 0, 0.6 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ----------------------------------------------------- Page action tabs -- */&lt;br /&gt;
&lt;br /&gt;
#mw-page-header-links .mw-portlet h3,&lt;br /&gt;
#mw-page-header-links h3 {&lt;br /&gt;
	color: var(--sf-fg-faint);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-page-header-links .tools-inline li a {&lt;br /&gt;
	color: var(--sf-fg-dim);&lt;br /&gt;
	font-family: var(--sf-display);&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
	letter-spacing: 0.08em;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
	border-bottom: 2px solid transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-page-header-links .tools-inline li a:hover {&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
	border-bottom-color: var(--sf-line);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-page-header-links .tools-inline li.selected a,&lt;br /&gt;
#mw-page-header-links .tools-inline li.selected a:visited {&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
	border-bottom-color: var(--sf-cyan);&lt;br /&gt;
	text-shadow: var(--sf-glow);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ------------------------------------------------------------ Typography -- */&lt;br /&gt;
&lt;br /&gt;
.mw-body-content {&lt;br /&gt;
	line-height: 1.75;&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.firstHeading {&lt;br /&gt;
	color: #eaf6ff;&lt;br /&gt;
	font-family: var(--sf-display);&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
	letter-spacing: 0.06em;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
	border-bottom: 1px solid var(--sf-line);&lt;br /&gt;
	padding-bottom: 0.35em;&lt;br /&gt;
	text-shadow: 0 0 14px rgba( 53, 224, 255, 0.25 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Small callsign above the title. */&lt;br /&gt;
#siteSub {&lt;br /&gt;
	display: block;&lt;br /&gt;
	color: var(--sf-fg-faint);&lt;br /&gt;
	font-family: var(--sf-mono);&lt;br /&gt;
	font-size: 0.72em;&lt;br /&gt;
	letter-spacing: 0.22em;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h2,&lt;br /&gt;
.mw-body-content h3,&lt;br /&gt;
.mw-body-content h4 {&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
	font-family: var(--sf-display);&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h2 {&lt;br /&gt;
	margin-top: 1.8em;&lt;br /&gt;
	padding: 0 0 0.3em 0.7em;&lt;br /&gt;
	border-bottom: 1px solid var(--sf-line);&lt;br /&gt;
	border-left: 3px solid var(--sf-cyan);&lt;br /&gt;
	letter-spacing: 0.08em;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
	text-shadow: var(--sf-glow);&lt;br /&gt;
	background: linear-gradient( 90deg, rgba( 53, 224, 255, 0.1 ), transparent 55% );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h3 {&lt;br /&gt;
	margin-top: 1.4em;&lt;br /&gt;
	padding-left: 0.7em;&lt;br /&gt;
	color: var(--sf-cyan-2);&lt;br /&gt;
	border-left: 2px solid var(--sf-line);&lt;br /&gt;
	letter-spacing: 0.04em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h4 {&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
	letter-spacing: 0.04em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content b,&lt;br /&gt;
.mw-body-content strong {&lt;br /&gt;
	color: #e6f3ff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Section [edit] links. */&lt;br /&gt;
.mw-editsection,&lt;br /&gt;
.mw-editsection a {&lt;br /&gt;
	color: var(--sf-fg-faint);&lt;br /&gt;
	font-family: var(--sf-mono);&lt;br /&gt;
	font-size: 0.75em;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
	letter-spacing: 0.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-editsection a:hover {&lt;br /&gt;
	color: var(--sf-amber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ----------------------------------------------------------------- Links -- */&lt;br /&gt;
&lt;br /&gt;
.mw-body-content a,&lt;br /&gt;
#mw-content a {&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content a:visited,&lt;br /&gt;
#mw-content a:visited {&lt;br /&gt;
	color: #9bb8ff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content a:hover,&lt;br /&gt;
#mw-content a:hover {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	text-shadow: var(--sf-glow);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content a.new,&lt;br /&gt;
#mw-content a.new,&lt;br /&gt;
a.new:visited,&lt;br /&gt;
.sidebar-chunk a.new {&lt;br /&gt;
	color: var(--sf-red);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* External links: drop the skin&#039;s blue icon for a HUD arrow. */&lt;br /&gt;
.mw-parser-output a.external {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	padding-right: 0;&lt;br /&gt;
	border-bottom: 1px dotted var(--sf-line);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output a.external::after {&lt;br /&gt;
	content: &#039;\2197&#039;;&lt;br /&gt;
	color: var(--sf-amber);&lt;br /&gt;
	font-size: 0.85em;&lt;br /&gt;
	padding-left: 0.15em;&lt;br /&gt;
	vertical-align: super;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sidebar / footer links. */&lt;br /&gt;
.sidebar-chunk a,&lt;br /&gt;
#personal a,&lt;br /&gt;
#mw-footer a,&lt;br /&gt;
#catlinks a {&lt;br /&gt;
	color: var(--sf-fg-dim);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sidebar-chunk a:hover,&lt;br /&gt;
#personal a:hover,&lt;br /&gt;
#mw-footer a:hover,&lt;br /&gt;
#catlinks a:hover {&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ----------------------------------------------------------------- Lists -- */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output ul {&lt;br /&gt;
	list-style: none;&lt;br /&gt;
	padding-left: 1.4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output ul &amp;gt; li {&lt;br /&gt;
	margin-bottom: 0.4em;&lt;br /&gt;
	position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output ul &amp;gt; li::before {&lt;br /&gt;
	content: &#039;\25B8&#039;;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	left: -1.1em;&lt;br /&gt;
	color: var(--sf-amber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Nested bullets step down in weight. */&lt;br /&gt;
.mw-parser-output ul ul &amp;gt; li::before {&lt;br /&gt;
	content: &#039;\25AA&#039;;&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
	opacity: 0.7;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output ol {&lt;br /&gt;
	padding-left: 1.8em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output ol &amp;gt; li {&lt;br /&gt;
	margin-bottom: 0.4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output ol &amp;gt; li::marker {&lt;br /&gt;
	color: var(--sf-amber);&lt;br /&gt;
	font-family: var(--sf-mono);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Galleries and TOC keep their own list semantics — no HUD bullets there. */&lt;br /&gt;
.mw-parser-output ul.gallery &amp;gt; li::before,&lt;br /&gt;
.mw-parser-output #toc ul &amp;gt; li::before,&lt;br /&gt;
.mw-parser-output .toc ul &amp;gt; li::before {&lt;br /&gt;
	content: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output ul.gallery,&lt;br /&gt;
.mw-parser-output #toc ul {&lt;br /&gt;
	padding-left: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ------------------------------------------------------------------ Code -- */&lt;br /&gt;
&lt;br /&gt;
.mw-body-content pre,&lt;br /&gt;
.mw-highlight pre,&lt;br /&gt;
.mw-parser-output pre {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
	color: #dbe7f3;&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	border-left: 3px solid var(--sf-cyan);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	padding: 0.9em 1.1em;&lt;br /&gt;
	overflow-x: auto;&lt;br /&gt;
	font-family: var(--sf-mono);&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
	line-height: 1.55;&lt;br /&gt;
	box-shadow: inset 0 0 24px rgba( 53, 224, 255, 0.05 );&lt;br /&gt;
	/* Cut corner, bottom right. */&lt;br /&gt;
	clip-path: polygon( 0 0, 100% 0, 100% calc( 100% - 12px ), calc( 100% - 12px ) 100%, 0 100% );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content code,&lt;br /&gt;
.mw-parser-output code,&lt;br /&gt;
.mw-body-content tt {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
	color: var(--sf-mint);&lt;br /&gt;
	border: 1px solid var(--sf-line-soft);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	padding: 0.05em 0.4em;&lt;br /&gt;
	font-family: var(--sf-mono);&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content pre code {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	border: 0;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	color: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight,&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Pygments ships a light theme (dark green keywords, dark red strings) which is&lt;br /&gt;
   unreadable on this background. Remap the tokens the wiki actually uses. */&lt;br /&gt;
.mw-highlight .hll { background-color: rgba( 53, 224, 255, 0.12 ); }&lt;br /&gt;
.mw-highlight .c,&lt;br /&gt;
.mw-highlight .ch,&lt;br /&gt;
.mw-highlight .cm,&lt;br /&gt;
.mw-highlight .c1,&lt;br /&gt;
.mw-highlight .cs,&lt;br /&gt;
.mw-highlight .cpf { color: #5f7f95; font-style: italic; }&lt;br /&gt;
.mw-highlight .cp { color: var(--sf-amber); }&lt;br /&gt;
.mw-highlight .k,&lt;br /&gt;
.mw-highlight .kc,&lt;br /&gt;
.mw-highlight .kd,&lt;br /&gt;
.mw-highlight .kn,&lt;br /&gt;
.mw-highlight .kr { color: var(--sf-amber); font-weight: bold; }&lt;br /&gt;
.mw-highlight .kp { color: var(--sf-amber); font-weight: normal; }&lt;br /&gt;
.mw-highlight .kt { color: #ffd479; font-weight: normal; }&lt;br /&gt;
.mw-highlight .s,&lt;br /&gt;
.mw-highlight .s1,&lt;br /&gt;
.mw-highlight .s2,&lt;br /&gt;
.mw-highlight .sa,&lt;br /&gt;
.mw-highlight .sb,&lt;br /&gt;
.mw-highlight .sc,&lt;br /&gt;
.mw-highlight .dl,&lt;br /&gt;
.mw-highlight .sd,&lt;br /&gt;
.mw-highlight .se,&lt;br /&gt;
.mw-highlight .sh,&lt;br /&gt;
.mw-highlight .si,&lt;br /&gt;
.mw-highlight .sx,&lt;br /&gt;
.mw-highlight .sr,&lt;br /&gt;
.mw-highlight .ss { color: var(--sf-mint); }&lt;br /&gt;
.mw-highlight .m,&lt;br /&gt;
.mw-highlight .mb,&lt;br /&gt;
.mw-highlight .mf,&lt;br /&gt;
.mw-highlight .mh,&lt;br /&gt;
.mw-highlight .mi,&lt;br /&gt;
.mw-highlight .mo,&lt;br /&gt;
.mw-highlight .il { color: #ff9d7a; }&lt;br /&gt;
.mw-highlight .nb,&lt;br /&gt;
.mw-highlight .bp,&lt;br /&gt;
.mw-highlight .na { color: #9fd6ff; }&lt;br /&gt;
.mw-highlight .nc,&lt;br /&gt;
.mw-highlight .nn { color: var(--sf-cyan); font-weight: bold; }&lt;br /&gt;
.mw-highlight .nf,&lt;br /&gt;
.mw-highlight .fm { color: var(--sf-cyan); }&lt;br /&gt;
.mw-highlight .nt { color: var(--sf-amber); }&lt;br /&gt;
.mw-highlight .nv,&lt;br /&gt;
.mw-highlight .vc,&lt;br /&gt;
.mw-highlight .vg,&lt;br /&gt;
.mw-highlight .vi,&lt;br /&gt;
.mw-highlight .vm { color: var(--sf-violet); }&lt;br /&gt;
.mw-highlight .no { color: #ffd479; }&lt;br /&gt;
.mw-highlight .nd,&lt;br /&gt;
.mw-highlight .ne { color: #ff8fa3; }&lt;br /&gt;
.mw-highlight .o,&lt;br /&gt;
.mw-highlight .ow { color: #a9c0d6; }&lt;br /&gt;
.mw-highlight .p { color: var(--sf-fg-dim); }&lt;br /&gt;
.mw-highlight .err { color: var(--sf-red); border: 1px solid rgba( 255, 95, 109, 0.5 ); }&lt;br /&gt;
.mw-highlight .gd { color: var(--sf-red); }&lt;br /&gt;
.mw-highlight .gi { color: var(--sf-mint); }&lt;br /&gt;
.mw-highlight .go { color: var(--sf-fg-dim); }&lt;br /&gt;
.mw-highlight .gr,&lt;br /&gt;
.mw-highlight .gt { color: var(--sf-red); }&lt;br /&gt;
.mw-highlight .gh,&lt;br /&gt;
.mw-highlight .gp,&lt;br /&gt;
.mw-highlight .gu { color: var(--sf-cyan); font-weight: bold; }&lt;br /&gt;
.mw-highlight .linenos,&lt;br /&gt;
.mw-highlight .lineno,&lt;br /&gt;
.mw-highlight .linenodiv pre { color: var(--sf-fg-faint); background: transparent; }&lt;br /&gt;
&lt;br /&gt;
/* Copy button shipped by SyntaxHighlight. */&lt;br /&gt;
.mw-highlight-copy,&lt;br /&gt;
.mw-highlight .mw-highlight-copy {&lt;br /&gt;
	background: var(--sf-panel-3);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------------------------------------------------------------- Tables -- */&lt;br /&gt;
&lt;br /&gt;
.mw-body-content table.wikitable,&lt;br /&gt;
.mw-body-content .mw-datatable,&lt;br /&gt;
.mw-body-content table.mw_metadata {&lt;br /&gt;
	background: var(--sf-panel-2);&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content table.wikitable &amp;gt; tr &amp;gt; th,&lt;br /&gt;
.mw-body-content table.wikitable &amp;gt; * &amp;gt; tr &amp;gt; th,&lt;br /&gt;
.mw-body-content .mw-datatable th,&lt;br /&gt;
.mw-body-content table.mw_metadata th {&lt;br /&gt;
	background: var(--sf-panel-3);&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	font-family: var(--sf-display);&lt;br /&gt;
	letter-spacing: 0.08em;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content table.wikitable &amp;gt; tr &amp;gt; td,&lt;br /&gt;
.mw-body-content table.wikitable &amp;gt; * &amp;gt; tr &amp;gt; td,&lt;br /&gt;
.mw-body-content .mw-datatable td,&lt;br /&gt;
.mw-body-content table.mw_metadata td {&lt;br /&gt;
	border: 1px solid var(--sf-line-soft);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content table.wikitable &amp;gt; * &amp;gt; tr:hover &amp;gt; td {&lt;br /&gt;
	background: rgba( 53, 224, 255, 0.05 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The pin-out tables (Raspberry Pi) set cell fills inline. Those fills split&lt;br /&gt;
   into light and dark, so each needs its own text colour — a single blanket&lt;br /&gt;
   rule leaves half the pin numbers invisible. Values enumerated from the&lt;br /&gt;
   wikitext: cyan / #00FF80 / magenta / yellow / orange are light; black, green&lt;br /&gt;
   and red are dark. */&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;#00FFFF&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;#00FF80&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;#FF00FF&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;cyan&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;yellow&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;orange&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;white&amp;quot; i],&lt;br /&gt;
.mw-parser-output th[style*=&amp;quot;#00FFFF&amp;quot; i],&lt;br /&gt;
.mw-parser-output th[style*=&amp;quot;yellow&amp;quot; i] {&lt;br /&gt;
	color: #06121f !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;black&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;green&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;red&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;blue&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;navy&amp;quot; i],&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;purple&amp;quot; i] {&lt;br /&gt;
	color: #ffffff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output td[style*=&amp;quot;background&amp;quot; i] a,&lt;br /&gt;
.mw-parser-output th[style*=&amp;quot;background&amp;quot; i] a {&lt;br /&gt;
	color: inherit !important;&lt;br /&gt;
	text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline red text (used as a warning marker on a handful of pages) is too dark&lt;br /&gt;
   against this background — lift it without changing the wikitext. */&lt;br /&gt;
.mw-parser-output [style*=&amp;quot;color:red&amp;quot;],&lt;br /&gt;
.mw-parser-output [style*=&amp;quot;color: red&amp;quot;],&lt;br /&gt;
.mw-parser-output [style*=&amp;quot;color:#FF0000&amp;quot;],&lt;br /&gt;
.mw-parser-output [style*=&amp;quot;color:#ff0000&amp;quot;],&lt;br /&gt;
.mw-parser-output [style*=&amp;quot;color: #FF0000&amp;quot;] {&lt;br /&gt;
	color: var(--sf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------------------------------------------------- Images &amp;amp; galleries -- */&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .thumbinner,&lt;br /&gt;
.mw-parser-output .thumbinner {&lt;br /&gt;
	background: var(--sf-panel-2);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	box-shadow: 0 4px 18px rgba( 0, 0, 0, 0.45 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .thumbimage,&lt;br /&gt;
.mw-parser-output .thumbimage {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
	border: 1px solid var(--sf-line-soft);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .thumbcaption,&lt;br /&gt;
.mw-parser-output .thumbcaption {&lt;br /&gt;
	color: var(--sf-fg-dim);&lt;br /&gt;
	font-family: var(--sf-mono);&lt;br /&gt;
	font-size: 0.85em;&lt;br /&gt;
	line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Enlarge icon is a dark grey SVG. */&lt;br /&gt;
.mw-body-content .magnify a,&lt;br /&gt;
.mw-parser-output .magnify a {&lt;br /&gt;
	filter: invert( 1 ) brightness( 1.1 );&lt;br /&gt;
	opacity: 0.7;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content ul.gallery {&lt;br /&gt;
	margin: 1.4em 0 2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .gallerybox div.thumb {&lt;br /&gt;
	background: var(--sf-panel-2);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	transition: border-color 0.15s ease, box-shadow 0.15s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .gallerybox:hover div.thumb {&lt;br /&gt;
	border-color: var(--sf-cyan);&lt;br /&gt;
	box-shadow: 0 0 14px rgba( 53, 224, 255, 0.35 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .gallerybox .thumb img {&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	box-shadow: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .gallerybox .gallerytext {&lt;br /&gt;
	font-size: 0.88em;&lt;br /&gt;
	color: var(--sf-fg-dim);&lt;br /&gt;
	padding-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ------------------------------------------------------------------- TOC -- */&lt;br /&gt;
&lt;br /&gt;
#toc,&lt;br /&gt;
.toc,&lt;br /&gt;
.toccolours {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	box-shadow: inset 0 0 20px rgba( 53, 224, 255, 0.05 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc .toctitle h2,&lt;br /&gt;
.toc .toctitle h2,&lt;br /&gt;
#mw-toc-heading {&lt;br /&gt;
	color: var(--sf-cyan);&lt;br /&gt;
	font-family: var(--sf-display);&lt;br /&gt;
	font-size: 0.85em;&lt;br /&gt;
	letter-spacing: 0.2em;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
	border: 0;&lt;br /&gt;
	background: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	text-shadow: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc .tocnumber,&lt;br /&gt;
.toc .tocnumber {&lt;br /&gt;
	color: var(--sf-amber);&lt;br /&gt;
	font-family: var(--sf-mono);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#toc .toctext,&lt;br /&gt;
.toc .toctext {&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ------------------------------------------------- Categories &amp;amp; footer -- */&lt;br /&gt;
&lt;br /&gt;
#catlinks,&lt;br /&gt;
.catlinks {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
	border: 1px solid var(--sf-line-soft);&lt;br /&gt;
	border-left: 3px solid var(--sf-amber);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	color: var(--sf-fg-dim);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#catlinks .mw-normal-catlinks &amp;gt; a {&lt;br /&gt;
	color: var(--sf-amber);&lt;br /&gt;
	font-family: var(--sf-display);&lt;br /&gt;
	letter-spacing: 0.1em;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
	font-size: 0.85em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-footer-container,&lt;br /&gt;
#mw-footer {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
	color: var(--sf-fg-faint);&lt;br /&gt;
	border-top: 1px solid var(--sf-line);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-footer li,&lt;br /&gt;
#footer-info li {&lt;br /&gt;
	color: var(--sf-fg-faint);&lt;br /&gt;
	font-family: var(--sf-mono);&lt;br /&gt;
	font-size: 0.82em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* -------------------------------------------------- Forms / editing UI -- */&lt;br /&gt;
&lt;br /&gt;
textarea,&lt;br /&gt;
#wpTextbox1,&lt;br /&gt;
.mw-editform textarea {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
	caret-color: var(--sf-cyan);&lt;br /&gt;
	font-family: var(--sf-mono);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
textarea:focus,&lt;br /&gt;
#wpTextbox1:focus {&lt;br /&gt;
	border-color: var(--sf-cyan);&lt;br /&gt;
	box-shadow: 0 0 0 1px rgba( 53, 224, 255, 0.3 );&lt;br /&gt;
	outline: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;],&lt;br /&gt;
input[type=&amp;quot;search&amp;quot;],&lt;br /&gt;
input[type=&amp;quot;password&amp;quot;],&lt;br /&gt;
input[type=&amp;quot;number&amp;quot;],&lt;br /&gt;
select {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-editform #wpSummary,&lt;br /&gt;
#wpSummary {&lt;br /&gt;
	background: var(--sf-bg-deep);&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Preview / diff / history and message boxes. */&lt;br /&gt;
table.diff,&lt;br /&gt;
table.diff td,&lt;br /&gt;
.mw-diff-table {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
td.diff-context,&lt;br /&gt;
.diff-context {&lt;br /&gt;
	background: var(--sf-panel-2);&lt;br /&gt;
	color: var(--sf-fg-dim);&lt;br /&gt;
	border-color: var(--sf-line-soft);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
td.diff-deletedline,&lt;br /&gt;
.diff-deletedline {&lt;br /&gt;
	background: rgba( 255, 95, 109, 0.12 );&lt;br /&gt;
	border-color: rgba( 255, 95, 109, 0.4 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
td.diff-addedline,&lt;br /&gt;
.diff-addedline {&lt;br /&gt;
	background: rgba( 124, 246, 200, 0.12 );&lt;br /&gt;
	border-color: rgba( 124, 246, 200, 0.4 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.diff-deletedline .diffchange {&lt;br /&gt;
	background: rgba( 255, 95, 109, 0.35 );&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.diff-addedline .diffchange {&lt;br /&gt;
	background: rgba( 124, 246, 200, 0.3 );&lt;br /&gt;
	color: #06121f;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-message-box,&lt;br /&gt;
.mw-message-box-warning,&lt;br /&gt;
.mw-message-box-error,&lt;br /&gt;
.mw-message-box-success,&lt;br /&gt;
.warningbox,&lt;br /&gt;
.errorbox,&lt;br /&gt;
.successbox,&lt;br /&gt;
.mw-warning,&lt;br /&gt;
#mw-content .mw-message-box {&lt;br /&gt;
	background: var(--sf-panel-2);&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
	border: 1px solid var(--sf-line);&lt;br /&gt;
	border-left: 3px solid var(--sf-amber);&lt;br /&gt;
	border-radius: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-message-box-error,&lt;br /&gt;
.errorbox {&lt;br /&gt;
	border-left-color: var(--sf-red);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-message-box-success,&lt;br /&gt;
.successbox {&lt;br /&gt;
	border-left-color: var(--sf-mint);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Special: pages and search results ride on .mw-body-content, but a few bits&lt;br /&gt;
   carry their own light backgrounds. */&lt;br /&gt;
.mw-search-result-heading,&lt;br /&gt;
.searchresult {&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-search-results li {&lt;br /&gt;
	border-bottom: 1px solid var(--sf-line-soft);&lt;br /&gt;
	padding-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-changeslist-line,&lt;br /&gt;
.mw-changeslist td,&lt;br /&gt;
.mw-changeslist th,&lt;br /&gt;
.mw-history-histlinks {&lt;br /&gt;
	color: var(--sf-fg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ------------------------------------------------- Narrow viewports (Timeless&lt;br /&gt;
   switches to its stacked layout with drop-down menus at 850px) -- */&lt;br /&gt;
&lt;br /&gt;
@media screen and ( max-width: 850px ) {&lt;br /&gt;
	#mw-header-container {&lt;br /&gt;
		background: var(--sf-bg);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Menu / user / tools toggles are dark grey SVGs on a dark bar. */&lt;br /&gt;
	#user-tools h2,&lt;br /&gt;
	.sidebar-chunk h2,&lt;br /&gt;
	#ca-more span,&lt;br /&gt;
	#ca-languages span,&lt;br /&gt;
	.tools-inline li a {&lt;br /&gt;
		filter: invert( 1 ) brightness( 1.15 );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.sidebar-inner,&lt;br /&gt;
	.dropdown {&lt;br /&gt;
		background: var(--sf-panel-2);&lt;br /&gt;
		border: 1px solid var(--sf-line);&lt;br /&gt;
		box-shadow: 0 8px 28px rgba( 0, 0, 0, 0.7 );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Backdrop behind an open menu was a light wash. */&lt;br /&gt;
	#menus-cover {&lt;br /&gt;
		background: #02060d;&lt;br /&gt;
		opacity: 0.82;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#mw-content {&lt;br /&gt;
		border-left: 0;&lt;br /&gt;
		border-right: 0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#mw-content::before,&lt;br /&gt;
	#mw-content::after {&lt;br /&gt;
		display: none;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* --------------------------------------------------------------- Printing -- */&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
	/* Never print the dark theme — it wastes toner and reads badly on paper. */&lt;br /&gt;
	body,&lt;br /&gt;
	#mw-content,&lt;br /&gt;
	#mw-content-container,&lt;br /&gt;
	.mw-body-content,&lt;br /&gt;
	#toc,&lt;br /&gt;
	.toc,&lt;br /&gt;
	#catlinks,&lt;br /&gt;
	.mw-parser-output pre,&lt;br /&gt;
	.mw-body-content pre,&lt;br /&gt;
	.mw-highlight pre,&lt;br /&gt;
	.mw-parser-output code,&lt;br /&gt;
	.thumbinner {&lt;br /&gt;
		background: #fff !important;&lt;br /&gt;
		color: #000 !important;&lt;br /&gt;
		box-shadow: none !important;&lt;br /&gt;
		text-shadow: none !important;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.mw-body-content h2,&lt;br /&gt;
	.mw-body-content h3,&lt;br /&gt;
	#firstHeading {&lt;br /&gt;
		color: #000 !important;&lt;br /&gt;
		background: none !important;&lt;br /&gt;
		text-shadow: none !important;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#p-logo img {&lt;br /&gt;
		filter: none !important;&lt;br /&gt;
		mix-blend-mode: normal !important;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	#mw-content::before,&lt;br /&gt;
	#mw-content::after {&lt;br /&gt;
		display: none !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=ST,_STM32F4_Discovery&amp;diff=763</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=763"/>
		<updated>2026-08-23T10:18:28Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Remove links to pages that were never written&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;STM32F4 Discovery&#039;&#039;&#039; is an ST Cortex-M4 board. These notes cover the GNU/ARM toolchain, building and flashing with ST-Link, and debugging with GDB.&lt;br /&gt;
&lt;br /&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;
== Related projects ==&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 - 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=Nordic,_nRF52_Preview_DK&amp;diff=762</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=762"/>
		<updated>2026-08-23T10:18:28Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Remove links to pages that were never written&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;nRF52 Preview DK&#039;&#039;&#039; is Nordic&#039;s development kit for the nRF52832. These notes cover the SDK, JLink, the GCC toolchain, and programming the board.&lt;br /&gt;
&lt;br /&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;
[[Category:Boards and SoCs]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=ESP8266,_Wi-Fi_SoC&amp;diff=761</id>
		<title>ESP8266, Wi-Fi SoC</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=ESP8266,_Wi-Fi_SoC&amp;diff=761"/>
		<updated>2026-08-23T10:18:28Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Remove links to pages that were never written&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;ESP8266&#039;&#039;&#039; is a Wi-Fi SoC usually met on a NodeMCU DevKit board. These notes cover flashing the NodeMCU firmware, the ESPlorer and Arduino IDE toolchains, and a few Lua examples.&lt;br /&gt;
&lt;br /&gt;
[[File:Esp8266 nodemcu.jpg|thumb|300px|ESP8266 NodeMCU]]&lt;br /&gt;
== Pin definition ==&lt;br /&gt;
[[File:Esp8266 Pinout.png| ESP8266 pin definition]]&lt;br /&gt;
== Pre-build firmware ==&lt;br /&gt;
* Download&lt;br /&gt;
** git clone https://github.com/nodemcu/nodemcu-firmware/releases&lt;br /&gt;
== NodeMCU flasher ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NodeMCU flasher is a firmware programmer for NodeMCU DEVKIT V0.9.&lt;br /&gt;
You can use it to program NodeMCU DEVKIT or your own ESP8266 board.&lt;br /&gt;
You MUST set GPIO0 to LOW before programming, and NodeMCU DEVKIT V0.9 will do it automatically.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:ESP8266Flasher_1.png|250px|ESP8266Flasher_1]][[File:ESP8266Flasher_2.png|250px|ESP8266Flasher_2]][[File:ESP8266Flasher_3.png|250px|ESP8266Flasher_3]][[File:ESP8266Flasher_4.png|250px|ESP8266Flasher_4]][[File:ESP8266Flasher_5.png|250px|ESP8266Flasher_5]]&lt;br /&gt;
* Download&lt;br /&gt;
** git clone https://github.com/nodemcu/nodemcu-flasher&lt;br /&gt;
** Choice the Win32 / Win64 against your environment&lt;br /&gt;
* Prepare &amp;amp; running&lt;br /&gt;
** So far, it seems like only can flash success in Windows environment&lt;br /&gt;
&lt;br /&gt;
==  ESPlorer ==&lt;br /&gt;
[[File:Esplorer.jpg|500px|Esplorer]]&lt;br /&gt;
* Download&lt;br /&gt;
** http://esp8266.ru/esplorer/#download&lt;br /&gt;
* Build from source&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1.    Install Netbeans 8.1, download from here. I used the &amp;quot;All&amp;quot;, but I think Java SE should be enough.&lt;br /&gt;
2.    Install JDK 1.7 (I wasn&#039;t able to use JDK 1.8), download from here.&lt;br /&gt;
3.    Download rsyntaxtextarea 2.5.6.jar (I wasn&#039;t able to use any other version) from here, put it somewhere and remember where (e.g.: inside the ESPlorer root dir)&lt;br /&gt;
4.    Open the project.properties file in a texteditor, and edit file.reference.rsyntaxtextarea-2.5.6.jar to point to where you put rsyntaxtextarea 2.5.6.jar&lt;br /&gt;
5.    Open netbeans&lt;br /&gt;
6.    Open the ESPlorer project, you should get an error about the JDK platform&lt;br /&gt;
7.    Click resolve, add platform&lt;br /&gt;
8.    Add the JDK 1.7 dir, and where it says Name you should see &amp;quot;JDK 1.7&amp;quot;, rename that to &amp;quot;JDK1.7&amp;quot; (notice the lack of a space), close the dialog 9 press F11 to build&lt;br /&gt;
9.    The ESPLorer .jar should be under the dist subdir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare &amp;amp; running&lt;br /&gt;
** Install java&lt;br /&gt;
** java -jar EXPlorer.jar&lt;br /&gt;
&lt;br /&gt;
== Breathing LED ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
pwm.setup(2, 500, 512)&lt;br /&gt;
pwm.start(2)&lt;br /&gt;
&lt;br /&gt;
pwm.setduty(2, 0)&lt;br /&gt;
i = 0&lt;br /&gt;
&lt;br /&gt;
while true do&lt;br /&gt;
    while i &amp;lt; 512 do&lt;br /&gt;
    pwm.setduty(2, i)&lt;br /&gt;
    i=i+5&lt;br /&gt;
    tmr.delay(20000)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    tmr.delay(100000)&lt;br /&gt;
&lt;br /&gt;
    while i &amp;gt; 0 do&lt;br /&gt;
    pwm.setduty(2, i)&lt;br /&gt;
    i=i-5&lt;br /&gt;
    tmr.delay(20000)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    tmr.delay(50000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== httpserver to control GPIO ==&lt;br /&gt;
* Lua script ( &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;wifi.sta.config SHOULD provide real AP information&amp;lt;/span&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
wifi.setmode(wifi.STATION)&lt;br /&gt;
wifi.sta.config(&amp;quot;YOUR_NETWORK_NAME&amp;quot;,&amp;quot;YOUR_NETWORK_PASSWORD&amp;quot;)&lt;br /&gt;
print(wifi.sta.getip())&lt;br /&gt;
led1 = 3&lt;br /&gt;
led2 = 4&lt;br /&gt;
gpio.mode(led1, gpio.OUTPUT)&lt;br /&gt;
gpio.mode(led2, gpio.OUTPUT)&lt;br /&gt;
srv=net.createServer(net.TCP)&lt;br /&gt;
srv:listen(80,function(conn)&lt;br /&gt;
    conn:on(&amp;quot;receive&amp;quot;, function(client,request)&lt;br /&gt;
        local buf = &amp;quot;&amp;quot;;&lt;br /&gt;
        local _, _, method, path, vars = string.find(request, &amp;quot;([A-Z]+) (.+)?(.+) HTTP&amp;quot;);&lt;br /&gt;
        if(method == nil)then&lt;br /&gt;
            _, _, method, path = string.find(request, &amp;quot;([A-Z]+) (.+) HTTP&amp;quot;);&lt;br /&gt;
        end&lt;br /&gt;
        local _GET = {}&lt;br /&gt;
        if (vars ~= nil)then&lt;br /&gt;
            for k, v in string.gmatch(vars, &amp;quot;(%w+)=(%w+)&amp;amp;*&amp;quot;) do&lt;br /&gt;
                _GET[k] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        buf = buf..&amp;quot;&amp;lt;h1&amp;gt; ESP8266 Web Server&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
        buf = buf..&amp;quot;&amp;lt;p&amp;gt;GPIO0 &amp;lt;a href=\&amp;quot;?pin=ON1\&amp;quot;&amp;gt;&amp;lt;button&amp;gt;ON&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;?pin=OFF1\&amp;quot;&amp;gt;&amp;lt;button&amp;gt;OFF&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
        buf = buf..&amp;quot;&amp;lt;p&amp;gt;GPIO2 &amp;lt;a href=\&amp;quot;?pin=ON2\&amp;quot;&amp;gt;&amp;lt;button&amp;gt;ON&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;?pin=OFF2\&amp;quot;&amp;gt;&amp;lt;button&amp;gt;OFF&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
        local _on,_off = &amp;quot;&amp;quot;,&amp;quot;&amp;quot;&lt;br /&gt;
        if(_GET.pin == &amp;quot;ON1&amp;quot;)then&lt;br /&gt;
              gpio.write(led1, gpio.HIGH);&lt;br /&gt;
        elseif(_GET.pin == &amp;quot;OFF1&amp;quot;)then&lt;br /&gt;
              gpio.write(led1, gpio.LOW);&lt;br /&gt;
        elseif(_GET.pin == &amp;quot;ON2&amp;quot;)then&lt;br /&gt;
              gpio.write(led2, gpio.HIGH);&lt;br /&gt;
        elseif(_GET.pin == &amp;quot;OFF2&amp;quot;)then&lt;br /&gt;
              gpio.write(led2, gpio.LOW);&lt;br /&gt;
        end&lt;br /&gt;
        client:send(buf);&lt;br /&gt;
        client:close();&lt;br /&gt;
        collectgarbage();&lt;br /&gt;
    end)&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Accessing your web server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
When your ESP8266 restarts it prints in your serial monitor the IP address of your ESP8266. &lt;br /&gt;
If you type your ESP8266 IP address in your web browser, you can access your web server. &lt;br /&gt;
In my case it’s http://192.168.1.8.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:Esp8266_httpserver.png|250px| http server for GPIO control ]]&lt;br /&gt;
&lt;br /&gt;
== Using Arduino IDE as ESP8266 development tool ==&lt;br /&gt;
* Download the Arduino IDE 1.8.2 above&lt;br /&gt;
* Go to File --&amp;gt; Preferences and add the link http://arduino.esp8266.com/stable/package_esp8266com_index.json to the Additional Boards Manager URLS.&lt;br /&gt;
* Go to Tools --&amp;gt; Board --&amp;gt; Boards manager&lt;br /&gt;
* You should now have the esp8266 as an option there since you&#039;ve added it to the Additional Boards. Select it and press Install&lt;br /&gt;
* Wait, and then, .... &lt;br /&gt;
* Now, You have the ESP8266 boards configure. Choose the board you have, &amp;quot;Generic ESP8266 Module&amp;quot; if you got the regular module&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://zh.wikipedia.org/zh-tw/NodeMCU wiki - NodeMCU]&lt;br /&gt;
* [http://nodemcu.com/index_en.html NodeMCU]&lt;br /&gt;
* [https://github.com/nodemcu/nodemcu-flasher NMCU flasher]&lt;br /&gt;
* [http://www.esp8266.com/viewtopic.php?f=22&amp;amp;t=882 ESPlorer]&lt;br /&gt;
* [https://github.com/devyte/nodemcu-platform/wiki/How-to-build-ESPlorer-from-sources How-to-build-ESPlorer-from-sources]&lt;br /&gt;
* [http://randomnerdtutorials.com/esp8266-web-server/ ESP8266 Web Server Tutorial]&lt;br /&gt;
* [http://www.whatimade.today/esp8266-easiest-way-to-program-so-far/ ESP8266 - Easiest way to program so far (Using Arduino IDE)]&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=Application_-_Alexa&amp;diff=760</id>
		<title>Application - Alexa</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_Alexa&amp;diff=760"/>
		<updated>2026-08-23T10:18:27Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Remove links to pages that were never written&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running &#039;&#039;&#039;Alexa Voice Service&#039;&#039;&#039; on a Raspberry Pi and driving smart-home devices through AWS Lambda and AWS IoT, through to skill certification.&lt;br /&gt;
&lt;br /&gt;
[[File:Alexa-logo-3.png|thumb|300px|Alexa Logo]]&lt;br /&gt;
[[File:RPi3_ALEXA.JPG|thumb|300px|RPi3_Alexa]]&lt;br /&gt;
== Hardware ==&lt;br /&gt;
* PRi&lt;br /&gt;
* Speaker&lt;br /&gt;
* Microphone&lt;br /&gt;
&lt;br /&gt;
== OS ==&lt;br /&gt;
* Raspbian&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
* Configure AVS(Alexa Voice Service)&lt;br /&gt;
** https://developer.amazon.com/avs/home.html&lt;br /&gt;
* Connect AVS in your Pi&lt;br /&gt;
** git clone https://github.com/novaspirit/AlexaPi/&lt;br /&gt;
** Go to AlexaPi, then, run &amp;quot;python main.py&amp;quot;&lt;br /&gt;
*Software apps and online services:&lt;br /&gt;
** Alexa Skills Kit&lt;br /&gt;
** AWS Lambda	&lt;br /&gt;
** AWS IoT	&lt;br /&gt;
** Alexa Voice Service&lt;br /&gt;
&lt;br /&gt;
== Python requirement ==&lt;br /&gt;
* pip install --upgrade pip&lt;br /&gt;
* pip install --upgrade requests&lt;br /&gt;
&lt;br /&gt;
== Configure AWS CLI ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pi@raspberrypi:~/projects/rpi/alexa/AWShome $ aws configure&lt;br /&gt;
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE&lt;br /&gt;
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY&lt;br /&gt;
Default region name [None]: us-east-1&lt;br /&gt;
Default output format [None]:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Smart home arch ==&lt;br /&gt;
[[File:Avs_lambda_iot.jpeg|AVS_Lambda_IOT]]&lt;br /&gt;
&lt;br /&gt;
== Create the Things using AWS IoT ==&lt;br /&gt;
* update awscli version to 1.11.75 above&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pi@raspberrypi:~/projects/rpi/alexa/AWShome $ aws iot create-thing --thing-name floor-lamp&lt;br /&gt;
usage: aws [options] &amp;lt;command&amp;gt; &amp;lt;subcommand&amp;gt; [parameters]&lt;br /&gt;
aws: error: argument command: Invalid choice, valid choices are:&lt;br /&gt;
&lt;br /&gt;
autoscaling                              | cloudformation&lt;br /&gt;
cloudfront                               | cloudsearch&lt;br /&gt;
cloudsearchdomain                        | cloudtrail&lt;br /&gt;
cloudwatch                               | cognito-identity&lt;br /&gt;
cognito-sync                             | datapipeline&lt;br /&gt;
directconnect                            | dynamodb&lt;br /&gt;
ec2                                      | elasticache&lt;br /&gt;
elasticbeanstalk                         | elastictranscoder&lt;br /&gt;
elb                                      | emr&lt;br /&gt;
iam                                      | importexport&lt;br /&gt;
kinesis                                  | logs&lt;br /&gt;
opsworks                                 | rds&lt;br /&gt;
redshift                                 | route53&lt;br /&gt;
route53domains                           | sdb&lt;br /&gt;
ses                                      | sns&lt;br /&gt;
sqs                                      | storagegateway&lt;br /&gt;
sts                                      | support&lt;br /&gt;
swf                                      | s3api&lt;br /&gt;
s3                                       | configure&lt;br /&gt;
help&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ALEXA Skill submit ==&lt;br /&gt;
[[File:Alexa_skill_submit.jpg|Alexa skills submit]]&lt;br /&gt;
&lt;br /&gt;
== ALEXA Skill has passed Amazon certification process ==&lt;br /&gt;
[[File:Amazon_skill_passed.jpg|Your Alexa skill Project K is now live!]]&lt;br /&gt;
&lt;br /&gt;
== ALEXA Skill Alive ==&lt;br /&gt;
[[File:Amazon_skill_alive.jpg| skill alive]]&lt;br /&gt;
&lt;br /&gt;
== Search my skill in amazon.com ==&lt;br /&gt;
[[File:Amazon_search_project_k.jpg|Search skill in amazon.com]]&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://blog.yorkxin.org/2013/09/30/oauth2-1-introduction OAuth 2.0 筆記 (1) 世界觀]&lt;br /&gt;
* [https://www.hackster.io/awshome/awshome-home-automation-using-rpi-alexa-iot-a3d3dc AWShome - Home automation using RPi + Alexa + IoT]&lt;br /&gt;
* [https://developer.amazon.com/blogs/post/TxWSCWZI9SPYNT/Coding-Smart-Home-Skill-Adapter-Directives-Using-Node-js Coding Smart Home Skill Adapter Directives Using Node.js]&lt;br /&gt;
* [https://developer.amazon.com/blogs/post/Tx480XF5QCA6IN/managing-device-discovery-for-your-alexa-smart-home-skill Managing Device Discovery for Your Alexa Smart Home Skill]&lt;br /&gt;
* [https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/linking-an-alexa-user-with-a-user-in-your-system Linking an Alexa User with a User in Your System]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&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=759</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=759"/>
		<updated>2026-08-23T10:12:31Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Replace imported text with a locally written 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;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=Tomato_Firmware&amp;diff=758</id>
		<title>Tomato Firmware</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Tomato_Firmware&amp;diff=758"/>
		<updated>2026-08-23T10:12:30Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Replace imported text with a locally written page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Tomato&#039;&#039;&#039; is a free Linux-based replacement firmware for consumer wireless&lt;br /&gt;
routers, mostly Broadcom-based ones. It derives from HyperWRT and is known for a&lt;br /&gt;
compact Ajax web interface with SVG bandwidth graphs.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* Ajax web interface, with real-time bandwidth and connection graphs&lt;br /&gt;
* QoS with per-connection classification&lt;br /&gt;
* Access as CLI over telnet or SSH (Dropbear), plus BusyBox userland&lt;br /&gt;
* Wireless modes beyond AP: client, bridge and WDS&lt;br /&gt;
* DHCP and DNS through Dnsmasq, dynamic DNS, Wake-on-LAN&lt;br /&gt;
* Static routing, port forwarding, UPnP and NAT-PMP&lt;br /&gt;
* Scripting hooks on firewall, init and shutdown&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Originally the Linksys WRT54G family; later builds cover a wider range of&lt;br /&gt;
Broadcom-based Linksys, Asus, Netgear and Buffalo routers. Check a specific model&lt;br /&gt;
against the build you intend to flash before flashing it.&lt;br /&gt;
&lt;br /&gt;
== Forks ==&lt;br /&gt;
Development moved into forks. &#039;&#039;&#039;TomatoUSB&#039;&#039;&#039; added USB and NAS support;&lt;br /&gt;
&#039;&#039;&#039;Shibby&#039;&#039;&#039; and &#039;&#039;&#039;FreshTomato&#039;&#039;&#039; carried it forward from there.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [https://openwrt.org/ OpenWrt] - the general-purpose alternative, far wider hardware support&lt;br /&gt;
* [https://dd-wrt.com/ DD-WRT] - the other long-running Broadcom-focused firmware&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Tomato_(firmware) Tomato (firmware) - Wikipedia]&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=Software_version&amp;diff=757</id>
		<title>Software version</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Software_version&amp;diff=757"/>
		<updated>2026-08-23T10:12:30Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Replace imported text with a locally written page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Software versioning&#039;&#039;&#039; is the practice of assigning identifiers to distinct&lt;br /&gt;
releases. This page records the scheme used on this wiki and the alternatives it&lt;br /&gt;
was chosen over.&lt;br /&gt;
&lt;br /&gt;
== Scheme used here ==&lt;br /&gt;
Four sequences, &#039;&#039;&#039;major.minor.patch.build&#039;&#039;&#039; - the form used by the release logs&lt;br /&gt;
on [[ASTAR]], [[RTD1073]], [[Netgem]] and [[Tiny6410]], for example&lt;br /&gt;
&amp;lt;code&amp;gt;NTV350_Diag_1.0.3.4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! Increment when&lt;br /&gt;
|-&lt;br /&gt;
| major || The interface changes in a way that breaks existing users.&lt;br /&gt;
|-&lt;br /&gt;
| minor || Features are added, but existing users are unaffected.&lt;br /&gt;
|-&lt;br /&gt;
| patch || Only defects are fixed.&lt;br /&gt;
|-&lt;br /&gt;
| build || A new build of otherwise identical source.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Any field that increments resets every field to its right.&lt;br /&gt;
&lt;br /&gt;
== Other schemes ==&lt;br /&gt;
* &#039;&#039;&#039;Semantic versioning&#039;&#039;&#039; - three sequences with the same major/minor/patch&lt;br /&gt;
  rules made explicit and machine-checkable. See [https://semver.org/ semver.org].&lt;br /&gt;
* &#039;&#039;&#039;Date-based&#039;&#039;&#039; - &amp;lt;code&amp;gt;2015.04&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;20150401&amp;lt;/code&amp;gt;. Says when, not&lt;br /&gt;
  what changed; useful for rolling releases.&lt;br /&gt;
* &#039;&#039;&#039;Year of release&#039;&#039;&#039; - marketing-facing, e.g. Windows 95. Carries no ordering&lt;br /&gt;
  information for a maintainer.&lt;br /&gt;
* &#039;&#039;&#039;Degree of compatibility&#039;&#039;&#039; - some projects encode ABI compatibility in the&lt;br /&gt;
  major number so a linker can reason about it.&lt;br /&gt;
&lt;br /&gt;
== Practice ==&lt;br /&gt;
* The version in the binary and the version in the tag must match. If they can&lt;br /&gt;
  disagree, they eventually will.&lt;br /&gt;
* Never reuse a version number, even for a build that was never shipped.&lt;br /&gt;
* An unreleased tree carries the next version with a suffix, not the last&lt;br /&gt;
  released version.&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Software_versioning Software versioning - Wikipedia]&lt;br /&gt;
* [https://semver.org/ Semantic Versioning]&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=756</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=756"/>
		<updated>2026-08-23T10:12:30Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Replace imported text with a locally written page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;software release life cycle&#039;&#039;&#039; is the sequence of stages a piece of&lt;br /&gt;
software passes through, from first build to end of life. These are the stage&lt;br /&gt;
names used on this wiki.&lt;br /&gt;
&lt;br /&gt;
== Stages ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Stage !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| Pre-alpha || Anything before feature freeze - design, coding, unit testing.&lt;br /&gt;
|-&lt;br /&gt;
| Alpha || Feature complete is not expected. Tested internally, usually by the developers. Known to be unstable.&lt;br /&gt;
|-&lt;br /&gt;
| Beta || Feature complete, but not bug complete. Given to testers outside the team; a &#039;&#039;&#039;closed beta&#039;&#039;&#039; goes to invited testers, an &#039;&#039;&#039;open beta&#039;&#039;&#039; to anyone.&lt;br /&gt;
|-&lt;br /&gt;
| Release candidate || Beta with no known blocking defects. Ships as the release unless something new is found.&lt;br /&gt;
|-&lt;br /&gt;
| RTM || Release to manufacturing. The build handed to the customer or to production.&lt;br /&gt;
|-&lt;br /&gt;
| GA || General availability. The build published to everyone, through whatever channel it ships in.&lt;br /&gt;
|-&lt;br /&gt;
| Support || Defect fixes and service releases against a shipped version.&lt;br /&gt;
|-&lt;br /&gt;
| End of life || No further fixes. The version is no longer supported.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Freezes ==&lt;br /&gt;
* &#039;&#039;&#039;Feature freeze&#039;&#039;&#039; - no new features accepted; only defect fixes.&lt;br /&gt;
* &#039;&#039;&#039;Code freeze&#039;&#039;&#039; - no changes at all except those fixing a blocking defect.&lt;br /&gt;
&lt;br /&gt;
== Practice ==&lt;br /&gt;
* Do not call a build beta until it is feature complete - it makes the remaining&lt;br /&gt;
  defect count meaningless.&lt;br /&gt;
* A release candidate that needs a change becomes a new release candidate, not a&lt;br /&gt;
  patched one.&lt;br /&gt;
* Tag every build that leaves the team, so a defect report can be tied to a&lt;br /&gt;
  specific tree.&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Software_release_life_cycle Software release life cycle - Wikipedia]&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=Tomato_Firmware&amp;diff=755</id>
		<title>Tomato Firmware</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Tomato_Firmware&amp;diff=755"/>
		<updated>2026-08-23T10:01:25Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox software&lt;br /&gt;
|name= Tomato Firmware&lt;br /&gt;
|logo= [[File: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;
== Reference ==&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=754</id>
		<title>Tiny6410</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Tiny6410&amp;diff=754"/>
		<updated>2026-08-23T10:01:25Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Tiny6410&#039;&#039;&#039; was an internal ARM11 evaluation board project on the Samsung S3C6410. This page is the release log for its camera work.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;The repository referenced below (&amp;lt;code&amp;gt;192.168.50.188&amp;lt;/code&amp;gt;) no longer exists. These notes are the surviving record of the project.&#039;&#039;&lt;br /&gt;
&lt;br /&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;
[[File: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;
&lt;br /&gt;
&#039;&#039;Not recorded. The repository this page refers to is gone, so this cannot be recovered.&#039;&#039;&lt;br /&gt;
&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=753</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=753"/>
		<updated>2026-08-23T10:01:24Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Teensy 4.0&#039;&#039;&#039; is a 600 MHz Cortex-M7 board built on the NXP i.MX RT1062. These notes cover the pinout, memory map, and building for it with Teensyduino, PlatformIO and the NXP MCUXpresso SDK.&lt;br /&gt;
&lt;br /&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;
Teensy 4.0 carries an NXP i.MX RT1062, so NXP&#039;s own tools can be used to study&lt;br /&gt;
the chip even though Teensy itself is normally programmed through Teensyduino or&lt;br /&gt;
PlatformIO. MCUXpresso IDE is NXP&#039;s free Eclipse-based IDE for i.MX RT, LPC and&lt;br /&gt;
Kinetis parts; it bundles the GNU Arm toolchain and supports the SDK examples&lt;br /&gt;
built in the NXP SDK section below.&lt;br /&gt;
&lt;br /&gt;
* Download from NXP (account required)&lt;br /&gt;
* Import an SDK as a zip, then &#039;&#039;&#039;Import SDK example&#039;&#039;&#039; to build the EVK projects&lt;br /&gt;
* Debug over the EVK&#039;s on-board CMSIS-DAP; Teensy 4.0 has no SWD header brought&lt;br /&gt;
  out, so the IDE is useful for reference builds rather than flashing a Teensy&lt;br /&gt;
&lt;br /&gt;
== MCUXpresso Config Tools ==&lt;br /&gt;
&lt;br /&gt;
A standalone GUI for generating the start-up code for an i.MX RT part. It has&lt;br /&gt;
three sub-tools:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Pins&#039;&#039;&#039; - assign peripheral signals to package pins, flags conflicts&lt;br /&gt;
* &#039;&#039;&#039;Clocks&#039;&#039;&#039; - configure the PLLs and clock tree, shows the resulting frequencies&lt;br /&gt;
* &#039;&#039;&#039;Peripherals&#039;&#039;&#039; - configure a peripheral and emit its init struct&lt;br /&gt;
&lt;br /&gt;
Output is written back into the project as pin_mux.c, clock_config.c and&lt;br /&gt;
peripherals.c. It can run standalone or from inside MCUXpresso IDE.&lt;br /&gt;
&lt;br /&gt;
== MCUXpresso SDK ==&lt;br /&gt;
&lt;br /&gt;
The per-board driver and example package. Build one for a given board with the&lt;br /&gt;
SDK Builder at https://mcuxpresso.nxp.com and choose the toolchain when&lt;br /&gt;
generating it - the armgcc variant is what the NXP SDK section below builds.&lt;br /&gt;
&lt;br /&gt;
Contents:&lt;br /&gt;
* &#039;&#039;&#039;devices/&#039;&#039;&#039; - CMSIS headers, start-up code and peripheral drivers (fsl_*.c)&lt;br /&gt;
* &#039;&#039;&#039;boards/&#039;&#039;&#039; - board-specific examples, one directory per example&lt;br /&gt;
* &#039;&#039;&#039;middleware/&#039;&#039;&#039; - optional stacks such as USB, FatFs and lwIP&lt;br /&gt;
&lt;br /&gt;
For Teensy 4.0 the relevant board is EVK-MIMXRT1060, whose MIMXRT1062 is the same&lt;br /&gt;
part as the one on the Teensy.&lt;br /&gt;
&lt;br /&gt;
== NXP SDK ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;
  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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related projects ==&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=Software_version&amp;diff=752</id>
		<title>Software version</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Software_version&amp;diff=752"/>
		<updated>2026-08-23T10:01:24Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Software versioning&#039;&#039;&#039; is the process of assigning identifiers to distinct releases of a piece of software. This article surveys the schemes in use.&lt;br /&gt;
&lt;br /&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;
[[File: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=751</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=751"/>
		<updated>2026-08-23T10:01:23Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&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     = [[File: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;
== Reference ==&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=ST,_STM32F4_Discovery&amp;diff=750</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=750"/>
		<updated>2026-08-23T10:01:23Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;STM32F4 Discovery&#039;&#039;&#039; is an ST Cortex-M4 board. These notes cover the GNU/ARM toolchain, building and flashing with ST-Link, and debugging with GDB.&lt;br /&gt;
&lt;br /&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;
== Related projects ==&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=RTD1073&amp;diff=749</id>
		<title>RTD1073</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=RTD1073&amp;diff=749"/>
		<updated>2026-08-23T10:01:23Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;RTD1073&#039;&#039;&#039; was a RealTek-based IP media player built for NetGear. This page is the release log for its diagnostic and RadioTime firmware, 2010-2011.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;The repository referenced below (&amp;lt;code&amp;gt;192.168.50.188&amp;lt;/code&amp;gt;) no longer exists. These notes are the surviving record of the project.&#039;&#039;&lt;br /&gt;
&lt;br /&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;
[[File: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;
&lt;br /&gt;
&#039;&#039;Not recorded. The repository this page refers to is gone, so this cannot be recovered.&#039;&#039;&lt;br /&gt;
&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=748</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=748"/>
		<updated>2026-08-23T10:01:22Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Building Android for the Qualcomm &#039;&#039;&#039;HDK8250&#039;&#039;&#039; (SM8250) - the HLOS images, the non-HLOS images, and programming them to the board.&lt;br /&gt;
&lt;br /&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
	 sudo rm /bin/sh &lt;br /&gt;
	 sudo ln -s /bin/bash /bin/sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* install repo (dependency with python and git) ... prefer to use python 2.7&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sync Android ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build the application processor Android HLOS images ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== aDSP ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== cDSP ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SLIP ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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=OpenSync&amp;diff=747</id>
		<title>OpenSync</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=OpenSync&amp;diff=747"/>
		<updated>2026-08-23T10:01:22Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Packaging &#039;&#039;&#039;OpenSync&#039;&#039;&#039; for Yocto and OpenWrt, and the patches each needed.&lt;br /&gt;
&lt;br /&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;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*patche - 002-protobuf-c.patch&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&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=746</id>
		<title>ODROID-C4</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=ODROID-C4&amp;diff=746"/>
		<updated>2026-08-23T10:01:21Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;ODROID-C4&#039;&#039;&#039; is an Amlogic S905X3 single-board computer. These notes cover its pin map and building Android for it.&lt;br /&gt;
&lt;br /&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=745</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=745"/>
		<updated>2026-08-23T10:01:21Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;nRF52 Preview DK&#039;&#039;&#039; is Nordic&#039;s development kit for the nRF52832. These notes cover the SDK, JLink, the GCC toolchain, and programming the board.&lt;br /&gt;
&lt;br /&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;
== Related projects ==&lt;br /&gt;
* [[nRF52 Application - HMC5883L( 3 Axis Digital Compass)]]&lt;br /&gt;
* [[nRF52 Application - MAX7219, Serially Interfaced, 8-Digit LED Display Drivers (scrolling text)]]&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=NXP,_i.MX_6UL&amp;diff=744</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=744"/>
		<updated>2026-08-23T10:01:20Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Building a Yocto BSP for the NXP &#039;&#039;&#039;i.MX 6UL&#039;&#039;&#039;, and the patches needed to get the older host tools to build.&lt;br /&gt;
&lt;br /&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;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
* freadahead.patch&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
* stdio-impl.patch&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patches - bison_3.0.4.bb ==&lt;br /&gt;
* fseterr.patch&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;/syntaxhighlight&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=Maixduino&amp;diff=743</id>
		<title>Maixduino</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Maixduino&amp;diff=743"/>
		<updated>2026-08-23T10:01:20Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Maixduino&#039;&#039;&#039; is a Kendryte K210 RISC-V board. These notes cover the toolchain, building and customising the firmware, and flashing it.&lt;br /&gt;
&lt;br /&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Build ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FW ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Install dependencies ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Configure project ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;python&amp;quot;&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;/syntaxhighlight&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=Hikey960&amp;diff=742</id>
		<title>Hikey960</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Hikey960&amp;diff=742"/>
		<updated>2026-08-23T10:01:19Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;HiKey960&#039;&#039;&#039; is a 96Boards platform. These notes cover building and flashing Android on it, the kernel build, and enabling its 1.8 V UART.&lt;br /&gt;
&lt;br /&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>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=ESP8266,_Wi-Fi_SoC&amp;diff=741</id>
		<title>ESP8266, Wi-Fi SoC</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=ESP8266,_Wi-Fi_SoC&amp;diff=741"/>
		<updated>2026-08-23T10:01:19Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;ESP8266&#039;&#039;&#039; is a Wi-Fi SoC usually met on a NodeMCU DevKit board. These notes cover flashing the NodeMCU firmware, the ESPlorer and Arduino IDE toolchains, and a few Lua examples.&lt;br /&gt;
&lt;br /&gt;
[[File:Esp8266 nodemcu.jpg|thumb|300px|ESP8266 NodeMCU]]&lt;br /&gt;
== Pin definition ==&lt;br /&gt;
[[File:Esp8266 Pinout.png| ESP8266 pin definition]]&lt;br /&gt;
== Pre-build firmware ==&lt;br /&gt;
* Download&lt;br /&gt;
** git clone https://github.com/nodemcu/nodemcu-firmware/releases&lt;br /&gt;
== NodeMCU flasher ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NodeMCU flasher is a firmware programmer for NodeMCU DEVKIT V0.9.&lt;br /&gt;
You can use it to program NodeMCU DEVKIT or your own ESP8266 board.&lt;br /&gt;
You MUST set GPIO0 to LOW before programming, and NodeMCU DEVKIT V0.9 will do it automatically.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:ESP8266Flasher_1.png|250px|ESP8266Flasher_1]][[File:ESP8266Flasher_2.png|250px|ESP8266Flasher_2]][[File:ESP8266Flasher_3.png|250px|ESP8266Flasher_3]][[File:ESP8266Flasher_4.png|250px|ESP8266Flasher_4]][[File:ESP8266Flasher_5.png|250px|ESP8266Flasher_5]]&lt;br /&gt;
* Download&lt;br /&gt;
** git clone https://github.com/nodemcu/nodemcu-flasher&lt;br /&gt;
** Choice the Win32 / Win64 against your environment&lt;br /&gt;
* Prepare &amp;amp; running&lt;br /&gt;
** So far, it seems like only can flash success in Windows environment&lt;br /&gt;
&lt;br /&gt;
==  ESPlorer ==&lt;br /&gt;
[[File:Esplorer.jpg|500px|Esplorer]]&lt;br /&gt;
* Download&lt;br /&gt;
** http://esp8266.ru/esplorer/#download&lt;br /&gt;
* Build from source&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1.    Install Netbeans 8.1, download from here. I used the &amp;quot;All&amp;quot;, but I think Java SE should be enough.&lt;br /&gt;
2.    Install JDK 1.7 (I wasn&#039;t able to use JDK 1.8), download from here.&lt;br /&gt;
3.    Download rsyntaxtextarea 2.5.6.jar (I wasn&#039;t able to use any other version) from here, put it somewhere and remember where (e.g.: inside the ESPlorer root dir)&lt;br /&gt;
4.    Open the project.properties file in a texteditor, and edit file.reference.rsyntaxtextarea-2.5.6.jar to point to where you put rsyntaxtextarea 2.5.6.jar&lt;br /&gt;
5.    Open netbeans&lt;br /&gt;
6.    Open the ESPlorer project, you should get an error about the JDK platform&lt;br /&gt;
7.    Click resolve, add platform&lt;br /&gt;
8.    Add the JDK 1.7 dir, and where it says Name you should see &amp;quot;JDK 1.7&amp;quot;, rename that to &amp;quot;JDK1.7&amp;quot; (notice the lack of a space), close the dialog 9 press F11 to build&lt;br /&gt;
9.    The ESPLorer .jar should be under the dist subdir&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Prepare &amp;amp; running&lt;br /&gt;
** Install java&lt;br /&gt;
** java -jar EXPlorer.jar&lt;br /&gt;
&lt;br /&gt;
== Breathing LED ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
pwm.setup(2, 500, 512)&lt;br /&gt;
pwm.start(2)&lt;br /&gt;
&lt;br /&gt;
pwm.setduty(2, 0)&lt;br /&gt;
i = 0&lt;br /&gt;
&lt;br /&gt;
while true do&lt;br /&gt;
    while i &amp;lt; 512 do&lt;br /&gt;
    pwm.setduty(2, i)&lt;br /&gt;
    i=i+5&lt;br /&gt;
    tmr.delay(20000)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    tmr.delay(100000)&lt;br /&gt;
&lt;br /&gt;
    while i &amp;gt; 0 do&lt;br /&gt;
    pwm.setduty(2, i)&lt;br /&gt;
    i=i-5&lt;br /&gt;
    tmr.delay(20000)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    tmr.delay(50000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== httpserver to control GPIO ==&lt;br /&gt;
* Lua script ( &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;wifi.sta.config SHOULD provide real AP information&amp;lt;/span&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
wifi.setmode(wifi.STATION)&lt;br /&gt;
wifi.sta.config(&amp;quot;YOUR_NETWORK_NAME&amp;quot;,&amp;quot;YOUR_NETWORK_PASSWORD&amp;quot;)&lt;br /&gt;
print(wifi.sta.getip())&lt;br /&gt;
led1 = 3&lt;br /&gt;
led2 = 4&lt;br /&gt;
gpio.mode(led1, gpio.OUTPUT)&lt;br /&gt;
gpio.mode(led2, gpio.OUTPUT)&lt;br /&gt;
srv=net.createServer(net.TCP)&lt;br /&gt;
srv:listen(80,function(conn)&lt;br /&gt;
    conn:on(&amp;quot;receive&amp;quot;, function(client,request)&lt;br /&gt;
        local buf = &amp;quot;&amp;quot;;&lt;br /&gt;
        local _, _, method, path, vars = string.find(request, &amp;quot;([A-Z]+) (.+)?(.+) HTTP&amp;quot;);&lt;br /&gt;
        if(method == nil)then&lt;br /&gt;
            _, _, method, path = string.find(request, &amp;quot;([A-Z]+) (.+) HTTP&amp;quot;);&lt;br /&gt;
        end&lt;br /&gt;
        local _GET = {}&lt;br /&gt;
        if (vars ~= nil)then&lt;br /&gt;
            for k, v in string.gmatch(vars, &amp;quot;(%w+)=(%w+)&amp;amp;*&amp;quot;) do&lt;br /&gt;
                _GET[k] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        buf = buf..&amp;quot;&amp;lt;h1&amp;gt; ESP8266 Web Server&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
        buf = buf..&amp;quot;&amp;lt;p&amp;gt;GPIO0 &amp;lt;a href=\&amp;quot;?pin=ON1\&amp;quot;&amp;gt;&amp;lt;button&amp;gt;ON&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;?pin=OFF1\&amp;quot;&amp;gt;&amp;lt;button&amp;gt;OFF&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
        buf = buf..&amp;quot;&amp;lt;p&amp;gt;GPIO2 &amp;lt;a href=\&amp;quot;?pin=ON2\&amp;quot;&amp;gt;&amp;lt;button&amp;gt;ON&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;a href=\&amp;quot;?pin=OFF2\&amp;quot;&amp;gt;&amp;lt;button&amp;gt;OFF&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
        local _on,_off = &amp;quot;&amp;quot;,&amp;quot;&amp;quot;&lt;br /&gt;
        if(_GET.pin == &amp;quot;ON1&amp;quot;)then&lt;br /&gt;
              gpio.write(led1, gpio.HIGH);&lt;br /&gt;
        elseif(_GET.pin == &amp;quot;OFF1&amp;quot;)then&lt;br /&gt;
              gpio.write(led1, gpio.LOW);&lt;br /&gt;
        elseif(_GET.pin == &amp;quot;ON2&amp;quot;)then&lt;br /&gt;
              gpio.write(led2, gpio.HIGH);&lt;br /&gt;
        elseif(_GET.pin == &amp;quot;OFF2&amp;quot;)then&lt;br /&gt;
              gpio.write(led2, gpio.LOW);&lt;br /&gt;
        end&lt;br /&gt;
        client:send(buf);&lt;br /&gt;
        client:close();&lt;br /&gt;
        collectgarbage();&lt;br /&gt;
    end)&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Accessing your web server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
When your ESP8266 restarts it prints in your serial monitor the IP address of your ESP8266. &lt;br /&gt;
If you type your ESP8266 IP address in your web browser, you can access your web server. &lt;br /&gt;
In my case it’s http://192.168.1.8.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:Esp8266_httpserver.png|250px| http server for GPIO control ]]&lt;br /&gt;
&lt;br /&gt;
== Using Arduino IDE as ESP8266 development tool ==&lt;br /&gt;
* Download the Arduino IDE 1.8.2 above&lt;br /&gt;
* Go to File --&amp;gt; Preferences and add the link http://arduino.esp8266.com/stable/package_esp8266com_index.json to the Additional Boards Manager URLS.&lt;br /&gt;
* Go to Tools --&amp;gt; Board --&amp;gt; Boards manager&lt;br /&gt;
* You should now have the esp8266 as an option there since you&#039;ve added it to the Additional Boards. Select it and press Install&lt;br /&gt;
* Wait, and then, .... &lt;br /&gt;
* Now, You have the ESP8266 boards configure. Choose the board you have, &amp;quot;Generic ESP8266 Module&amp;quot; if you got the regular module&lt;br /&gt;
&lt;br /&gt;
== Related projects ==&lt;br /&gt;
* [[application - wifi node (Alexa / IFTTT)]]&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://zh.wikipedia.org/zh-tw/NodeMCU wiki - NodeMCU]&lt;br /&gt;
* [http://nodemcu.com/index_en.html NodeMCU]&lt;br /&gt;
* [https://github.com/nodemcu/nodemcu-flasher NMCU flasher]&lt;br /&gt;
* [http://www.esp8266.com/viewtopic.php?f=22&amp;amp;t=882 ESPlorer]&lt;br /&gt;
* [https://github.com/devyte/nodemcu-platform/wiki/How-to-build-ESPlorer-from-sources How-to-build-ESPlorer-from-sources]&lt;br /&gt;
* [http://randomnerdtutorials.com/esp8266-web-server/ ESP8266 Web Server Tutorial]&lt;br /&gt;
* [http://www.whatimade.today/esp8266-easiest-way-to-program-so-far/ ESP8266 - Easiest way to program so far (Using Arduino IDE)]&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=CAN_bus&amp;diff=740</id>
		<title>CAN bus</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=CAN_bus&amp;diff=740"/>
		<updated>2026-08-23T10:01:19Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bringing up a &#039;&#039;&#039;CAN bus&#039;&#039;&#039; with an SN65HVD251 transceiver, looped between the two CAN controllers of an mbed LPC1768.&lt;br /&gt;
&lt;br /&gt;
== CAN TRANSCEIVER Module - SN65HVD251 ==&lt;br /&gt;
[[File:CAN_TRANSCEIVER_Module.jpg|border|350px|CAN TRANSCEIVER Module]]&lt;br /&gt;
[[File:CAN_TRANSCEIVER_Module_01.jpg|CAN TRANSCEIVER Module]]&lt;br /&gt;
&lt;br /&gt;
== Setup CAN bus ==&lt;br /&gt;
* loops the data between the mbed LPC1768&#039;s two CAN buses.&lt;br /&gt;
[[File:Can.jpg|border|350px|CAN bus + LPC1768]]&lt;br /&gt;
[[File:CAN_self_test.png|border|350px|CAN bus looping]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;mbed.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CAN.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ticker ticker;&lt;br /&gt;
DigitalOut led1(LED1);&lt;br /&gt;
DigitalOut led2(LED2);&lt;br /&gt;
CAN can1(p9, p10);&lt;br /&gt;
CAN can2(p30, p29);&lt;br /&gt;
Serial pc(USBTX, USBRX);&lt;br /&gt;
char counter = 0;&lt;br /&gt;
&lt;br /&gt;
void send() {&lt;br /&gt;
    //pc.printf(&amp;quot;send()\n&amp;quot;);&lt;br /&gt;
    if(can1.write(CANMessage(1337, &amp;amp;counter, 1))) {&lt;br /&gt;
        //pc.printf(&amp;quot;wloop()\n&amp;quot;);&lt;br /&gt;
        counter++;&lt;br /&gt;
        //pc.printf(&amp;quot;Message sent: %d\n&amp;quot;, counter);&lt;br /&gt;
    }&lt;br /&gt;
    led1 = !led1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main() {&lt;br /&gt;
    pc.printf(&amp;quot;main()\n&amp;quot;);&lt;br /&gt;
    ticker.attach(&amp;amp;send, 1);&lt;br /&gt;
    CANMessage msg; &lt;br /&gt;
    while(1) {&lt;br /&gt;
        //pc.printf(&amp;quot;loop()\n&amp;quot;);&lt;br /&gt;
        if(can2.read(msg)) {&lt;br /&gt;
            pc.printf(&amp;quot;Message received: %4d\n\r&amp;quot;, msg.data[0]);&lt;br /&gt;
            led2 = !led2;&lt;br /&gt;
        } &lt;br /&gt;
        wait(0.2); &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Result ==&lt;br /&gt;
* stty -F /dev/ttyACM0 speed 9600 -crtscts cs8 -cstopb -parenb -icrnl&lt;br /&gt;
* cat &amp;lt; /dev/ttyACM0&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
The following will using CAN bus to send counting message from 0 to 255 and repeat again:&lt;br /&gt;
...&lt;br /&gt;
Message received:  246&lt;br /&gt;
Message received:  247&lt;br /&gt;
Message received:  248&lt;br /&gt;
Message received:  249&lt;br /&gt;
Message received:  250&lt;br /&gt;
Message received:  251&lt;br /&gt;
Message received:  252&lt;br /&gt;
Message received:  253&lt;br /&gt;
Message received:  254&lt;br /&gt;
Message received:  255&lt;br /&gt;
Message received:    0&lt;br /&gt;
Message received:    1&lt;br /&gt;
Message received:    2&lt;br /&gt;
Message received:    3&lt;br /&gt;
Message received:    4&lt;br /&gt;
Message received:    5&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://developer.mbed.org/handbook/CAN ARMmbed CAN]&lt;br /&gt;
&lt;br /&gt;
[[Category:Connectivity]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Arduino_Pro_Mini,_ATMega328P&amp;diff=739</id>
		<title>Arduino Pro Mini, ATMega328P</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Arduino_Pro_Mini,_ATMega328P&amp;diff=739"/>
		<updated>2026-08-23T10:01:18Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Arduino Pro Mini&#039;&#039;&#039; is a small ATmega328P board. These notes cover the avr-gcc toolchain, the port mapping and programming it without the Arduino IDE.&lt;br /&gt;
&lt;br /&gt;
== Toolchain ==&lt;br /&gt;
* sudo apt-get install gcc-avr   # A port of GCC to AVR target processor&lt;br /&gt;
* sudo apt-get install gdb-avr   # AVR GNU debugger&lt;br /&gt;
* sudo apt-get install binutils-avr #low-level utilities for building &amp;amp; manipulating object files&lt;br /&gt;
* sudo apt-get install avr-libc # AVR Library files&lt;br /&gt;
* sudo apt-get install avrdude # command-line program for programming AVR chips.&lt;br /&gt;
&lt;br /&gt;
== Pin definition ==&lt;br /&gt;
[[File:ProMiniPinout.png|ProMiniPinout]]&lt;br /&gt;
== PORT mapping ==&lt;br /&gt;
* PORTD maps to Arduino digital pins 0 to 7&lt;br /&gt;
** DDRD - The Port D Data Direction Register - read/write&lt;br /&gt;
** PORTD - The Port D Data Register - read/write&lt;br /&gt;
** PIND - The Port D Input Pins Register - read only&lt;br /&gt;
&lt;br /&gt;
* PORTB maps to Arduino digital pins 8 to 13 The two high bits (6 &amp;amp; 7) map to the crystal pins and are not usable&lt;br /&gt;
** DDRB - The Port B Data Direction Register - read/write&lt;br /&gt;
** PORTB - The Port B Data Register - read/write&lt;br /&gt;
** PINB - The Port B Input Pins Register - read only&lt;br /&gt;
&lt;br /&gt;
* PORTC maps to Arduino analog pins 0 to 5. Pins 6 &amp;amp; 7 are only accessible on the Arduino Mini&lt;br /&gt;
** DDRC - The Port C Data Direction Register - read/write&lt;br /&gt;
** PORTC - The Port C Data Register - read/write&lt;br /&gt;
** PINC - The Port C Input Pins Register - read only&lt;br /&gt;
&lt;br /&gt;
== LED blinking example ==&lt;br /&gt;
* Make sure your makefile have defined F_CPU for clock&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL // 16 MHz clock speed&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRC = 0xFF; //Nakes PORTC as Output&lt;br /&gt;
  while(1) //infinite loop&lt;br /&gt;
  {&lt;br /&gt;
    PORTC = 0xFF; //Turns ON All LEDs&lt;br /&gt;
    _delay_ms(1000); //1 second delay&lt;br /&gt;
    PORTC= 0x00; //Turns OFF All LEDs&lt;br /&gt;
    _delay_ms(1000); //1 second delay&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
[[File:IMAG0194.jpg|250px|Arduino_FTDI connectivity]]&lt;br /&gt;
* The connections to make from the FTDI FT232RL and the Pro Mini are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FTDI232    Arduino_mini&lt;br /&gt;
GND    --&amp;gt;   GND&lt;br /&gt;
&lt;br /&gt;
CTS    --&amp;gt;   GND&lt;br /&gt;
&lt;br /&gt;
VCC    --&amp;gt;   VCC (5V for Ardunio Pro Mini 328 - DEV-1113)&lt;br /&gt;
&lt;br /&gt;
TXD    --&amp;gt;   RXD&lt;br /&gt;
&lt;br /&gt;
RXD    --&amp;gt;   TXD&lt;br /&gt;
&lt;br /&gt;
DTR    --&amp;gt;   DTR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Program command&lt;br /&gt;
** make program   ...or&lt;br /&gt;
** sudo avrdude -q -c arduino -P /dev/ttyUSB2 -b 57600 -p atmega328p -U flash:w:led.hex&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
avrdude: AVR device initialized and ready to accept instructions&lt;br /&gt;
avrdude: Device signature = 0x1e950f&lt;br /&gt;
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed&lt;br /&gt;
         To disable this feature, specify the -D option.&lt;br /&gt;
avrdude: erasing chip&lt;br /&gt;
avrdude: reading input file &amp;quot;led.hex&amp;quot;&lt;br /&gt;
avrdude: input file led.hex auto detected as Intel Hex&lt;br /&gt;
avrdude: writing flash (146 bytes):&lt;br /&gt;
avrdude: 146 bytes of flash written&lt;br /&gt;
avrdude: verifying flash memory against led.hex:&lt;br /&gt;
avrdude: load data flash data from input file led.hex:&lt;br /&gt;
avrdude: input file led.hex auto detected as Intel Hex&lt;br /&gt;
avrdude: input file led.hex contains 146 bytes&lt;br /&gt;
avrdude: reading on-chip flash data:&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 146 bytes of flash verified&lt;br /&gt;
&lt;br /&gt;
avrdude: safemode: Fuses OK&lt;br /&gt;
&lt;br /&gt;
avrdude done.  Thank you.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related projects ==&lt;br /&gt;
* [[Application - BMA250, triaxial acceleration sensor]]&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://electrosome.com/blinking-led-atmega32-avr-microcontroller/ Blinking LED using Atmega32 Microcontroller and Atmel Studio]&lt;br /&gt;
* [https://www.arduino.cc/en/Reference/PortManipulation Port Registers]&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=Application_-_Wifi_AP&amp;diff=738</id>
		<title>Application - Wifi AP</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_Wifi_AP&amp;diff=738"/>
		<updated>2026-08-23T10:01:18Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Turning a Raspberry Pi into a &#039;&#039;&#039;Wi-Fi access point&#039;&#039;&#039; with hostapd and udhcpd, including the NAT configuration for sharing its uplink.&lt;br /&gt;
&lt;br /&gt;
[[File:DSC 2515.JPG|thumb|350px|Wifi AP with GPS]]&lt;br /&gt;
== USB wifi dongle ==&lt;br /&gt;
ID 148f:3572 Ralink Technology, Corp. RT3572 Wireless Adapter&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
sudo apt-get install hostapd udhcpd&lt;br /&gt;
&lt;br /&gt;
=== dhcp server ===&lt;br /&gt;
*Edit the file /etc/udhcpd.conf and configure it like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
start 192.168.42.2 # This is the range of IPs that the hostspot will give to client devices.&lt;br /&gt;
end 192.168.42.20&lt;br /&gt;
interface wlan0 # The device uDHCP listens on.&lt;br /&gt;
remaining yes&lt;br /&gt;
opt dns 8.8.8.8 4.2.2.2 # The DNS servers client devices will use.&lt;br /&gt;
opt subnet 255.255.255.0&lt;br /&gt;
opt router 192.168.42.1 # The Pi&#039;s IP address on wlan0 which we will set up shortly.&lt;br /&gt;
opt lease 864000 # 10 day DHCP lease time in seconds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Edit the file /etc/default/udhcpd and change the line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DHCPD_ENABLED=&amp;quot;no&amp;quot;&lt;br /&gt;
to&lt;br /&gt;
#DHCPD_ENABLED=&amp;quot;no&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hostapd ===&lt;br /&gt;
*edit the file /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
interface=wlan0&lt;br /&gt;
driver=nl80211&lt;br /&gt;
ssid=My_AP&lt;br /&gt;
hw_mode=g&lt;br /&gt;
channel=6&lt;br /&gt;
macaddr_acl=0&lt;br /&gt;
auth_algs=1&lt;br /&gt;
ignore_broadcast_ssid=0&lt;br /&gt;
wpa=2&lt;br /&gt;
wpa_passphrase=My_Passphrase&lt;br /&gt;
wpa_key_mgmt=WPA-PSK&lt;br /&gt;
wpa_pairwise=TKIP&lt;br /&gt;
rsn_pairwise=CCMP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Edit the file /etc/default/hostapd &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#DAEMON_CONF=&amp;quot;&amp;quot;&lt;br /&gt;
to:&lt;br /&gt;
DAEMON_CONF=&amp;quot;/etc/hostapd/hostapd.conf&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure NAT (Network Address Translation) ===&lt;br /&gt;
* fordwarding&lt;br /&gt;
sudo sh -c &amp;quot;echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&amp;quot;&lt;br /&gt;
* iptables&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE&lt;br /&gt;
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
sudo sh -c &amp;quot;iptables-save &amp;gt; /etc/iptables.ipv4.nat&amp;quot;&lt;br /&gt;
up iptables-restore &amp;lt; /etc/iptables.ipv4.nat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Service enable ===&lt;br /&gt;
* makae sure your runlevel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$runlevel&lt;br /&gt;
N 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* make symbolic link to rcS&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /etc/init.d/rc5.d&lt;br /&gt;
# put udhcpd to the last&lt;br /&gt;
ln -s ../init.d/udhcpd S05udhcpd&lt;br /&gt;
ln -s ../init.d/hostapd S01hostapd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* service&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl enable hostapd.service&lt;br /&gt;
sudo systemctl enable udhcpd.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
[http://elinux.org/RPI-Wireless-Hotspot RPI-Wireless-Hotspot]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Application_-_Speech_Recognition&amp;diff=737</id>
		<title>Application - Speech Recognition</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_Speech_Recognition&amp;diff=737"/>
		<updated>2026-08-23T10:01:17Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Driving Raspberry Pi GPIO from &#039;&#039;&#039;speech recognition&#039;&#039;&#039;, mapping recognised phrases onto pins through a shell script.&lt;br /&gt;
&lt;br /&gt;
[[File:RPi3 TR10.jpg|450px|RPi3 + TR10]]&lt;br /&gt;
[[File:Rpi_speech_gpio.gif|450px|RPi3 control GPIO by speech recogination]]&lt;br /&gt;
== Open source ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install rpi-update&lt;br /&gt;
apt-get install git-core&lt;br /&gt;
rpi-update&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Connect your USB microphone (or camera+mic) and&lt;br /&gt;
-&amp;gt; reboot the RPi at this point&lt;br /&gt;
&lt;br /&gt;
vi /etc/modprobe.d/alsa-base.conf &lt;br /&gt;
&lt;br /&gt;
# change as follows:&lt;br /&gt;
# Comment this line&lt;br /&gt;
# options snd-usb-audio index=-2&lt;br /&gt;
# and add the following:&lt;br /&gt;
options snd-usb-audio index=0&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; close the file and reload alsa:&lt;br /&gt;
&lt;br /&gt;
alsa force-reload&lt;br /&gt;
&lt;br /&gt;
wget http://sourceforge.net/projects/cmusphinx/files/sphinxbase/\&lt;br /&gt;
0.8/sphinxbase-0.8.tar.gz/download&lt;br /&gt;
mv download sphinxbase-0.8.tar.gz&lt;br /&gt;
wget http://sourceforge.net/projects/cmusphinx/files/\&lt;br /&gt;
pocketsphinx/0.8/pocketsphinx-0.8.tar.gz/download&lt;br /&gt;
mv download pocketsphinx-0.8.tar.gz&lt;br /&gt;
tar -xzvf sphinxbase-0.8.tar.gz&lt;br /&gt;
tar -xzvf pocketsphinx-0.8.tar.gz&lt;br /&gt;
&lt;br /&gt;
apt-get install bison&lt;br /&gt;
apt-get install libasound2-dev&lt;br /&gt;
&lt;br /&gt;
cd sphinxbase-0.8&lt;br /&gt;
./configure --enable-fixed&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&lt;br /&gt;
cd ../pocketsphinx-0.8/&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPIO MAP ==&lt;br /&gt;
pi@raspberrypi:~/projects/rpi/speech $ gpio readall&lt;br /&gt;
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+&lt;br /&gt;
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |&lt;br /&gt;
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+&lt;br /&gt;
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |&lt;br /&gt;
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |&lt;br /&gt;
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |&lt;br /&gt;
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |&lt;br /&gt;
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |&lt;br /&gt;
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; | OUT  | GPIO. 1 | 1   | 18  |&lt;br /&gt;
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |&lt;br /&gt;
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; | OUT  | GPIO. 4 | 4   | 23  |&lt;br /&gt;
 |     |     |    3.3v |      |   | 17 || 18 | &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; | OUT  | GPIO. 5 | 5   | 24  |&lt;br /&gt;
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |&lt;br /&gt;
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; | OUT  | GPIO. 6 | 6   | 25  |&lt;br /&gt;
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |&lt;br /&gt;
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |&lt;br /&gt;
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |&lt;br /&gt;
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |&lt;br /&gt;
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |&lt;br /&gt;
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |&lt;br /&gt;
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |&lt;br /&gt;
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |&lt;br /&gt;
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |&lt;br /&gt;
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+&lt;br /&gt;
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |&lt;br /&gt;
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+&lt;br /&gt;
&lt;br /&gt;
== GPIO Adapter (using GPIO 12, 16, 18 and 22)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&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;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	char tmp[125];&lt;br /&gt;
	system(&amp;quot;gpio mode 1 out&amp;quot;);&lt;br /&gt;
	system(&amp;quot;gpio mode 4 out&amp;quot;);&lt;br /&gt;
	system(&amp;quot;gpio mode 5 out&amp;quot;);&lt;br /&gt;
	system(&amp;quot;gpio mode 6 out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
	scanf(&amp;quot;%s&amp;quot;,&amp;amp;tmp);&lt;br /&gt;
	if(tmp != &amp;quot;\n&amp;quot;)&lt;br /&gt;
	{	&lt;br /&gt;
	if(!strcmp(tmp,&amp;quot;TOMMY&amp;quot;))&lt;br /&gt;
		system(&amp;quot;gpio write 1 1&amp;quot;);&lt;br /&gt;
	else&lt;br /&gt;
		system(&amp;quot;gpio write 1 0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if(!strcmp(tmp,&amp;quot;MOLLY&amp;quot;))&lt;br /&gt;
                system(&amp;quot;gpio write 4 1&amp;quot;);&lt;br /&gt;
        else&lt;br /&gt;
                system(&amp;quot;gpio write 4 0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if(!strcmp(tmp,&amp;quot;DAISY&amp;quot;))&lt;br /&gt;
                system(&amp;quot;gpio write 5 1&amp;quot;);&lt;br /&gt;
        else&lt;br /&gt;
                system(&amp;quot;gpio write 5 0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if(!strcmp(tmp,&amp;quot;ANNIE&amp;quot;))&lt;br /&gt;
                system(&amp;quot;gpio write 6 1&amp;quot;);&lt;br /&gt;
        else&lt;br /&gt;
                system(&amp;quot;gpio write 6 0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        if(!strcmp(tmp,&amp;quot;OKAY&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
         		system(&amp;quot;gpio write 1 1&amp;quot;);&lt;br /&gt;
			system(&amp;quot;gpio write 4 1&amp;quot;);&lt;br /&gt;
			system(&amp;quot;gpio write 5 1&amp;quot;);&lt;br /&gt;
			system(&amp;quot;gpio write 6 1&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPIO MAP (says, OKAY) ==&lt;br /&gt;
pi@raspberrypi:~/projects/rpi/speech $ gpio readall&lt;br /&gt;
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+&lt;br /&gt;
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |&lt;br /&gt;
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+&lt;br /&gt;
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |&lt;br /&gt;
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |&lt;br /&gt;
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |&lt;br /&gt;
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |&lt;br /&gt;
 |     |     |      0v |      |   |  9 || 10 | &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; | IN   | RxD     | 16  | 15  |&lt;br /&gt;
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; | OUT  | GPIO. 1 | 1   | 18  |&lt;br /&gt;
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |&lt;br /&gt;
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; | OUT  | GPIO. 4 | 4   | 23  |&lt;br /&gt;
 |     |     |    3.3v |      |   | 17 || 18 | &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt; | OUT  | GPIO. 5 | 5   | 24  |&lt;br /&gt;
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |&lt;br /&gt;
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 1 | OUT  | GPIO. 6 | 6   | 25  |&lt;br /&gt;
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |&lt;br /&gt;
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |&lt;br /&gt;
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |&lt;br /&gt;
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |&lt;br /&gt;
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |&lt;br /&gt;
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |&lt;br /&gt;
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |&lt;br /&gt;
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |&lt;br /&gt;
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |&lt;br /&gt;
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+&lt;br /&gt;
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |&lt;br /&gt;
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+&lt;br /&gt;
&lt;br /&gt;
== Shell example ==&lt;br /&gt;
* pi@raspberrypi:~/project/rpi/speech $ pocketsphinx_continuous -lm 7610.lm -dict 7610.dic -inmic yes | ./adapter&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://wolfpaulus.com/journal/embedded/raspberrypi2-sr/ Raspberry Pi 2 – Speech Recognition on device]&lt;br /&gt;
* [https://pypi.python.org/pypi/SpeechRecognition/3.2.0 SpeechRecognition 3.2.0]&lt;br /&gt;
* [http://www.speech.cs.cmu.edu/tools/lmtool-new.html Sphinx Knowledge Base Tool]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Application_-_Monitor_GPIO_interrupt_in_userspace&amp;diff=736</id>
		<title>Application - Monitor GPIO interrupt in userspace</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_Monitor_GPIO_interrupt_in_userspace&amp;diff=736"/>
		<updated>2026-08-23T10:01:17Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Watching a &#039;&#039;&#039;GPIO interrupt from userspace&#039;&#039;&#039; on a Raspberry Pi with a small GLib program, rather than polling the pin.&lt;br /&gt;
&lt;br /&gt;
== Monitor GPIO 4 interrupt ==&lt;br /&gt;
=== watch-button-glib.cpp ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;glib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
#define buf_sz 10&lt;br /&gt;
static int onButtonEvent(GIOChannel *channel, GIOCondition condition, gpointer user_data)&lt;br /&gt;
{&lt;br /&gt;
        static char buf[buf_sz];&lt;br /&gt;
        cerr &amp;lt;&amp;lt; &amp;quot;onButtonEvent&amp;quot; &amp;lt;&amp;lt;endl;&lt;br /&gt;
        GError *error = 0;&lt;br /&gt;
        gsize bytes_read = 0;&lt;br /&gt;
        g_io_channel_seek_position(channel, 0, G_SEEK_SET, 0);&lt;br /&gt;
        GIOStatus rc = g_io_channel_read_chars(channel, buf, buf_sz - 1, &amp;amp;bytes_read, &amp;amp;error);&lt;br /&gt;
        cerr &amp;lt;&amp;lt; &amp;quot;rc:&amp;quot; &amp;lt;&amp;lt; rc &amp;lt;&amp;lt; &amp;quot; data:&amp;quot; &amp;lt;&amp;lt; buf &amp;lt;&amp;lt;endl;&lt;br /&gt;
        return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv)&lt;br /&gt;
{&lt;br /&gt;
        GMainLoop* loop = g_main_loop_new(0,0);&lt;br /&gt;
        int fd = open(&amp;quot;/sys/class/gpio/gpio4/value&amp;quot;, O_RDONLY | O_NONBLOCK);&lt;br /&gt;
        GIOChannel* channel = g_io_channel_unix_new(fd);&lt;br /&gt;
        GIOCondition cond = GIOCondition( G_IO_PRI);&lt;br /&gt;
        guint id = g_io_add_watch(channel, cond, onButtonEvent, 0);&lt;br /&gt;
&lt;br /&gt;
        g_main_loop_run(loop);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
watch-button-glib: watch-button-glib.cpp Makefile&lt;br /&gt;
        g++ watch-button-glib.cpp -o watch-button-glib -I/usr/include/glib-2.0 -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include -lglib-2.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Application_-_MX35LFxGE4AB,_SPI_NAND_Flash&amp;diff=735</id>
		<title>Application - MX35LFxGE4AB, SPI NAND Flash</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_MX35LFxGE4AB,_SPI_NAND_Flash&amp;diff=735"/>
		<updated>2026-08-23T10:01:16Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reading and writing a &#039;&#039;&#039;MX35LFxGE4AB&#039;&#039;&#039; SPI NAND flash from a Raspberry Pi, which needed an extra transfer function added to libbcm2835.&lt;br /&gt;
&lt;br /&gt;
[[File:rpi2_with_spi_nand_flash.jpg|thumb|200px|RPi2 with SPI NAND Flash(MX35LFxGE4AB)]]&lt;br /&gt;
&lt;br /&gt;
== HW connection ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PRi2         --  MX35LFxGE4AB&lt;br /&gt;
VCC          --  VCC(3.3V)&lt;br /&gt;
VCC          --  HOLD(3.3V)&lt;br /&gt;
GPIO19(MOSI) --  SI&lt;br /&gt;
GPIO21(MISO) --  SO&lt;br /&gt;
GPIO23(CLK)  --  SCLK&lt;br /&gt;
GPIO24(CS0)  --  CS&lt;br /&gt;
Gnd          --  Gnd&lt;br /&gt;
Gnd          --  WP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:read_devid_timing.jpg|thumb|200px|MX35LFxGE4AB read device ID timing]]&lt;br /&gt;
== Timing ==&lt;br /&gt;
[[File:MX35LFxGE4AB_cmd.jpg]]&lt;br /&gt;
== Hack libbcm2835 ==&lt;br /&gt;
*Add bcm2835_spi_transfernb_adv() in bcm2835.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* Writes an number of bytes to SPI and read an number of bytes from SPI*/&lt;br /&gt;
void bcm2835_spi_transfernb_adv(char* tbuf, char* rbuf, uint32_t tx_len, uint32_t rx_len)&lt;br /&gt;
{&lt;br /&gt;
    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;&lt;br /&gt;
    volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/4;&lt;br /&gt;
    uint32_t TXCnt=0;&lt;br /&gt;
    uint32_t RXCnt=0;&lt;br /&gt;
&lt;br /&gt;
    /* This is Polled transfer as per section 10.6.1&lt;br /&gt;
    // BUG ALERT: what happens if we get interupted in this section, and someone else&lt;br /&gt;
    // accesses a different peripheral?&lt;br /&gt;
    */&lt;br /&gt;
&lt;br /&gt;
    /* Clear TX and RX fifos */&lt;br /&gt;
    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR);&lt;br /&gt;
&lt;br /&gt;
    /* Set TA = 1 */&lt;br /&gt;
    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA);&lt;br /&gt;
&lt;br /&gt;
    /* Use the FIFO&#039;s to reduce the interbyte times */&lt;br /&gt;
&lt;br /&gt;
        /* TX fifo not full, so add some more bytes */&lt;br /&gt;
        while(TXCnt &amp;lt; len)&lt;br /&gt;
        while((BCM2835_SPI0_CS_TXD &amp;amp; bcm2835_peri_read(paddr)))&lt;br /&gt;
        {&lt;br /&gt;
           bcm2835_peri_write_nb(fifo, tbuf[TXCnt]);&lt;br /&gt;
           TXCnt++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* read dummy */&lt;br /&gt;
        while(RXCnt &amp;lt; tx_len)&lt;br /&gt;
        while((BCM2835_SPI0_CS_RXD &amp;amp; bcm2835_peri_read(paddr)))&lt;br /&gt;
        {&lt;br /&gt;
           rbuf[RXCnt] = bcm2835_peri_read_nb(fifo);&lt;br /&gt;
           RXCnt++;&lt;br /&gt;
        }&lt;br /&gt;
        RXCnt = 0;&lt;br /&gt;
&lt;br /&gt;
        /* Rx fifo not empty, so get the next received bytes */&lt;br /&gt;
        while((BCM2835_SPI0_CS_RXD &amp;amp; bcm2835_peri_read(paddr)))&lt;br /&gt;
        {&lt;br /&gt;
           rbuf[RXCnt] = bcm2835_peri_read_nb(fifo);&lt;br /&gt;
           RXCnt++;&lt;br /&gt;
        }&lt;br /&gt;
    /* Wait for DONE to be set */&lt;br /&gt;
    while (!(bcm2835_peri_read_nb(paddr) &amp;amp; BCM2835_SPI0_CS_DONE))&lt;br /&gt;
        ;&lt;br /&gt;
&lt;br /&gt;
    /* Set TA = 0, and also set the barrier */&lt;br /&gt;
    bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;bcm2835.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    int i, tx_len=2, rx_len=2;&lt;br /&gt;
      if (!bcm2835_init())&lt;br /&gt;
        return 1;&lt;br /&gt;
&lt;br /&gt;
    bcm2835_spi_begin();&lt;br /&gt;
    bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      // The default&lt;br /&gt;
    bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);                   // The default&lt;br /&gt;
    bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_512); // The default&lt;br /&gt;
    bcm2835_spi_chipSelect(BCM2835_SPI_CS0);                      // The default&lt;br /&gt;
    bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      // the default&lt;br /&gt;
&lt;br /&gt;
    // Send a byte to the slave and simultaneously read a byte back from the slave&lt;br /&gt;
    // If you tie MISO to MOSI, you should read back what was sent&lt;br /&gt;
    usleep(500);&lt;br /&gt;
    uint8_t tx_data[]={0x9f, 0x44};&lt;br /&gt;
    static uint8_t rx_data[10]={0};&lt;br /&gt;
    bcm2835_spi_transfernb_adv(tx_data,rx_data, tx_len, rx_len);&lt;br /&gt;
&lt;br /&gt;
    for(i=0;i&amp;lt;rx_len;i++)&lt;br /&gt;
    printf(&amp;quot;Read from SPI: 0x%.2X \n&amp;quot;, rx_data[i]);&lt;br /&gt;
&lt;br /&gt;
    bcm2835_spi_end();&lt;br /&gt;
    bcm2835_close();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Application_-_MPR121,_capacitive_touch_sensor_controller&amp;diff=734</id>
		<title>Application - MPR121, capacitive touch sensor controller</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_MPR121,_capacitive_touch_sensor_controller&amp;diff=734"/>
		<updated>2026-08-23T10:01:16Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reading twelve touch electrodes from an &#039;&#039;&#039;MPR121&#039;&#039;&#039; over I2C on an STM32F4, including the interrupt path and the library changes it needed.&lt;br /&gt;
&lt;br /&gt;
[[File:Mpr121_leds.gif|thumb|400px|STM32F4+MPR121+LEDs]]&lt;br /&gt;
&lt;br /&gt;
== Library pinouts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 	PINS PACK 1 	PINS PACK 2 	PINS PACK 3 	PINS PACK 4&lt;br /&gt;
I2Cx 	SCL 	SDA 	SCL 	SDA 	SCL 	SDA 	SCL 	SDA&lt;br /&gt;
I2C1 	PB6 	PB7 	PB8 	PB9 	PB6 	PB9 		&lt;br /&gt;
I2C2 	PB10 	PB11 	PF1 	PF0 	PH4 	PH5 		&lt;br /&gt;
I2C3 	PA8 	PC9 	PH7 	PH8 				&lt;br /&gt;
I2C4 	PD12 	PD13 	PF1 	PF0 	PF14 	PF15 	PH11 	PH12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HW connection ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
STM32F4      --  MPR121&lt;br /&gt;
VCC          --  VCC(3.3V)&lt;br /&gt;
GND          --  GND&lt;br /&gt;
IRQ          --  IRQ(selected)&lt;br /&gt;
PB7          --  SDA&lt;br /&gt;
PB8          --  SCL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== I²C Slave Address Pin Selects ==&lt;br /&gt;
* Connect to VSS, VDD, SDA, SCL to choose address 0x5A, 0x5B, 0x5C, 0x5D respectively&lt;br /&gt;
* Default was connected to VSS (0x5A)&lt;br /&gt;
&lt;br /&gt;
== Timing ==&lt;br /&gt;
*I2C reg read, 0x5D = 0x24 (Default)&lt;br /&gt;
[[File:Mpr121_read.jpg| MPR121 - Read reg]]&lt;br /&gt;
* IRQ, negative edge interrupt&lt;br /&gt;
[[File:Mpr121_irq.jpg| MPR121 - Read reg]]&lt;br /&gt;
&lt;br /&gt;
== library hacking ==&lt;br /&gt;
* The API HAL_I2C_Master_Transmit() always generate stop bit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    /* Generate Stop */&lt;br /&gt;
    //hi2c-&amp;gt;Instance-&amp;gt;CR1 |= I2C_CR1_STOP;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Control stop bit and start bit in main function&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    I2cHandle.Instance-&amp;gt;CR1 &amp;amp;= ~I2C_CR1_STOP;&lt;br /&gt;
    I2cHandle.Instance-&amp;gt;CR1 |= I2C_CR1_START;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The API HAL_I2C_Master_Receive() wait for busy flag until timeout&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#if 0&lt;br /&gt;
    /* Wait until BUSY flag is reset */&lt;br /&gt;
    if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK)&lt;br /&gt;
    {&lt;br /&gt;
      return HAL_BUSY;&lt;br /&gt;
    }&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== mpr121 read/write API ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t mpr121Read(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t data;&lt;br /&gt;
&lt;br /&gt;
   if(HAL_I2C_Master_Transmit(&amp;amp;I2cHandle,(uint16_t)I2C_ADDRESS&amp;lt;&amp;lt;1 , &amp;amp;reg, 1, 10000) != HAL_OK) {&lt;br /&gt;
	   //Todo&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   I2cHandle.Instance-&amp;gt;CR1 &amp;amp;= ~I2C_CR1_STOP;&lt;br /&gt;
   I2cHandle.Instance-&amp;gt;CR1 |= I2C_CR1_START;&lt;br /&gt;
&lt;br /&gt;
  /* Receive multiple byte */&lt;br /&gt;
  if(HAL_I2C_Master_Receive(&amp;amp;I2cHandle, (uint16_t)I2C_ADDRESS&amp;lt;&amp;lt;1, data, 1, 10000) != HAL_OK) {&lt;br /&gt;
	   //Todo&lt;br /&gt;
  }&lt;br /&gt;
  return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mpr121Write(uint8_t register_address, uint8_t data) {&lt;br /&gt;
        uint8_t d[2];&lt;br /&gt;
&lt;br /&gt;
        /* Format array to send */&lt;br /&gt;
        d[0] = register_address;&lt;br /&gt;
        d[1] = data;&lt;br /&gt;
&lt;br /&gt;
        /* Try to transmit via I2C */&lt;br /&gt;
        if (HAL_I2C_Master_Transmit(&amp;amp;I2cHandle,(uint16_t)I2C_ADDRESS&amp;lt;&amp;lt;1, (uint8_t *)d, 2, 1000) != HAL_OK) {&lt;br /&gt;
        	Error_Handler();&lt;br /&gt;
        }&lt;br /&gt;
        I2cHandle.Instance-&amp;gt;CR1 |= I2C_CR1_STOP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== mpr121 interrupt API ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
Note that, the IRQ would be triggered in both pressed and released!!&lt;br /&gt;
&lt;br /&gt;
void EXTI3_IRQHandler(void)&lt;br /&gt;
{&lt;br /&gt;
	  uint16_t touchstatus=0;&lt;br /&gt;
	  touchstatus = mpr121Read(0x01) &amp;lt;&amp;lt; 8;&lt;br /&gt;
	  touchstatus |= mpr121Read(0x00);&lt;br /&gt;
&lt;br /&gt;
	  if(touchstatus &amp;amp; 0x0001)&lt;br /&gt;
		  BSP_LED_On(LED4);&lt;br /&gt;
	  else&lt;br /&gt;
		  BSP_LED_Off(LED4);&lt;br /&gt;
&lt;br /&gt;
	  if(touchstatus &amp;amp; 0x0002)&lt;br /&gt;
		  BSP_LED_On(LED5);&lt;br /&gt;
	  else&lt;br /&gt;
		  BSP_LED_Off(LED5);&lt;br /&gt;
&lt;br /&gt;
	  if(touchstatus &amp;amp; 0x0004)&lt;br /&gt;
		  BSP_LED_On(LED6);&lt;br /&gt;
	  else&lt;br /&gt;
		  BSP_LED_Off(LED6);&lt;br /&gt;
&lt;br /&gt;
	  EXTI-&amp;gt;PR = 0x0008; //clear interrupt flag for EXTI3&lt;br /&gt;
	  GPIOE-&amp;gt;ODR |= 0x0100; //added to show the execution of IRQ function&lt;br /&gt;
	  GPIOE-&amp;gt;ODR &amp;amp;= 0x0100; //end of execution, about 300ns later&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [http://www.robot-electronics.co.uk/i2c-tutorial Using the I2C Bus]&lt;br /&gt;
* [http://stm32f4-discovery.com/2015/07/hal-library-16-i2c-for-stm32fxxx-devices/ HAL Library 16- I2C for STM32Fxxx devices]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Application_-_LPC1768,_SPI_communication&amp;diff=733</id>
		<title>Application - LPC1768, SPI communication</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_LPC1768,_SPI_communication&amp;diff=733"/>
		<updated>2026-08-23T10:01:15Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Talking to an NXP &#039;&#039;&#039;LPC1768&#039;&#039;&#039; from a Raspberry Pi over SPI using the bcm2835 library.&lt;br /&gt;
&lt;br /&gt;
[[File:PRi_SPI_LPC1768.jpg|border|350px|SPI communication between RPi and LPC1768]]&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:GPIOs.png|thumb|RPi GPIO]]&lt;br /&gt;
[[File:LPC1768_pinout.png|thumb|NXP LPC1768 pinout]]&lt;br /&gt;
[[File:spi_timing.png|thumb|SPI timing]]&lt;br /&gt;
&amp;lt;pre width=100&amp;gt;&lt;br /&gt;
RPi2               NXP LPC1768&lt;br /&gt;
MOSI(GPIO10)  --   MOSI(p5)&lt;br /&gt;
MISO(GPIO09)  --   MISO(p6)&lt;br /&gt;
SCLK(GPIO11)  --   SCLK(p7)&lt;br /&gt;
CE0(GPIO08)   --   (p8)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
* RPi using libbcm2835&lt;br /&gt;
** gcc -o spi spi.c -lbcm2835&lt;br /&gt;
** unknown why BCM2835_SPI_MODE1 is more stable??&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;bcm2835.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
      if (!bcm2835_init())&lt;br /&gt;
        return 1;&lt;br /&gt;
&lt;br /&gt;
    bcm2835_spi_begin();&lt;br /&gt;
    bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      // The default&lt;br /&gt;
    bcm2835_spi_setDataMode(BCM2835_SPI_MODE1);                   // The default&lt;br /&gt;
    bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536); // The default&lt;br /&gt;
    bcm2835_spi_chipSelect(BCM2835_SPI_CS0);                      // The default&lt;br /&gt;
    bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      // the default    &lt;br /&gt;
&lt;br /&gt;
    // Send a byte to the slave and simultaneously read a byte back from the slave&lt;br /&gt;
    // If you tie MISO to MOSI, you should read back what was sent&lt;br /&gt;
    uint8_t data = bcm2835_spi_transfer(0x12);&lt;br /&gt;
    printf(&amp;quot;Read from SPI: %02X\n&amp;quot;, data);&lt;br /&gt;
&lt;br /&gt;
    bcm2835_spi_end();&lt;br /&gt;
    bcm2835_close();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*NXP LPC1768&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;mbed.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
SPISlave device(p5, p6, p7, p8); // mosi, miso, sclk, ssel&lt;br /&gt;
&lt;br /&gt;
Serial pc(USBTX, USBRX); &lt;br /&gt;
int main() {&lt;br /&gt;
	device.reply(0x00);              // Prime SPI with first reply&lt;br /&gt;
	while(1) {&lt;br /&gt;
		if(device.receive()) {&lt;br /&gt;
			int v = device.read();   // Read byte from master&lt;br /&gt;
			device.reply(v);         // Make this the next reply&lt;br /&gt;
			pc.printf(&amp;quot;reply: %02x\n&amp;quot;, v);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [https://developer.mbed.org/questions/1331/How-to-Delay-SPI-Slave-to-Master-Respons/ How to Delay SPI Slave to Master Response?]&lt;br /&gt;
&lt;br /&gt;
* [http://www.mathworks.com/help/supportpkg/raspberrypiio/ug/use-the-spi-interface-on-the-raspberry-pi-hardware.html Use the Raspberry Pi SPI Interface to Connect to a Device]&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus wiki, Serial Peripheral Interface Bus]&lt;br /&gt;
&lt;br /&gt;
* [http://www.airspayce.com/mikem/bcm2835/group__spi.html#gad623657d9513faa89d22ae1dc87eec38 libbcm2835]&lt;br /&gt;
&lt;br /&gt;
* [http://www.petervis.com/Raspberry_PI/SPI_Seria Raspberry Pi SPI]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Application_-_Keyes_38KHz_IR_Infrared_Transmitter_Module&amp;diff=732</id>
		<title>Application - Keyes 38KHz IR Infrared Transmitter Module</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_Keyes_38KHz_IR_Infrared_Transmitter_Module&amp;diff=732"/>
		<updated>2026-08-23T10:01:15Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sending and receiving 38 kHz infrared with a &#039;&#039;&#039;Keyes IR module&#039;&#039;&#039;, using LIRC on a Raspberry Pi and the IRremote library on Arduino.&lt;br /&gt;
&lt;br /&gt;
== install lirc ==&lt;br /&gt;
 sudo apt-get install lirc liblircclient-dev&lt;br /&gt;
&lt;br /&gt;
== /etc/modules ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add following two lines:&lt;br /&gt;
&lt;br /&gt;
lirc_dev&lt;br /&gt;
lirc_rpi gpio_in_pin=18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==/etc/lirc/hardware.conf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arguments which will be used when launching lircd&lt;br /&gt;
LIRCD_ARGS=&amp;quot;--uinput&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# Don&#039;t start lircmd even if there seems to be a good config file&lt;br /&gt;
# START_LIRCMD=false&lt;br /&gt;
 &lt;br /&gt;
# Don&#039;t start irexec, even if a good config file seems to exist.&lt;br /&gt;
# START_IREXEC=false&lt;br /&gt;
 &lt;br /&gt;
# Try to load appropriate kernel modules&lt;br /&gt;
LOAD_MODULES=true&lt;br /&gt;
 &lt;br /&gt;
# Run &amp;quot;lircd --driver=help&amp;quot; for a list of supported drivers.&lt;br /&gt;
DRIVER=&amp;quot;default&amp;quot;&lt;br /&gt;
# usually /dev/lirc0 is the correct setting for systems using udev&lt;br /&gt;
DEVICE=&amp;quot;/dev/lirc0&amp;quot;&lt;br /&gt;
MODULES=&amp;quot;lirc_rpi&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# Default configuration files for your hardware if any&lt;br /&gt;
LIRCD_CONF=&amp;quot;&amp;quot;&lt;br /&gt;
LIRCMD_CONF=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keyes IR Transmitter/Receiver with Arduino ==&lt;br /&gt;
[[File:Keyes ir trans recv.jpg|thumb| Keyes, IR Transmitter/receiver package]]&lt;br /&gt;
[[File:Keyes ir receiver.jpg|thumb| Keyes, IR receiver]]&lt;br /&gt;
[[File:VS1838B.jpg|thumb| Keyes, IR receiver/VS1838B]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
型号:VS1838B&lt;br /&gt;
1．简介：&lt;br /&gt;
VS1838B 内含高速高灵敏度 PIN 光电二极管和低功耗、高增益前&lt;br /&gt;
置放大 IC,采用环氧树脂封装外加外屏蔽抗干挠设计，该产品已&lt;br /&gt;
经通过&lt;br /&gt;
REACH&lt;br /&gt;
和&lt;br /&gt;
SGS&lt;br /&gt;
认证属于环保产品，&lt;br /&gt;
在红外遥控系统中作为&lt;br /&gt;
接收器使用。&lt;br /&gt;
2.特性：&lt;br /&gt;
●环氧树脂封装外加外屏蔽抗干挠设计；&lt;br /&gt;
●宽工作电压，2.7-5.5V；&lt;br /&gt;
●低功耗；宽角度及长距离接收；&lt;br /&gt;
●抗干挠能力强，能抵挡环境干挠；&lt;br /&gt;
●输出匹配 TTL、CMOS 电平，低电平有效。&lt;br /&gt;
3．应用:&lt;br /&gt;
■视听器材(音箱,电视,DVD,卫星接收机等)；&lt;br /&gt;
■家庭电器(空调,电风扇,灯饰等)；&lt;br /&gt;
■其它红外线遥控产品。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [http://www.lirc.org/ LIRC, Linux Infrared Remote Control]&lt;br /&gt;
* [http://ozzmaker.com/2013/10/24/how-to-control-the-gpio-on-a-raspberry-pi-with-an-ir-remote/ How to Control the GPIO on a Raspberry Pi with an IR Remote]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Application_-_HC-SR04,_Ultrasonic_ranging_module&amp;diff=731</id>
		<title>Application - HC-SR04, Ultrasonic ranging module</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_HC-SR04,_Ultrasonic_ranging_module&amp;diff=731"/>
		<updated>2026-08-23T10:01:15Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Measuring distance with an &#039;&#039;&#039;HC-SR04&#039;&#039;&#039; ultrasonic module on a Raspberry Pi, using the bcm2835 GPIO library.&lt;br /&gt;
&lt;br /&gt;
[[File:IMAG1074.jpg|thumb|200px|RPi2 with ultrasonic ranging module(HC-SR04)]]&lt;br /&gt;
&lt;br /&gt;
== HW connection ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PRi2 --  HC-SR04&lt;br /&gt;
VCC  --  VCC(5V) &lt;br /&gt;
Trig --  GPIO17(output)&lt;br /&gt;
Echo --  GPIO27(input)&lt;br /&gt;
Gnd  --  Gnd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Timing ==&lt;br /&gt;
[[File:hc-sr04-timing.png|thumb|700px|HC-SR04 timing diagram]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
The Timing diagram is shown below. You only need to&lt;br /&gt;
 supply a short 10uS &lt;br /&gt;
pulse to the trigger input to start the ranging, an&lt;br /&gt;
d then the module will send out &lt;br /&gt;
an 8 cycle burst of ultrasound at 40 kHz and raise &lt;br /&gt;
its echo. The Echo is a &lt;br /&gt;
distance object that is pulse width and the range i&lt;br /&gt;
n proportion .You can &lt;br /&gt;
calculate the range through the time interval betwe&lt;br /&gt;
en sending trigger signal and &lt;br /&gt;
receiving echo signal. Formula: uS / 58 = centimete&lt;br /&gt;
rs or uS / 148 =inch; or: the &lt;br /&gt;
range = high level time * velocity (340M/S) / 2; we&lt;br /&gt;
 suggest to use over 60ms &lt;br /&gt;
measurement cycle, in order to prevent trigger sign&lt;br /&gt;
al to the echo signal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPIO control with gpio library ==&lt;br /&gt;
* Install gpio library&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.25.tar.gz&lt;br /&gt;
gunzip /bcm2835-1.25.tar.gz&lt;br /&gt;
tar xvf bcm2835-1.25.tar&lt;br /&gt;
cd bcm2835-1.25&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*For RPi2, should modify the bcm2835.h before compile&lt;br /&gt;
** #define BCM2835_PERI_BASE 0x3F000000&lt;br /&gt;
&lt;br /&gt;
*C example&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;bcm2835.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//GPIO 17&lt;br /&gt;
#define TRIG_PIN RPI_V2_GPIO_P1_11&lt;br /&gt;
&lt;br /&gt;
//GPIO 27&lt;br /&gt;
#define ECHO_PIN RPI_V2_GPIO_P1_13 &lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	uint8_t value;&lt;br /&gt;
	struct timeval t1, t2;&lt;br /&gt;
	double d1,d2;&lt;br /&gt;
	double dist=0;&lt;br /&gt;
&lt;br /&gt;
	if(!bcm2835_init())&lt;br /&gt;
	{&lt;br /&gt;
		perror(&amp;quot;Init error!&amp;quot;);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	bcm2835_gpio_fsel(TRIG_PIN, BCM2835_GPIO_FSEL_OUTP);&lt;br /&gt;
&lt;br /&gt;
	bcm2835_delayMicroseconds(3000);&lt;br /&gt;
&lt;br /&gt;
	bcm2835_gpio_write(TRIG_PIN, HIGH);&lt;br /&gt;
&lt;br /&gt;
	bcm2835_delayMicroseconds(10);&lt;br /&gt;
&lt;br /&gt;
	bcm2835_gpio_write(TRIG_PIN, LOW);&lt;br /&gt;
&lt;br /&gt;
        //wait first echo and timestamps to t1&lt;br /&gt;
	while( (value=bcm2835_gpio_lev(ECHO_PIN)) == 0)&lt;br /&gt;
		;&lt;br /&gt;
	gettimeofday(&amp;amp;t1, NULL);&lt;br /&gt;
&lt;br /&gt;
        //wait second echo and timestamps to t1&lt;br /&gt;
        while( (value=bcm2835_gpio_lev(ECHO_PIN)) == 1)&lt;br /&gt;
		;&lt;br /&gt;
        gettimeofday(&amp;amp;t2, NULL);&lt;br /&gt;
&lt;br /&gt;
	d1 = t1.tv_sec + (t1.tv_usec/1000000.0);&lt;br /&gt;
	d2 = t2.tv_sec + (t2.tv_usec/1000000.0);&lt;br /&gt;
&lt;br /&gt;
	dist = (d2-d1) * 17000 ;&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;Distance: %5.2f cm\n&amp;quot;, dist);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Compile with gpio library&lt;br /&gt;
**gcc -o sensor sensor.c -lbcm2835&lt;br /&gt;
&lt;br /&gt;
== Debugfs for GPIO ==&lt;br /&gt;
*Show gpio status&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mount -t debugfs debug /home/pi/debugfs/&lt;br /&gt;
sudo cat /home/pi/debugfs/gpio&lt;br /&gt;
----&amp;gt;&lt;br /&gt;
GPIOs 0-53, platform/3f200000.gpio, pinctrl-bcm2835:&lt;br /&gt;
 gpio-9   (sysfs               ) in  lo    &lt;br /&gt;
 gpio-10  (sysfs               ) out lo    &lt;br /&gt;
 gpio-35  (led1                ) in  hi    &lt;br /&gt;
 gpio-47  (led0                ) out lo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*For specific GPIO pin&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#set gpio 17 as trig pin&lt;br /&gt;
echo 17 &amp;gt; /sys/class/gpio/export&lt;br /&gt;
echo out &amp;gt; /sys/class/gpio/gpio17/direction&lt;br /&gt;
&lt;br /&gt;
#set gpio 27 as echo pin&lt;br /&gt;
echo 27 &amp;gt; /sys/class/gpio/export&lt;br /&gt;
echo in &amp;gt; /sys/class/gpio/gpio27/direction&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
[[File:ranging_test.jpg|Ranging testing using C]]&lt;br /&gt;
[[File:Ranging test data.png|thumb|300px|Ranging data from C]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- Test with C code -&lt;br /&gt;
#	5cm	10cm	25cm&lt;br /&gt;
1	6	8.12	24.14&lt;br /&gt;
2	6.07	8.21	23.1&lt;br /&gt;
3	6.12	8.5	23.07&lt;br /&gt;
4	6.07	8.18	23.02&lt;br /&gt;
5	5.97	8.58	24.16&lt;br /&gt;
6	7.21	8.52	22.97&lt;br /&gt;
7	6.07	8.06	23.1&lt;br /&gt;
8	6.39	8.6	22.99&lt;br /&gt;
9	6.1	8.58	23.12&lt;br /&gt;
10	6.1	8.43	23&lt;br /&gt;
			&lt;br /&gt;
Average	6.21	8.378	23.267&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:Python hc-sr04.jpg|thumb|300px|Ranging data from Python]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- Test with Python code -&lt;br /&gt;
#	5cm	10cm	25cm&lt;br /&gt;
1	6.6	10.3	24.6&lt;br /&gt;
2	6.7	10.2	24.5&lt;br /&gt;
3	6.6	10.1	24.5&lt;br /&gt;
4	6.6	10	24.6&lt;br /&gt;
5	6.6	10.1	24.5&lt;br /&gt;
6	6.7	10.1	24.6&lt;br /&gt;
7	6.6	9.7	24.6&lt;br /&gt;
8	6.6	9.6	24.6&lt;br /&gt;
9	6.6	9.6	24.6&lt;br /&gt;
10	6.6	9.7	24.6&lt;br /&gt;
&lt;br /&gt;
Average	6.62	9.94	24.57&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
[http://www.bytecreation.com/blog/2013/10/13/raspberry-pi-ultrasonic-sensor-hc-sr04 Using an Ultrasonic Sensor (HC-SR04) on a Raspberry Pi with Python]&lt;br /&gt;
&lt;br /&gt;
[http://coldnew.github.io/blog/2013/06/27_1aced.html gpio c library]&lt;br /&gt;
&lt;br /&gt;
[http://www.micropik.com/PDF/HCSR04.pdf datasheet]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Application_-_BMA250,_triaxial_acceleration_sensor&amp;diff=730</id>
		<title>Application - BMA250, triaxial acceleration sensor</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_BMA250,_triaxial_acceleration_sensor&amp;diff=730"/>
		<updated>2026-08-23T10:01:14Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Example code for reading the &#039;&#039;&#039;BMA250&#039;&#039;&#039; triaxial acceleration sensor.&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
byte range=0x03;&lt;br /&gt;
float divi=16;&lt;br /&gt;
int addr = 0x18;&lt;br /&gt;
void setup() &lt;br /&gt;
{ &lt;br /&gt;
  Serial.begin(115200); &lt;br /&gt;
  Wire.begin(); &lt;br /&gt;
  Wire.beginTransmission(addr); // address of the accelerometer &lt;br /&gt;
&lt;br /&gt;
  // Start I2C Transmission&lt;br /&gt;
  Wire.beginTransmission(addr);&lt;br /&gt;
  // Select range selection register&lt;br /&gt;
  Wire.write(0x0F);&lt;br /&gt;
  // Set range +/- 2g&lt;br /&gt;
  Wire.write(0x03);&lt;br /&gt;
  // Stop I2C Transmission&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
&lt;br /&gt;
  // Start I2C Transmission&lt;br /&gt;
  Wire.beginTransmission(addr);&lt;br /&gt;
  // Select bandwidth register&lt;br /&gt;
  Wire.write(0x10);&lt;br /&gt;
  // Set bandwidth 7.81 Hz&lt;br /&gt;
  Wire.write(0x10);&lt;br /&gt;
  // Stop I2C Transmission&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
  &lt;br /&gt;
  // low pass filter  &lt;br /&gt;
  Wire.beginTransmission(addr);&lt;br /&gt;
  Wire.write(0x20); //register address&lt;br /&gt;
  Wire.write(0x05); //can be set at&amp;quot;0x05&amp;quot;&amp;quot;0x04&amp;quot;......&amp;quot;0x01&amp;quot;&amp;quot;0x00&amp;quot;, refer to Datashhet on wiki&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void AccelerometerInit()&lt;br /&gt;
{&lt;br /&gt;
   unsigned int data[0];&lt;br /&gt;
  // Start I2C Transmission&lt;br /&gt;
  Wire.beginTransmission(addr);&lt;br /&gt;
  // Select Data Registers (0x02 − 0x07)&lt;br /&gt;
  Wire.write(0x02);&lt;br /&gt;
  // Stop I2C Transmission&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
  &lt;br /&gt;
  // Request 6 bytes &lt;br /&gt;
  Wire.requestFrom(addr, 6);&lt;br /&gt;
  // Read the six bytes &lt;br /&gt;
  // xAccl lsb, xAccl msb, yAccl lsb, yAccl msb, zAccl lsb, zAccl msb&lt;br /&gt;
&lt;br /&gt;
  while(!Wire.available())&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
  data[0] = Wire.read();&lt;br /&gt;
  data[1] = Wire.read();&lt;br /&gt;
  data[2] = Wire.read();&lt;br /&gt;
  data[3] = Wire.read();&lt;br /&gt;
  data[4] = Wire.read();&lt;br /&gt;
  data[5] = Wire.read();&lt;br /&gt;
&lt;br /&gt;
  delay(10);&lt;br /&gt;
&lt;br /&gt;
  // Convert the data to 10 bits&lt;br /&gt;
  float xAccl = ((data[1] * 256.0) + (data[0] &amp;amp; 0xC0)) / 64;&lt;br /&gt;
  if (xAccl &amp;gt; 511)&lt;br /&gt;
  {&lt;br /&gt;
    xAccl -= 1024;&lt;br /&gt;
  }&lt;br /&gt;
  float yAccl = ((data[3] * 256.0) + (data[2] &amp;amp; 0xC0)) / 64;&lt;br /&gt;
  if (yAccl &amp;gt; 511)&lt;br /&gt;
  {&lt;br /&gt;
    yAccl -= 1024;&lt;br /&gt;
  }&lt;br /&gt;
  float zAccl = ((data[5] * 256.0) + (data[4] &amp;amp; 0xC0)) / 64;&lt;br /&gt;
  if (zAccl &amp;gt; 511)&lt;br /&gt;
  {&lt;br /&gt;
    zAccl -= 1024;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
    // Output data to the serial monitor&lt;br /&gt;
  Serial.print(&amp;quot;X-Axis :&amp;quot;);&lt;br /&gt;
  Serial.print(xAccl);&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Y-Axis :&amp;quot;);&lt;br /&gt;
  Serial.print(yAccl);&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Z-Axis :&amp;quot;);&lt;br /&gt;
  Serial.println(zAccl);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
void loop() &lt;br /&gt;
{ &lt;br /&gt;
  /*&lt;br /&gt;
  switch(range)  //change the data dealing method based on the range u&#039;ve set&lt;br /&gt;
  {&lt;br /&gt;
  case 0x00:divi=16;  break;&lt;br /&gt;
  case 0x01:divi=8;  break;&lt;br /&gt;
  case 0x02:divi=4;  break;&lt;br /&gt;
  case 0x03:divi=2;  break;&lt;br /&gt;
  default: Serial.println(&amp;quot;range setting is Wrong,range:from 0to 3.Please check!&amp;quot;);while(1); &lt;br /&gt;
  }&lt;br /&gt;
  */&lt;br /&gt;
  AccelerometerInit(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=Application_-_AWS_IoT&amp;diff=729</id>
		<title>Application - AWS IoT</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Application_-_AWS_IoT&amp;diff=729"/>
		<updated>2026-08-23T10:01:14Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Setting up the &#039;&#039;&#039;AWS IoT&#039;&#039;&#039; command line and Lambda tooling, and registering things from a Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
== Setup your AWS CLI installation ==&lt;br /&gt;
** sudo apt  install awscli &lt;br /&gt;
* Go to IAM service to get the Access keys&lt;br /&gt;
** aws configure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ aws configure&lt;br /&gt;
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE&lt;br /&gt;
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY&lt;br /&gt;
Default region name [None]: us-west-2&lt;br /&gt;
Default output format [None]: json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* AWS development package - boto3&lt;br /&gt;
** pip install tornado nose &lt;br /&gt;
** pip install boto3&lt;br /&gt;
* Get AWS FreeRTOS &lt;br /&gt;
** https://github.com/aws/amazon-freertos&lt;br /&gt;
* Create IoT thing&lt;br /&gt;
** vim freertos/tools/aws_config_quick_start/configure.json&lt;br /&gt;
** cd freertos/tools/aws_config_quick_start &lt;br /&gt;
** python SetupAWS.py setup &lt;br /&gt;
* Toolchain version(5.2.0 is better)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ xtensa-esp32-elf-gcc --version&lt;br /&gt;
xtensa-esp32-elf-gcc (crosstool-NG crosstool-ng-1.22.0-80-g6c4433a) 5.2.0&lt;br /&gt;
Copyright (C) 2015 Free Software Foundation, Inc.&lt;br /&gt;
This is free software; see the source for copying conditions.  There is NO&lt;br /&gt;
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Build &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd freertos&lt;br /&gt;
mkdir build&lt;br /&gt;
cmake -DVENDOR=espressif -DBOARD=esp32_wrover_kit -DCOMPILER=xtensa-esp32 -DCMAKE_BUILD_TYPE=Debug  -S . -B build&lt;br /&gt;
cd build&lt;br /&gt;
make all -j4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== lambda ==&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that if you use Alexa-hosted skill for lambda, you may not configure the permission for AWSIoTFullAccess&amp;lt;/span&amp;gt;&lt;br /&gt;
*Function example(node.js)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var AWS = require(&#039;aws-sdk&#039;);&lt;br /&gt;
&lt;br /&gt;
var iotdata = new AWS.IotData({endpoint:&amp;quot;a1q79ntmqqqssy-ats.iot.us-west-2.amazonaws.com&amp;quot;});&lt;br /&gt;
&lt;br /&gt;
exports.handler = function(event, context, callback) {&lt;br /&gt;
&lt;br /&gt;
console.log(&amp;quot;found iotdata&amp;quot;,iotdata);&lt;br /&gt;
&lt;br /&gt;
    var params = {&lt;br /&gt;
        topic: &#039;iotdemo/topic/2&#039;,&lt;br /&gt;
        payload: &#039;on&#039;,&lt;br /&gt;
        qos: 0&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    iotdata.publish(params, function(err, data){&lt;br /&gt;
        if(err){&lt;br /&gt;
            console.log(&amp;quot;Error occured : &amp;quot;,err);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            console.log(&amp;quot;success.....&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    callback();&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Trigger&lt;br /&gt;
** Allow Alexa skill kit with ARN&lt;br /&gt;
* IAM Permission&lt;br /&gt;
** AWSIoTFullAccess &lt;br /&gt;
&lt;br /&gt;
* Reference&lt;br /&gt;
https://docs.aws.amazon.com/zh_tw/freertos/latest/userguide/getting_started_espressif.html&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Tommy</name></author>
	</entry>
	<entry>
		<id>https://tommy0804.ddns.net/index.php?title=ASTAR&amp;diff=728</id>
		<title>ASTAR</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=ASTAR&amp;diff=728"/>
		<updated>2026-08-23T10:01:13Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Consistency: syntax highlighting for code, File: prefix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ASTAR&#039;&#039;&#039; was an internal IP media player project on the RealTek RTD1073. This page is its release log, 2010-2011.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;The repository referenced below (&amp;lt;code&amp;gt;192.168.50.188&amp;lt;/code&amp;gt;) no longer exists. These notes are the surviving record of the project.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Project info==&lt;br /&gt;
Customer: internal&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;
[[File:ASTAR_REPO_20110527_03.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;webcam&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/ASTAR.old/branches/webcam&lt;br /&gt;
&#039;&#039;&#039;BT&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/ASTAR.old/branches/bt&lt;br /&gt;
&#039;&#039;&#039;radiotime&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/ASTAR/branches/radiotime&lt;br /&gt;
&#039;&#039;&#039;libopera&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/ASTAR/branches/libopera&lt;br /&gt;
&#039;&#039;&#039;android&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/ASTAR/branches/android&lt;br /&gt;
[[File:ASTAR_OS_20110527.gif]]&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;OS&#039;&#039;&#039;&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350OS/branches/ASTAR-OS&lt;br /&gt;
&lt;br /&gt;
==Release info==&lt;br /&gt;
=== ASTAR OS ===&lt;br /&gt;
==== ASTAR-OS-0.0.0.1 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350OS/tags/ASTAR-OS-0.0.0.1&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/12/01&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Enable UVCVIDEO driver&lt;br /&gt;
* porting ffmpeg &amp;amp; ffserver&lt;br /&gt;
* stopwebcam utility for kill ffmpeg &amp;amp; ffserver processes&lt;br /&gt;
* optional compile for webcam&lt;br /&gt;
==== ASTAR-OS-0.0.0.2 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350OS/tags/ASTAR-OS-0.0.0.2&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/12/08&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Add recording script&lt;br /&gt;
==== ASTAR-OS-0.0.0.3 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350OS/tags/ASTAR-OS-0.0.0.3&lt;br /&gt;
===== release date =====&lt;br /&gt;
2010/12/15&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Release with ASTAR-NTV350-0.0.0.1&lt;br /&gt;
==== ASTAR-OS-1.0.1.0 ====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/NTV350OS/tags/ASTAR-OS-1.0.1.0&lt;br /&gt;
===== release date =====&lt;br /&gt;
2011/05/27&lt;br /&gt;
===== release note =====&lt;br /&gt;
* Add USB audio modules&lt;br /&gt;
* Add VoIP.conf for ffserver[....thinking remove]&lt;br /&gt;
* Add S54VoIP&lt;br /&gt;
* Add soundcore, audio and sound modules &lt;br /&gt;
* Porting pjsip under /usr/local/VoIP/  &#039;&#039;(using mipsel-linux-gcc 3.4.4)&#039;&#039;&lt;br /&gt;
* Fix pjsip buffer issue by double the frames&lt;br /&gt;
* improve usb storage search rule(would confuse with usb camera before)&lt;br /&gt;
&lt;br /&gt;
=== ASTAR AP ===&lt;br /&gt;
==== Trunk ====&lt;br /&gt;
===== ASTAR-1.0.0.1 =====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/ASTAR/tags/ASTAR-1.0.0.1&lt;br /&gt;
====== release date ======&lt;br /&gt;
2011/05/27&lt;br /&gt;
====== release note ======&lt;br /&gt;
* Enable Opera browser&lt;br /&gt;
* Enable webcam application&lt;br /&gt;
* VoIP inside(not presented in UI!)&lt;br /&gt;
* Add thread for remote control over IP&lt;br /&gt;
* Modify logo,string,image to independent to customer&lt;br /&gt;
* Build install.img with ASTAR-OS-1.0.1.0&lt;br /&gt;
&lt;br /&gt;
==== Branch ====&lt;br /&gt;
===== ASTAR-NTV350-0.0.0.1 =====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/ASTAR/tags/ASTAR-NTV350-0.0.0.1&lt;br /&gt;
====== release date ======&lt;br /&gt;
2010/12/15&lt;br /&gt;
====== release note ======&lt;br /&gt;
* Using ASTAR-OS-0.0.0.3&lt;br /&gt;
* Add Webcam application&lt;br /&gt;
* Add RadioTime service&lt;br /&gt;
* Add Video Repeat function&lt;br /&gt;
&lt;br /&gt;
=== ASTAR AP.old ===&lt;br /&gt;
==== Trunk ====&lt;br /&gt;
===== ASTAR-AP-0.0.0.1 =====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/ASTAR.old/tags/ASTAR-AP-0.0.0.1&lt;br /&gt;
====== release date ======&lt;br /&gt;
2010/12/02&lt;br /&gt;
&lt;br /&gt;
====== release note ======&lt;br /&gt;
* Using ASTAR-OS-0.0.0.1&lt;br /&gt;
* Internet media/webcam&lt;br /&gt;
* available webcam&lt;br /&gt;
** Logitech C200 (046d:0802)&lt;br /&gt;
* unavailable webcam&lt;br /&gt;
** IPEVO P2V (1778:0204)&lt;br /&gt;
&lt;br /&gt;
==== Branch ====&lt;br /&gt;
===== ASTAR-webcam-0.0.0.1 =====&lt;br /&gt;
   svn+ssh://192.168.50.188/svnroot/ASTAR.old/tags/ASTAR-webcam-0.0.0.1&lt;br /&gt;
====== release date ======&lt;br /&gt;
2010/12/08&lt;br /&gt;
====== release note ======&lt;br /&gt;
* Using ASTAR-OS-0.0.0.2&lt;br /&gt;
* Add recording function&lt;br /&gt;
* Add RSS script functions for usb plugin check&lt;br /&gt;
* Add RSS script functions for webcam plugin check&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=%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=727</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=727"/>
		<updated>2026-08-23T09:57:19Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;七十五條軟體開發心得&#039;&#039;&#039; — 一份關於原始碼管理、缺陷追蹤、測試流程與團隊協作的檢查清單。&lt;br /&gt;
&lt;br /&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=726</id>
		<title>U-boot</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=U-boot&amp;diff=726"/>
		<updated>2026-08-23T09:57:19Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Building &#039;&#039;&#039;U-Boot&#039;&#039;&#039; for the Raspberry Pi, preparing an SD card with it, and booting a kernel from USB.&lt;br /&gt;
&lt;br /&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=Tiny6410&amp;diff=725</id>
		<title>Tiny6410</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Tiny6410&amp;diff=725"/>
		<updated>2026-08-23T09:57:19Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Tiny6410&#039;&#039;&#039; was an internal ARM11 evaluation board project on the Samsung S3C6410. This page is the release log for its camera work.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;The repository referenced below (&amp;lt;code&amp;gt;192.168.50.188&amp;lt;/code&amp;gt;) no longer exists. These notes are the surviving record of the project.&#039;&#039;&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
&#039;&#039;Not recorded. The repository this page refers to is gone, so this cannot be recovered.&#039;&#039;&lt;br /&gt;
&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=724</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=724"/>
		<updated>2026-08-23T09:57:18Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Teensy 4.0&#039;&#039;&#039; is a 600 MHz Cortex-M7 board built on the NXP i.MX RT1062. These notes cover the pinout, memory map, and building for it with Teensyduino, PlatformIO and the NXP MCUXpresso SDK.&lt;br /&gt;
&lt;br /&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;
Teensy 4.0 carries an NXP i.MX RT1062, so NXP&#039;s own tools can be used to study&lt;br /&gt;
the chip even though Teensy itself is normally programmed through Teensyduino or&lt;br /&gt;
PlatformIO. MCUXpresso IDE is NXP&#039;s free Eclipse-based IDE for i.MX RT, LPC and&lt;br /&gt;
Kinetis parts; it bundles the GNU Arm toolchain and supports the SDK examples&lt;br /&gt;
built in the NXP SDK section below.&lt;br /&gt;
&lt;br /&gt;
* Download from NXP (account required)&lt;br /&gt;
* Import an SDK as a zip, then &#039;&#039;&#039;Import SDK example&#039;&#039;&#039; to build the EVK projects&lt;br /&gt;
* Debug over the EVK&#039;s on-board CMSIS-DAP; Teensy 4.0 has no SWD header brought&lt;br /&gt;
  out, so the IDE is useful for reference builds rather than flashing a Teensy&lt;br /&gt;
&lt;br /&gt;
== MCUXpresso Config Tools ==&lt;br /&gt;
&lt;br /&gt;
A standalone GUI for generating the start-up code for an i.MX RT part. It has&lt;br /&gt;
three sub-tools:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Pins&#039;&#039;&#039; - assign peripheral signals to package pins, flags conflicts&lt;br /&gt;
* &#039;&#039;&#039;Clocks&#039;&#039;&#039; - configure the PLLs and clock tree, shows the resulting frequencies&lt;br /&gt;
* &#039;&#039;&#039;Peripherals&#039;&#039;&#039; - configure a peripheral and emit its init struct&lt;br /&gt;
&lt;br /&gt;
Output is written back into the project as pin_mux.c, clock_config.c and&lt;br /&gt;
peripherals.c. It can run standalone or from inside MCUXpresso IDE.&lt;br /&gt;
&lt;br /&gt;
== MCUXpresso SDK ==&lt;br /&gt;
&lt;br /&gt;
The per-board driver and example package. Build one for a given board with the&lt;br /&gt;
SDK Builder at https://mcuxpresso.nxp.com and choose the toolchain when&lt;br /&gt;
generating it - the armgcc variant is what the NXP SDK section below builds.&lt;br /&gt;
&lt;br /&gt;
Contents:&lt;br /&gt;
* &#039;&#039;&#039;devices/&#039;&#039;&#039; - CMSIS headers, start-up code and peripheral drivers (fsl_*.c)&lt;br /&gt;
* &#039;&#039;&#039;boards/&#039;&#039;&#039; - board-specific examples, one directory per example&lt;br /&gt;
* &#039;&#039;&#039;middleware/&#039;&#039;&#039; - optional stacks such as USB, FatFs and lwIP&lt;br /&gt;
&lt;br /&gt;
For Teensy 4.0 the relevant board is EVK-MIMXRT1060, whose MIMXRT1062 is the same&lt;br /&gt;
part as the one on the Teensy.&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;
  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;
== Related projects ==&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=723</id>
		<title>TI, CC3220SF</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=TI,_CC3220SF&amp;diff=723"/>
		<updated>2026-08-23T09:57:18Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The TI &#039;&#039;&#039;CC3220SF&#039;&#039;&#039; is a Wi-Fi MCU. These notes cover installing the SimpleLink SDK, building the FreeRTOS example, and programming the board.&lt;br /&gt;
&lt;br /&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=722</id>
		<title>Software version</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Software_version&amp;diff=722"/>
		<updated>2026-08-23T09:57:17Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Software versioning&#039;&#039;&#039; is the process of assigning identifiers to distinct releases of a piece of software. This article surveys the schemes in use.&lt;br /&gt;
&lt;br /&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=Seeed_%2B_Hackaday,_Tiny_BLE&amp;diff=721</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=721"/>
		<updated>2026-08-23T09:57:17Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Tiny BLE&#039;&#039;&#039; is a Seeed nRF51822 board. These notes cover its source and measured LED power consumption.&lt;br /&gt;
&lt;br /&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=720</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=720"/>
		<updated>2026-08-23T09:57:16Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;STM32F4 Discovery&#039;&#039;&#039; is an ST Cortex-M4 board. These notes cover the GNU/ARM toolchain, building and flashing with ST-Link, and debugging with GDB.&lt;br /&gt;
&lt;br /&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;
== Related projects ==&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=719</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=719"/>
		<updated>2026-08-23T09:57:16Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Talking to an &#039;&#039;&#039;OVM7251&#039;&#039;&#039; camera over SCCB, Omnivision&#039;s I2C-like bus, on an Arducam module.&lt;br /&gt;
&lt;br /&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=718</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=718"/>
		<updated>2026-08-23T09:57:16Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;RoboPeak Mini USB Display&#039;&#039;&#039; is a small USB-attached framebuffer screen. These notes cover building its Linux kernel driver, natively and cross-compiled, and getting X11 output onto it.&lt;br /&gt;
&lt;br /&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=717</id>
		<title>Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=Raspberry_Pi&amp;diff=717"/>
		<updated>2026-08-23T09:57:15Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Raspberry Pi&#039;&#039;&#039; is the single-board computer most of the projects on this wiki are built around. This page collects its GPIO pinout.&lt;br /&gt;
&lt;br /&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=RTD1073&amp;diff=716</id>
		<title>RTD1073</title>
		<link rel="alternate" type="text/html" href="https://tommy0804.ddns.net/index.php?title=RTD1073&amp;diff=716"/>
		<updated>2026-08-23T09:57:15Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;RTD1073&#039;&#039;&#039; was a RealTek-based IP media player built for NetGear. This page is the release log for its diagnostic and RadioTime firmware, 2010-2011.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;The repository referenced below (&amp;lt;code&amp;gt;192.168.50.188&amp;lt;/code&amp;gt;) no longer exists. These notes are the surviving record of the project.&#039;&#039;&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
&#039;&#039;Not recorded. The repository this page refers to is gone, so this cannot be recovered.&#039;&#039;&lt;br /&gt;
&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=715</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=715"/>
		<updated>2026-08-23T09:57:14Z</updated>

		<summary type="html">&lt;p&gt;Tommy：​Add a lead sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Building Android for the Qualcomm &#039;&#039;&#039;HDK8250&#039;&#039;&#039; (SM8250) - the HLOS images, the non-HLOS images, and programming them to the board.&lt;br /&gt;
&lt;br /&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>
</feed>