本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
~~NOCACHE~~ ~~NOTOC~~ <html><style> .dokuwiki h1,.sml-c-wrap h1{font-family:"Microsoft YaHei","PingFang SC","Hiragino Sans GB","Helvetica Neue",Arial,sans-serif!important;font-size:22px!important;font-weight:600!important;line-height:1.35!important;letter-spacing:.2px!important;color:#1f2a37!important;font-variant-numeric:lining-nums tabular-nums;font-feature-settings:"lnum" 1,"tnum" 1;border-bottom:1px solid #a2a9b1;padding:0 0 .2em 0!important;margin:0 0 .2em 0!important;} .dokuwiki h2{font-family:Georgia,"Times New Roman","Songti SC",SimSun,serif;font-weight:400;font-size:1.5em;line-height:1.3;border-bottom:1px solid #a2a9b1;padding-bottom:.15em;margin:1.6em 0 .55em;} .dokuwiki h3{font-size:1.02em;font-weight:700;margin:1.3em 0 .35em;} .dokuwiki h4{font-size:.98em;font-weight:700;margin:1.1em 0 .35em;} .dokuwiki .level2{margin-top:0;} #smltoc{border:1px solid #a2a9b1;background:#f9f9f9;padding:11px 17px 13px;display:table;max-width:100%;font-size:14px;line-height:1.6;margin:0 0 1.6em;} #smltoc .hd{text-align:center;font-size:14px;font-weight:700;margin:0 0 9px;padding-bottom:8px;border-bottom:1px solid #d5dce4;color:#1f2a37;letter-spacing:1px;} #smltoc .hd a{font-weight:400;color:#0645ad;cursor:pointer;text-decoration:none;} #smltoc ul.toclist{list-style:none;margin:0;padding:0;} #smltoc ul.toclist li{margin:0;padding:0;list-style:none;background:none;font-size:14px;} #smltoc ul.toclist li.l2{padding-left:1.5em;} #smltoc ul.toclist li.l3{padding-left:2.9em;} #smltoc ul.toclist a{color:#0645ad;text-decoration:none;} #smltoc ul.toclist a:hover{text-decoration:underline;} .dokuwiki pre.code{border:1px solid #c8ccd1;background:#f8f9fa;padding:8px 12px;line-height:1.6;font-size:.88em;border-radius:0;} .dokuwiki pre.code code{font-size:1em;} .dokuwiki code{background:#f8f9fa;border:1px solid #eaecf0;padding:0 2px;} /* 附件下载链接:加重显示,与正文区分 */ #bodyContent a.mediafile.mf_zip{font-weight:600;color:#0b5394!important;text-decoration:none;border-bottom:1px solid #c9dcef;} #bodyContent a.mediafile.mf_zip:hover{color:#0645ad!important;border-bottom-color:#0645ad;background:#f2f7fc;} /* 网盘提取码徽标 */ .sml-code{display:inline-block;background:#eef4fb;border:1px solid #cfe0f2;color:#0b5394;font-weight:700;font-size:.92em;letter-spacing:.4px;padding:1px 8px;border-radius:3px;line-height:1.55;} /* 网盘等外部下载链接:与附件下载链接同款 */ #bodyContent a.urlextern{font-weight:600;color:#0b5394!important;text-decoration:none!important;border-bottom:1px solid #c9dcef;background:none!important;padding-right:0!important;} #bodyContent a.urlextern:hover{color:#0645ad!important;border-bottom-color:#0645ad;background:#f2f7fc!important;} .dokuwiki pre.code{border:1px solid #c8ccd1 !important;background:#f8f9fa !important;} .dokuwiki .media img{border:1px solid #c8ccd1;background:#fff;max-width:100%;height:auto;} .dokuwiki table.inline th{background:#eaecf0;font-weight:700;} .catlinks{display:none !important;} #bodyContent{padding-bottom:68vh;} #p-logo a{background-image:url(/dokuwiki/lib/exe/fetch.php?media=wiki:logo_sml.png)!important;background-size:132px auto!important;background-position:center center!important;background-repeat:no-repeat!important;} /* GPIO 端子脚位方向:醒目提示 */ .sml-gpio{margin:14px 0 18px;padding:11px 15px 12px;border:1px solid #e3b45a;border-left:5px solid #d98b0b;background:#fff9ec;border-radius:3px;line-height:1.65;color:#4a3a1c;} .sml-gpio .gt{font-weight:700;color:#9a5b00;font-size:15px;margin-bottom:5px;} .sml-gpio .gline{display:flex;flex-wrap:wrap;gap:10px;margin:9px 0 8px;} .sml-gpio .gcard{flex:1 1 300px;background:#fff;border:1px solid #ead9b4;border-radius:3px;padding:8px 11px;} .sml-gpio .gcard b{display:block;letter-spacing:.3px;} .sml-gpio .gcard span{display:block;margin-top:3px;font-weight:700;} .sml-gpio .gpo{border-left:4px solid #c0392b;} .sml-gpio .gpo span{color:#c0392b;} .sml-gpio .gpi{border-left:4px solid #1e7a4c;} .sml-gpio .gpi span{color:#1e7a4c;} .sml-gpio .gf{font-size:12.6px;color:#775c27;margin:0;} /* ===== 产品图库:目录右侧展示区 ===== */ .sml-top{display:flex;gap:18px;align-items:flex-start;margin:0 0 1.6em;} .sml-left{flex:0 0 264px;min-width:0;} .sml-left #smltoc{margin:0;width:100%;box-sizing:border-box;} .sml-gallery{position:sticky;top:14px;flex:1 1 auto;min-width:0;border:1px solid #d7e0ea;border-radius:6px;background:linear-gradient(155deg,#fcfdff 0%,#f0f4f9 100%);box-shadow:0 8px 26px rgba(31,42,55,.07);overflow:hidden;font-family:"Microsoft YaHei","PingFang SC","Hiragino Sans GB","Helvetica Neue",Arial,sans-serif;font-variant-numeric:lining-nums tabular-nums;font-feature-settings:"lnum" 1,"tnum" 1;} .sml-g-head{display:flex;justify-content:space-between;align-items:flex-end;gap:12px;padding:9px 16px 8px;border-bottom:1px solid #e2e9f1;} .sml-g-kicker{font-size:9.5px;letter-spacing:1.8px;color:#0b5394;font-weight:700;line-height:1.4;} .sml-g-title{font-size:15px;font-weight:600;color:#1f2a37;line-height:1.4;margin-top:2px;letter-spacing:.2px;} .sml-g-note{font-size:10.5px;color:#7b8794;white-space:nowrap;padding-bottom:2px;} .sml-g-body{display:flex;gap:12px;padding:10px 15px 10px;align-items:stretch;} .sml-g-stage{position:relative;flex:1 1 auto;min-width:0;height:292px;background:#fff;border:1px solid #e6ebf1;border-radius:4px;overflow:hidden;} .sml-g-stage img.sml-g-main{display:block;width:100%!important;height:100%!important;max-width:none!important;object-fit:contain;mix-blend-mode:multiply;transition:opacity .16s ease;} .sml-g-badge{position:absolute;left:0;top:11px;z-index:2;background:#0b5394;color:#fff;font-size:9.5px;font-weight:600;letter-spacing:1.2px;padding:4px 10px 4px 12px;border-radius:0 2px 2px 0;box-shadow:0 2px 6px rgba(11,83,148,.2);} .sml-g-zoom{position:absolute;right:10px;top:10px;z-index:2;font-size:10px;line-height:1.4;color:#0b5394!important;text-decoration:none!important;border:1px solid #c9dcef;background:rgba(255,255,255,.92)!important;padding:3px 8px;border-radius:3px;} .sml-g-zoom:hover{background:#0b5394!important;color:#fff!important;border-color:#0b5394;} .sml-g-cap{position:absolute;left:12px;bottom:9px;z-index:2;font-size:11px;color:#4a5765;letter-spacing:.2px;background:rgba(255,255,255,.88);padding:3px 8px;border-radius:2px;} .sml-g-count{position:absolute;right:12px;bottom:10px;z-index:2;font-size:10px;color:#8a97a5;letter-spacing:1px;} .sml-g-side{flex:0 0 150px;min-width:0;display:flex;flex-direction:column;gap:5px;} .sml-g-side-hd{font-size:9.5px;letter-spacing:1.2px;color:#7b8794;font-weight:700;line-height:1.5;padding:0 1px 1px;} button.sml-g-thumb{flex:1 1 0;min-height:0;display:flex;align-items:center;gap:8px;box-sizing:border-box;margin:0;padding:4px 6px;background:#fff;border:1px solid #dbe3ec;border-radius:3px;cursor:pointer;text-align:left;font-family:inherit;line-height:1.35;transition:border-color .15s,box-shadow .15s,transform .15s;} button.sml-g-thumb:hover{border-color:#8fb2d6;transform:translateX(1px);} button.sml-g-thumb.on{border-color:#0b5394;box-shadow:inset 0 0 0 1px #0b5394;background:#f7fbff;} .sml-g-tn{display:block;flex:0 0 58px;width:58px;height:42px;background:#fbfcfe;border:1px solid #edf1f5;border-radius:2px;overflow:hidden;} .sml-g-tn img{display:block;width:100%!important;height:100%!important;max-width:none!important;object-fit:contain;mix-blend-mode:multiply;} .sml-g-tx{font-size:11px;color:#4a5765;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .sml-g-tx b{display:block;font-size:9px;color:#98a5b3;letter-spacing:1px;font-weight:600;margin-bottom:1px;} button.sml-g-thumb.on .sml-g-tx{color:#0b5394;font-weight:600;} button.sml-g-thumb.on .sml-g-tx b{color:#0b5394;} .sml-g-specs{display:flex;flex-wrap:wrap;border-top:1px solid #e2e9f1;background:rgba(255,255,255,.62);} .sml-g-spec{flex:1 1 130px;min-width:0;padding:7px 12px 8px;border-right:1px solid #e2e9f1;box-sizing:border-box;} .sml-g-spec:last-child{border-right:0;} .sml-g-spec b{display:block;font-size:11.5px;color:#0b5394;font-weight:700;line-height:1.5;letter-spacing:.2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .sml-g-spec em{display:block;font-style:normal;font-size:10px;color:#6b7785;line-height:1.5;margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} .sml-g-apps{display:flex;align-items:center;gap:8px;padding:6px 14px 8px;border-top:1px solid #e2e9f1;font-size:10.5px;color:#5a6674;flex-wrap:wrap;} .sml-g-apps .t{font-weight:700;color:#1f2a37;letter-spacing:.5px;margin-right:2px;} .sml-g-apps .chip{border:1px solid #d7e0ea;background:#fff;border-radius:2px;padding:2px 8px;color:#4a5765;} @media (max-width:1200px){.sml-left{flex-basis:220px;}} @media (max-width:1100px){.sml-top{flex-direction:column;}.sml-left{flex:1 1 auto;width:100%;}.sml-gallery{order:-1;position:static;width:100%;box-sizing:border-box;}.sml-g-note{display:none;}} @media (max-width:900px){.sml-g-body{flex-direction:column;}.sml-g-stage{height:220px;}.sml-g-side{flex:1 1 auto;flex-direction:row;flex-wrap:nowrap;}button.sml-g-thumb{flex:1 1 0;min-width:0;flex-direction:column;text-align:center;gap:3px;padding:5px 3px 6px;}.sml-g-tn{flex:none;width:100%;height:36px;}.sml-g-tx{font-size:10px;text-align:center;}.sml-g-tx b{display:none;}.sml-g-side-hd{display:none;}.sml-g-spec{flex:1 1 50%;}} @media (max-width:520px){.sml-g-stage{height:180px;}.sml-g-cap{font-size:10px;}.sml-g-zoom{font-size:10px;}} /* ===== 正文:企业级文档排版规范(单主色 / 统一字体 / 固定层级) ===== */ #bodyContent{font-family:"Microsoft YaHei","PingFang SC","Hiragino Sans GB","Helvetica Neue",Arial,sans-serif;font-size:14px;line-height:1.75;color:#1f2a37;} #bodyContent p{margin:0 0 1em;max-width:1040px;} #bodyContent a{color:#0b5394;} #bodyContent a:hover{color:#083f70;} /* 章标题:以字号/字重/留白建立力度,主色仅作竖线与短线,不用色块 */ #bodyContent h2{position:relative;font-family:inherit!important;font-size:25px!important;font-weight:700!important;line-height:1.35!important;color:#152234!important;letter-spacing:.3px;background:none!important;border:0!important;border-bottom:1px solid #dfe5ec!important;border-radius:0;padding:0 0 15px 19px!important;margin:3em 0 1.55em!important;} #bodyContent h2::before{content:"";position:absolute;left:0;top:4px;bottom:19px;width:4px;background:#0b5394;border-radius:1px;} #bodyContent h2::after{content:"";position:absolute;left:0;bottom:-1px;width:60px;height:2px;background:#0b5394;} #bodyContent h3{font-family:inherit!important;font-size:16.5px!important;font-weight:700!important;line-height:1.5!important;color:#152234!important;border:0!important;border-left:3px solid #7fa3c6!important;border-radius:0;padding:2px 0 2px 12px!important;margin:2.1em 0 .85em!important;} #bodyContent h4{font-family:inherit!important;font-size:14.5px!important;font-weight:700!important;line-height:1.5!important;color:#33475d!important;border:0!important;padding:0!important;margin:1.7em 0 .55em!important;} /* 表格:浅灰表头 + 一条主色底线 + 纯横线网格(去掉深蓝实心表头与竖线) */ #bodyContent table.inline{border-collapse:collapse;width:auto;max-width:100%;margin:1.25em 0 1.9em;font-size:13.5px;line-height:1.7;border:1px solid #e1e7ee;} #bodyContent table.inline th{background:#f2f5f9!important;color:#1f2a37!important;font-weight:700!important;font-size:12.5px;letter-spacing:.6px;padding:10px 16px!important;border:0!important;border-bottom:2px solid #0b5394!important;text-align:left;white-space:nowrap;} #bodyContent table.inline td{padding:9px 16px!important;border:0!important;border-bottom:1px solid #e9edf2!important;color:#243447;vertical-align:middle;} #bodyContent table.inline tr:last-child td{border-bottom:0!important;} #bodyContent table.inline tr:nth-child(even) td{background:#fafbfd;} #bodyContent table.inline tr:hover td{background:#f1f6fb;} #bodyContent table.inline td:first-child{font-weight:600;color:#152234;} /* 代码块:整体压低对比,只留细线与灰色语言标签 */ #bodyContent pre.code,#bodyContent pre.file{position:relative;background:#f9fafc!important;border:1px solid #e2e8ef!important;border-left:2px solid #a9bfd5!important;border-radius:3px;padding:28px 14px 12px!important;margin:.9em 0 1.3em;font:12.5px/1.65 "Cascadia Mono",Consolas,"SFMono-Regular",Menlo,monospace!important;color:#243447;overflow-x:auto;white-space:pre;} #bodyContent pre.code::before,#bodyContent pre.file::before{content:"CODE";position:absolute;left:0;right:0;top:0;height:22px;box-sizing:border-box;background:transparent;border-bottom:1px solid #e9edf2;padding:0 14px;font:600 10px/21px "Microsoft YaHei",Arial,sans-serif!important;letter-spacing:1.2px;color:#8794a4;} #bodyContent pre.code.bash::before{content:"SHELL / BASH";} #bodyContent pre.code.java::before{content:"JAVA";} #bodyContent pre.code code,#bodyContent pre.file code{background:none!important;border:0!important;padding:0!important;color:inherit!important;font-size:1em!important;} /* 行内代码 */ #bodyContent code{background:#eef2f7;border:1px solid #dfe6ee;border-radius:3px;padding:1px 5px;color:#0b5394;font-family:Consolas,Monaco,monospace;font-size:.9em;} /* 有序 / 无序列表:主色数字块与方点 */ #bodyContent ol{counter-reset:smlstep;list-style:none!important;padding-left:0!important;margin:.9em 0 1.3em;} #bodyContent ol li{counter-increment:smlstep;position:relative;padding-left:32px;margin:.45em 0;line-height:1.7;} #bodyContent ol li::before{content:counter(smlstep);position:absolute;left:0;top:2px;width:21px;height:21px;box-sizing:border-box;background:#eef4fb;border:1px solid #cfe0f2;border-radius:3px;color:#0b5394;font:600 11px/19px "Microsoft YaHei",Arial,sans-serif;text-align:center;} #bodyContent ul:not(.toclist){list-style:none!important;padding-left:0!important;margin:.9em 0 1.3em;} #bodyContent ul:not(.toclist) li{position:relative;padding-left:19px;margin:.4em 0;line-height:1.7;} #bodyContent ul:not(.toclist) li::before{content:"";position:absolute;left:3px;top:.68em;width:6px;height:6px;background:#0b5394;border-radius:1px;} /* 正文图片 */ #bodyContent .media img{border:1px solid #dfe6ee;border-radius:4px;background:#fff;padding:4px;box-shadow:0 2px 12px rgba(31,42,55,.07);max-width:100%;height:auto;box-sizing:border-box;} /* 附件下载:统一按钮 */ #bodyContent a.mediafile.mf_zip{display:inline-block!important;background:#eef4fb!important;border:1px solid #cfe0f2!important;border-left:3px solid #0b5394!important;border-radius:3px;padding:5px 12px!important;margin:.3em 0;line-height:1.5;font-weight:600!important;color:#0b5394!important;text-decoration:none!important;} #bodyContent a.mediafile.mf_zip::before{content:"\2193";margin-right:8px;font-weight:700;} #bodyContent a.mediafile.mf_zip:hover{background:#0b5394!important;color:#fff!important;border-color:#0b5394!important;} /* 提示 / 注意:统一的 NOTE 块,弱化为中性灰底,避免蓝色块重复堆叠 */ #bodyContent p.sml-note{background:#f8fafc;border:1px solid #e4eaf1;border-left:3px solid #a9bfd5;border-radius:3px;padding:8px 14px!important;margin:.9em 0 1.3em!important;color:#3b4a5c;font-size:13px;line-height:1.7;} /* ===== 产品规格数据:高规格输出(仅第 1 / 2 章,由 enhanceSpec 打标) ===== */ #bodyContent .sml-spec{max-width:1040px;box-sizing:border-box;margin:1.35em 0 2em;} #bodyContent .sml-spec table.inline{width:100%;border:0!important;font-size:13.5px;line-height:1.65;} #bodyContent .sml-spec.sml-wide table.inline{min-width:760px;} #bodyContent .sml-spec table.inline th{background:#fff!important;color:#5d6c7e!important;font-size:11px!important;letter-spacing:1.2px;font-weight:700!important;padding:9px 18px!important;border:0!important;border-bottom:1px solid #cfd9e4!important;border-top:1px solid #e1e7ee!important;text-align:left;} #bodyContent .sml-spec table.inline td{padding:9px 18px!important;border:0!important;border-bottom:1px solid #edf1f5!important;color:#243447;font-size:13.5px;font-variant-numeric:lining-nums tabular-nums;} #bodyContent .sml-spec table.inline th:first-child,#bodyContent .sml-spec table.inline td:first-child{width:22%;background:#f7f9fc!important;color:#152234!important;font-weight:700;} #bodyContent .sml-spec table.inline tr:nth-child(even) td{background:#fff!important;} #bodyContent .sml-spec table.inline tr:nth-child(even) td:first-child{background:#f7f9fc!important;} #bodyContent .sml-spec table.inline tr:hover td{background:#f4f8fd!important;} #bodyContent .sml-spec table.inline tr:hover td:first-child{background:#eef4fb!important;} #bodyContent .sml-spec table.inline tr:last-child td{border-bottom:1px solid #e1e7ee!important;} /* 主规格表:带表头元信息条的规格卡 */ #bodyContent .sml-spec.sml-featured{background:#fff;border:1px solid #e1e7ee;border-top:0;border-radius:0 0 4px 4px;padding:0 0 4px;box-shadow:0 2px 10px rgba(31,42,55,.035);} #bodyContent .sml-spec.sml-featured .sml-spec-hd{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 18px;border-top:2px solid #0b5394;background:#fbfcfe;border-bottom:1px solid #e6ebf1;} #bodyContent .sml-spec-kick{font:700 10px/1.4 "Microsoft YaHei",Arial,sans-serif;letter-spacing:1.8px;color:#0b5394;} #bodyContent .sml-spec-meta{font:600 10px/1.4 "Microsoft YaHei",Arial,sans-serif;letter-spacing:1px;color:#8794a4;white-space:nowrap;} #bodyContent .sml-spec.sml-featured table.inline th{border-top:0!important;} /* 2.1 整机外观:双列图版 */ #bodyContent .sml-spec.sml-figgrid table.inline{width:100%;table-layout:fixed;border:0!important;} #bodyContent .sml-spec.sml-figgrid table.inline tr th,#bodyContent .sml-spec.sml-figgrid table.inline tr th:first-child{width:50%;background:#fff!important;border:0!important;border-bottom:1px solid #e1e7ee!important;text-align:center!important;font-size:11px;letter-spacing:1px;color:#5d6c7e;font-weight:700;padding:9px 12px!important;} #bodyContent .sml-spec.sml-figgrid table.inline tr td,#bodyContent .sml-spec.sml-figgrid table.inline tr td:first-child{width:50%;background:#fff!important;border:0!important;border-bottom:1px solid #eef1f5!important;padding:13px 14px 14px!important;text-align:center;color:#6b7a8c;font-size:12px;line-height:1.6;font-weight:400;} #bodyContent .sml-spec.sml-figgrid td a.media{display:block;width:100%;text-align:center;} #bodyContent .sml-spec.sml-figgrid img.media{display:block;width:84%!important;max-width:84%!important;height:auto!important;margin:0 auto 8px;border:1px solid #e6ebf1!important;border-radius:4px;padding:0!important;box-shadow:0 2px 10px rgba(31,42,55,.055);background:#fff;mix-blend-mode:multiply;} #bodyContent .sml-spec.sml-figgrid tr:last-child td{border-bottom:0!important;} /* 2.2 接口示意 / 机械尺寸:独立图版 */ #bodyContent p.sml-figure{max-width:960px;box-sizing:border-box;text-align:center;background:#fff;border:1px solid #e6ebf1;border-radius:4px;padding:12px 16px;margin:1.2em 0 1.6em!important;box-shadow:0 2px 10px rgba(31,42,55,.035);} #bodyContent p.sml-figure img.media{width:auto;max-width:520px;height:auto;border:0!important;padding:0!important;box-shadow:none!important;background:#fff;} /* 大图版(?760):机械尺寸等技术图需要放大到能读清尺寸数字,窄屏仍不溢出 */ #bodyContent p.sml-figure img.media[width="760"]{max-width:min(760px,100%);} /* 2.2 接口概览:并入 2.1 同款双列图版,接口图为可点击放大的技术图 */ #bodyContent .sml-spec.sml-figgrid td a.media{cursor:zoom-in;} #bodyContent .sml-spec.sml-figgrid td a.media img.media{mix-blend-mode:normal;} /* 次级产品数据:整机规格 / 型号与配置两张主表(.sml-keep)保持原状,其余统一收一档 */ #bodyContent .sml-spec:not(.sml-keep){max-width:960px;margin:1.2em 0 1.7em;} #bodyContent .sml-spec:not(.sml-keep) table.inline{font-size:13px;line-height:1.55;} #bodyContent .sml-spec:not(.sml-keep) table.inline th{font-size:10.5px!important;padding:8px 16px!important;} #bodyContent .sml-spec:not(.sml-keep) table.inline td{padding:7px 16px!important;font-size:13px;} #bodyContent .sml-spec:not(.sml-keep) table.inline th:first-child,#bodyContent .sml-spec:not(.sml-keep) table.inline td:first-child{width:20%;} #bodyContent .sml-spec:not(.sml-keep).sml-featured .sml-spec-hd{padding:8px 16px;} #bodyContent .sml-spec:not(.sml-keep).sml-figgrid table.inline tr th,#bodyContent .sml-spec:not(.sml-keep).sml-figgrid table.inline tr th:first-child{padding:8px 10px!important;} #bodyContent .sml-spec:not(.sml-keep).sml-figgrid table.inline tr td,#bodyContent .sml-spec:not(.sml-keep).sml-figgrid table.inline tr td:first-child{padding:10px 12px 11px!important;} #bodyContent .sml-spec:not(.sml-keep).sml-figgrid img.media{width:70%!important;max-width:70%!important;} /* 宽表格独立横向滚动,避免窄屏整页横向溢出 */ .sml-tw{max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:1.2em 0 1.8em;} #bodyContent .sml-tw table.inline{margin:0;max-width:none;} @media (max-width:1100px){ #bodyContent p{max-width:none;} #bodyContent table.inline th{white-space:normal;padding:7px 10px!important;} #bodyContent table.inline td{padding:7px 10px!important;} #bodyContent .sml-spec,#bodyContent .sml-spec:not(.sml-keep){max-width:100%;} #bodyContent .sml-spec table.inline th,#bodyContent .sml-spec table.inline td{padding:8px 12px!important;} #bodyContent .sml-spec.sml-featured .sml-spec-hd{padding:10px 12px;} #bodyContent .sml-spec.sml-figgrid table.inline tr td,#bodyContent .sml-spec.sml-figgrid table.inline tr td:first-child{padding:10px 8px 12px!important;} #bodyContent .sml-spec:not(.sml-keep).sml-figgrid table.inline tr td,#bodyContent .sml-spec:not(.sml-keep).sml-figgrid table.inline tr td:first-child{padding:9px 8px 11px!important;} #bodyContent p.sml-figure{max-width:100%;padding:12px 10px;} #bodyContent p.sml-figure img.media{max-width:100%;} } @media (max-width:760px){ #bodyContent .sml-spec:not(.sml-keep).sml-figgrid img.media{width:100%!important;max-width:100%!important;} } /* ===== 第 3 章起 · 文档区:统一版心 + 发布级命令行引用块 ===== */ /* 统一阅读版心:正文 / 列表 / 表格 / 提示 / 图版共用一条右边界 */ #bodyContent .sml-doc p, #bodyContent .sml-doc ol, #bodyContent .sml-doc ul:not(.toclist){max-width:min(100%,780px);} #bodyContent .sml-doc p{margin:0 0 .85em;} #bodyContent .sml-doc .sml-tw{max-width:min(100%,820px);margin:1.05em 0 1.5em;} #bodyContent .sml-doc table.inline{margin:0;} #bodyContent .sml-doc table.inline th{background:#f4f7fb!important;font-size:12px!important;letter-spacing:.4px;padding:8px 14px!important;} #bodyContent .sml-doc table.inline td{padding:7px 14px!important;font-size:13px;} /* 代码块:官网发布级「命令行引用」—— 单色、无标签条、无边框圆角、三档对齐 */ #bodyContent .sml-doc pre.code, #bodyContent .sml-doc pre.file{ display:block!important; width:fit-content!important; min-width:min(100%,480px)!important; max-width:min(100%,860px)!important; box-sizing:border-box!important; margin:1.05em 0 1.5em!important; padding:14px 20px 14px 18px!important; background:#f7f9fb!important; border:0!important; border-left:2px solid #7fa3c6!important; border-radius:0!important; box-shadow:none!important; font:13px/1.8 "Cascadia Mono",Consolas,"SFMono-Regular",Menlo,monospace,"Microsoft YaHei",sans-serif!important; color:#243447!important; overflow-x:auto!important; } /* 去掉语言标签条,只保留命令本身 */ #bodyContent .sml-doc pre.code::before, #bodyContent .sml-doc pre.file::before{content:none!important;display:none!important;} /* 语法高亮压成单色:注释淡灰且不倾斜,其余全部墨色 */ #bodyContent .sml-doc pre.code span[class], #bodyContent .sml-doc pre.file span[class]{color:inherit!important;font-style:normal!important;font-weight:inherit!important;background:none!important;text-decoration:none!important;} #bodyContent .sml-doc pre.code span[class^="co"], #bodyContent .sml-doc pre.file span[class^="co"]{color:#8a97a5!important;} #bodyContent .sml-doc pre.code code, #bodyContent .sml-doc pre.file code{font-size:1em!important;background:none!important;border:0!important;color:inherit!important;} /* 按内容宽度归档,右边界只有三条对齐线 */ #bodyContent .sml-doc pre.code.sml-cw1, #bodyContent .sml-doc pre.file.sml-cw1{width:480px!important;} #bodyContent .sml-doc pre.code.sml-cw2, #bodyContent .sml-doc pre.file.sml-cw2{width:640px!important;} #bodyContent .sml-doc pre.code.sml-cw3, #bodyContent .sml-doc pre.file.sml-cw3{width:860px!important;} /* 提示块:同样收进版心,弱化底色与边框 */ #bodyContent .sml-doc p.sml-note{ width:fit-content; min-width:min(100%,320px); max-width:min(100%,780px); box-sizing:border-box; margin:.9em 0 1.35em!important; padding:8px 16px!important; background:#f7f9fb!important; border:0!important; border-left:2px solid #7fa3c6!important; border-radius:0!important; font-size:13px;line-height:1.7;color:#4a5765; } /* 截图类图片:细线边界,无阴影 */ #bodyContent .sml-doc p > a.media > img.media{ max-width:min(100%,780px); border:1px solid #e6ebf1!important; border-radius:3px!important; box-shadow:none!important; } /* 章标题横线也收进同一版心,右边界与正文对齐 */ #bodyContent h2.sml-doc{max-width:min(100%,780px);box-sizing:border-box;} /* 小节留白收紧,标题层级更利落 */ #bodyContent h3.sml-doc{margin:1.8em 0 .7em!important;} #bodyContent h4.sml-doc{margin:1.35em 0 .5em!important;} @media (max-width:760px){ #bodyContent .sml-doc pre.code, #bodyContent .sml-doc pre.file, #bodyContent .sml-doc p.sml-note{min-width:min(100%,240px)!important;} } </style></html> <html><script> (function(){ /* 页面标题取正文里的产品 H1,避免写死型号;需等 H1 渲染后再设 */ function setTitle(){ var h=document.querySelector('#bodyContent h1'); var t=h?h.textContent.trim():''; if(t) document.title=t+' - SmartInc Product Wiki'; } if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',setTitle);}else{setTitle();} })(); </script></html> <html><script> (function(){ function bind(){ var hd=document.getElementById('smltoc-hd'); if(!hd) return; hd.onclick=function(){ var u=document.getElementById('smltoc-list'); if(!u) return; var on = (u.style.display==='none'); u.style.display = on ? '' : 'none'; hd.querySelector('a').textContent = on ? '[Hide]' : '[Show]'; }; } if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',bind);}else{bind();} })(); </script></html> <html><h1 style="margin:0 0 .2em 0;padding:0;">sTPC-EXXX-3568B Series</h1></html> <html><p style="font-size:13px;color:#54595d;margin:0 0 1.1em 0;">Product Series: sTPC-EXXX-3568B (E101 / E121 / E150 / E156 / E170 / E215) · Rockchip RK3568 · 10.1″ ~ 21.5″ Fanless ARM Touch Panel PC (PANEL PC)</p></html> <html><div class="sml-top"><div class="sml-left"><div id="smltoc"> <div class="hd" id="smltoc-hd">Contents <a>[hide]</a></div> <ul class="toclist" id="smltoc-list"> <li class="l1"><a href="#资源特性">1 Resources and Features</a></li> <li class="l2"><a href="#产品简介">1.1 Product Overview</a></li> <li class="l2"><a href="#整机规格">1.2 Unit Specifications</a></li> <li class="l2"><a href="#型号与配置">1.3 Model and Configuration</a></li> <li class="l2"><a href="#可选配件">1.4 Optional Accessories</a></li> <li class="l1"><a href="#接口布局和尺寸">2 Interface Layout and Dimensions</a></li> <li class="l2"><a href="#整机外观">2.1 Unit Appearance</a></li> <li class="l2"><a href="#接口概览">2.2 Interface Overview</a></li> <li class="l2"><a href="#接口引脚定义">2.3 Interface Pin Definitions</a></li> <li class="l2"><a href="#机械尺寸">2.4 Mechanical Dimensions</a></li> <li class="l1"><a href="#快速入门">3 Quick Start</a></li> <li class="l2"><a href="#系统下载">3.1 System Download</a></li> <li class="l2"><a href="#烧录工具下载">3.2 Flashing Tool Download</a></li> <li class="l2"><a href="#系统烧录">3.3 System Flashing</a></li> <li class="l2"><a href="#u盘升级">3.4 USB Drive Upgrade</a></li> <li class="l3"><a href="#准备_updateimg">3.4.1 Prepare update.img</a></li> <li class="l3"><a href="#u盘本地升级">3.4.2 Local Upgrade via USB Drive</a></li> <li class="l1"><a href="#android系统的使用">4 Using Android</a></li> <li class="l2"><a href="#开启adb调试">4.1 Enable ADB Debugging</a></li> <li class="l3"><a href="#usb_adb使用方法">4.1.1 USB ADB Usage</a></li> <li class="l3"><a href="#网络adb使用方法">4.1.2 Network ADB Usage</a></li> <li class="l2"><a href="#wifi使用方法">4.2 WiFi Usage</a></li> <li class="l2"><a href="#以太网使用方法">4.3 Ethernet Usage</a></li> <li class="l2"><a href="#g模块使用方法">4.4 4G Module Usage</a></li> <li class="l3"><a href="#支持列表">4.4.1 Support List</a></li> <li class="l3"><a href="#步骤">4.4.2 Steps</a></li> <li class="l2"><a href="#串口使用方法">4.5 Serial Port Usage</a></li> <li class="l3"><a href="#测试工具_comassistant">4.5.1 Test Tool ComAssistant</a></li> <li class="l3"><a href="#测试方式">4.5.2 Test Method</a></li> <li class="l3"><a href="#应用层调用">4.5.3 Application-Layer Calls</a></li> <li class="l2"><a href="#usb与sd卡">4.6 USB and SD Card</a></li> <li class="l2"><a href="#音频测试">4.7 Audio Test</a></li> <li class="l2"><a href="#hdmi与双屏显示">4.8 HDMI and Dual Display</a></li> <li class="l2"><a href="#按键与指示灯测试">4.9 Button and Indicator LED Test</a></li> <li class="l2"><a href="#触摸屏测试">4.10 Touch Screen Test</a></li> <li class="l2"><a href="#gpio使用方法">4.11 GPIO Usage</a></li> <li class="l2"><a href="#api参考与使用">4.12 API Reference and Usage</a></li> <li class="l3"><a href="#使用说明">4.12.1 Usage Instructions</a></li> <li class="l3"><a href="#硬件及系统信息查询">4.12.2 Hardware and System Information Query</a></li> <li class="l3"><a href="#显示控制_display">4.12.3 Display Control (display_)</a></li> <li class="l3"><a href="#gpio控制_gpio">4.12.4 GPIO Control (gpio_)</a></li> <li class="l3"><a href="#串口控制_uart">4.12.5 Serial Port Control (uart_)</a></li> <li class="l3"><a href="#系统控制_sysctrl">4.12.6 System Control (sysctrl_)</a></li> <li class="l2"><a href="#ota在线升级_android">4.13 OTA Update (Android)</a></li> <li class="l1"><a href="#linux系统的使用">5 Using Linux</a></li> <li class="l2"><a href="#声卡使用方法">5.1 Sound Card Usage</a></li> <li class="l2"><a href="#网络使用方法">5.2 Network Usage</a></li> <li class="l3"><a href="#以太网">5.2.1 Ethernet</a></li> <li class="l3"><a href="#wifi">5.2.2 WiFi</a></li> <li class="l2"><a href="#串口使用方法_linux">5.3 Serial Port Usage (Linux)</a></li> <li class="l2"><a href="#gpio使用方法_sysfs">5.4 GPIO Usage (sysfs)</a></li> <li class="l2"><a href="#usb与sd卡挂载">5.5 USB and SD Card Mounting</a></li> <li class="l2"><a href="#分辨率与hdmi">5.6 Resolution and HDMI</a></li> <li class="l2"><a href="#远程访问及文件传输">5.7 Remote Access and File Transfer</a></li> <li class="l2"><a href="#开机自动执行程序">5.8 Auto-Run Programs at Boot</a></li> <li class="l3"><a href="#登录前执行">5.8.1 Execute Before Login</a></li> <li class="l3"><a href="#登录后执行">5.8.2 Execute After Login</a></li> <li class="l3"><a href="#进入图形界面后执行">5.8.3 Execute After Entering the GUI</a></li> <li class="l2"><a href="#界面与显示自定义">5.9 UI and Display Customization</a></li> <li class="l3"><a href="#状态栏自定义">5.9.1 Status Bar Customization</a></li> <li class="l3"><a href="#屏蔽桌面环境">5.9.2 Disable Desktop Environment</a></li> <li class="l3"><a href="#更换开机logo">5.9.3 Replace Boot LOGO</a></li> <li class="l3"><a href="#切换不同lcd显示屏">5.9.4 Switch Between Different LCD Screens</a></li> <li class="l3"><a href="#屏幕旋转">5.9.5 Screen Rotation</a></li> <li class="l2"><a href="#ota在线升级固件">5.10 OTA Firmware Update</a></li> <li class="l3"><a href="#通过网络ota">5.10.1 OTA via Network</a></li> <li class="l3"><a href="#使用u盘在线升级">5.10.2 OTA Update via USB Drive</a></li> <li class="l2"><a href="#交叉编译环境">5.11 Cross-Compilation Environment</a></li> <li class="l3"><a href="#apt安装交叉编译环境">5.11.1 Install Cross-Compilation Environment via apt</a></li> <li class="l3"><a href="#下载指定版本工具链">5.11.2 Download a Specific Toolchain Version</a></li> <li class="l3"><a href="#工具链下载">5.11.3 Toolchain Download</a></li> <li class="l2"><a href="#qt应用开发">5.12 Qt Application Development</a></li> <li class="l3"><a href="#导入docker镜像编译">5.12.1 Import Docker Image for Compilation</a></li> <li class="l3"><a href="#板端搭建qt编译环境">5.12.2 Set Up Qt Build Environment on the Board</a></li> <li class="l2"><a href="#视频硬件编解码支持">5.13 Video Hardware Codec Support</a></li> <li class="l1"><a href="#通用方法">6 General Methods</a></li> <li class="l2"><a href="#查看cpu温度">6.1 Check CPU Temperature</a></li> <li class="l2"><a href="#查看cpu序列号">6.2 Check CPU Serial Number</a></li> <li class="l2"><a href="#查看cpu频率">6.3 Check CPU Frequency</a></li> <li class="l2"><a href="#查看内存容量">6.4 Check Memory Capacity</a></li> <li class="l2"><a href="#查看存储容量">6.5 Check Storage Capacity</a></li> <li class="l2"><a href="#网络ping测试">6.6 Network Ping Test</a></li> <li class="l2"><a href="#设置系统时间保存到rtc芯片">6.7 Set System Time and Save to RTC Chip</a></li> <li class="l1"><a href="#附录">7 Appendix</a></li> <li class="l2"><a href="#常见问题排查">7.1 FAQ Troubleshooting</a></li> <li class="l2"><a href="#文档信息与修订记录">7.2 Document Information and Revision History</a></li> <li class="l2"><a href="#技术支持">7.3 Technical Support</a></li> </ul> </div></div> <div class="sml-gallery"> <div class="sml-g-head"><div><div class="sml-g-kicker">PRODUCT GALLERY / Product Gallery</div><div class="sml-g-title">sTPC-EXXX-3568B Series · Unit Appearance</div></div><div class="sml-g-note">Using the E156 model as an example · Click a view on the right to switch</div></div> <div class="sml-g-body"><div class="sml-g-stage"><img id="sml-g-main" class="sml-g-main" src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_front_view_v.jpg" alt="Front View · Capacitive Touch Front Panel"><div class="sml-g-badge">INDUSTRIAL PANEL PC</div><a id="sml-g-zoom" class="sml-g-zoom" href="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_front_view.jpg" target="_blank" rel="noopener">View Full-Resolution Image ↗</a><div class="sml-g-cap" id="sml-g-cap">Front View · Capacitive Touch Front Panel</div><div class="sml-g-count" id="sml-g-count">01 / 05</div></div><div class="sml-g-side"><div class="sml-g-side-hd">Unit Views / 05 VIEWS</div><button type="button" class="sml-g-thumb on" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_front_view_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_front_view.jpg" data-idx="01" data-cap="Front View · Capacitive Touch Front Panel"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_thumb_02.jpg" alt="Front View"></span><span class="sml-g-tx"><b>VIEW 01</b>Front View</span></button><button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_3568b_perspective_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_3568b_perspective.jpg" data-idx="02" data-cap="Perspective View · Unit Structure and Rear Expansion Bay"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_thumb_01.jpg" alt="Perspective View"></span><span class="sml-g-tx"><b>VIEW 02</b>Perspective View</span></button><button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_3568b_back_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_3568b_back.jpg" data-idx="03" data-cap="Rear View · Fully Sealed Aluminum Alloy Rear Enclosure"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_thumb_03.jpg" alt="Rear View"></span><span class="sml-g-tx"><b>VIEW 03</b>Rear View</span></button><button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_3568b_io_lower_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_3568b_io_lower.jpg" data-idx="04" data-cap="Interface View · Lower-Side External I/O Layout"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_thumb_04.jpg" alt="Lower-Side I/O"></span><span class="sml-g-tx"><b>VIEW 04</b>Lower-Side I/O</span></button><button type="button" class="sml-g-thumb" data-view="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_3568b_io_upper_v.jpg" data-full="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_3568b_io_upper.jpg" data-idx="05" data-cap="Interface View · Rear Antenna and Expansion Interfaces"><span class="sml-g-tn"><img src="/dokuwiki/lib/exe/fetch.php?media=wiki:stpc_e156_thumb_05.jpg" alt="Expansion Interfaces"></span><span class="sml-g-tx"><b>VIEW 05</b>Expansion Interfaces</span></button></div></div> <div class="sml-g-specs"><div class="sml-g-spec"><b>RK3568</b><em>Quad-Core Cortex-A55 · 1TOPS NPU</em></div><div class="sml-g-spec"><b>10.1″–21.5″</b><em>Six Sizes · Capacitive Touch</em></div><div class="sml-g-spec"><b>Fanless Fully Sealed</b><em>VESA / Embedded Mounting</em></div><div class="sml-g-spec"><b>Dual OS Optional</b><em>Android 11 / Ubuntu 20.04</em></div></div> <div class="sml-g-apps"><span class="t">Typical Applications</span><span class="chip">Production Line Dashboard</span><span class="chip">Equipment HMI</span><span class="chip">Self-Service Query Terminal</span><span>Long-Term Stable Operation in Industrial Sites</span></div> </div> </div></html> <html><script> (function(){ function wrapTables(){ var ts=document.querySelectorAll('#bodyContent table.inline'); for(var i=0;i<ts.length;i++){ var t=ts[i], pn=t.parentNode; if(!pn) continue; if(String(pn.className||'').indexOf('sml-tw')>=0) continue; var w=document.createElement('div'); w.className='sml-tw'; pn.insertBefore(w,t); w.appendChild(t); } } function markNotes(){ var ps=document.querySelectorAll('#bodyContent p'); for(var i=0;i<ps.length;i++){ if(/^(提示|注意|说明|Note|Caution|Warning|Tip|Description)[::]/.test(ps[i].textContent.trim())) ps[i].classList.add('sml-note'); } } /* 第 1 / 2 章的产品规格数据:铺满宽度、规格卡头、图版化、外观图取原图 */ function enhanceSpec(){ var c=document.getElementById('bodyContent'); if(!c) return; var h2s=[].slice.call(c.querySelectorAll('h2')); function inProduct(y){ var ch=null; for(var j=0;j<h2s.length;j++){ if(h2s[j].getBoundingClientRect().top+window.pageYOffset<=y+4) ch=h2s[j]; else break; } return ch && /^[12][^0-9]/.test(ch.textContent.trim()); } var ts=[].slice.call(c.querySelectorAll('table.inline')); for(var i=0;i<ts.length;i++){ var t=ts[i], w=t.parentNode; if(!w || String(w.className||'').indexOf('sml-tw')<0) continue; if(String(w.className).indexOf('sml-spec')>=0) continue; if(!inProduct(t.getBoundingClientRect().top+window.pageYOffset)) continue; var cols=t.rows[0]?t.rows[0].cells.length:0; var rows=Math.max(0,t.rows.length-1); var cls='sml-tw sml-spec'; var fig=t.querySelector('img.media')!==null; if(cols>=5) cls+=' sml-wide'; if(fig) cls+=' sml-figgrid'; var featured=(!fig)&&(rows>=10||cols>=7); if(featured) cls+=' sml-featured'; /* 整机规格(26x2) 与 型号与配置(6x8) 两张主表保持现状,其余统一收一档 */ var keep=(!fig)&&(((rows>=15)&&(cols<=2))||(cols>=7)); if(keep) cls+=' sml-keep'; w.className=cls; if(featured){ var hd=document.createElement('div'); hd.className='sml-spec-hd'; var k=document.createElement('span'); k.className='sml-spec-kick'; k.textContent=(rows>=15?'PRODUCT SPECIFICATION':'PRODUCT DATA'); var m=document.createElement('span'); m.className='sml-spec-meta'; m.textContent=rows+' ITEMS'+(cols>2?' / '+cols+' FIELDS':''); hd.appendChild(k); hd.appendChild(m); w.insertBefore(hd,t); } if(fig){ var imgs=t.querySelectorAll('img.media'); for(var z=0;z<imgs.length;z++){ var s=imgs[z].getAttribute('src')||''; var mm=s.match(/media=([^&]+)/); if(mm && /[?&]w=/.test(s)){ imgs[z].setAttribute('src',s.split('?')[0]+'?media='+mm[1]); imgs[z].removeAttribute('width'); imgs[z].removeAttribute('height'); } } } } var fimgs=[].slice.call(c.querySelectorAll('a.media > img.media')); for(var n=0;n<fimgs.length;n++){ var im=fimgs[n]; if(im.closest('table')) continue; var host=im.parentNode.parentNode; if(!host||host.tagName!=='P'||String(host.className).indexOf('sml-figure')>=0) continue; if(!inProduct(im.getBoundingClientRect().top+window.pageYOffset)) continue; host.className='sml-figure'; } } /* 第三章「快速入门」起:给文档区打统一版心标记 */ function markDoc(){ var c=document.getElementById('bodyContent'); if(!c) return; var hs=[].slice.call(c.querySelectorAll('h2')); var start=null; for(var i=0;i<hs.length;i++){ if(/^3[\s\u3000]/.test(hs[i].textContent.trim())){start=hs[i];break;} } if(!start) start=document.getElementById('快速入门'); if(!start) return; var e=start; while(e){ if(e.nodeType===1) e.classList.add('sml-doc'); e=e.nextElementSibling; } } /* 命令行块宽度归档:按内容归入 480 / 640 / 820 三档,右边界成列 */ function sizeCode(){ var ps=[].slice.call(document.querySelectorAll('#bodyContent .sml-doc pre.code,#bodyContent .sml-doc pre.file')); var need=ps.map(function(e){ e.classList.remove('sml-cw1','sml-cw2','sml-cw3'); return e.getBoundingClientRect().width; }); ps.forEach(function(e,i){ e.classList.add('sml-cw'+(need[i]<=480?1:(need[i]<=640?2:3))); }); } /* 图版内的图片(第 2 章 接口 / 外观):点击在新窗口打开原图 */ function bigImage(){ var as=document.querySelectorAll('#bodyContent .sml-figgrid td a.media'); for(var i=0;i<as.length;i++){ var h=as[i].getAttribute('href')||''; var base=h.split('/lib/exe/')[0]; if(!base) continue; var m=h.match(/[?&]media=([^&]+)/); if(!m) continue; as[i].setAttribute('href',base+'/lib/exe/fetch.php?media='+m[1]); as[i].setAttribute('target','_blank'); as[i].setAttribute('rel','noopener'); as[i].setAttribute('title','Click to view full-size image'); } } function enhance(){markDoc();wrapTables();markNotes();enhanceSpec();sizeCode();bigImage();} function bind(){ enhance(); var st=document.getElementById('sml-g-main'); if(!st) return; var cap=document.getElementById('sml-g-cap'); var cnt=document.getElementById('sml-g-count'); var zoom=document.getElementById('sml-g-zoom'); var bs=document.querySelectorAll('button.sml-g-thumb'); for(var i=0;i<bs.length;i++){ bs[i].addEventListener('click',function(){ for(var j=0;j<bs.length;j++){bs[j].className='sml-g-thumb';} this.className='sml-g-thumb on'; var self=this; st.style.opacity='0.35'; window.setTimeout(function(){ st.src=self.getAttribute('data-view'); st.alt=self.getAttribute('data-cap'); st.style.opacity='1'; },90); cap.textContent=self.getAttribute('data-cap'); var tot=bs.length; cnt.textContent=self.getAttribute('data-idx')+' / '+(tot<10?'0'+tot:tot); zoom.href=self.getAttribute('data-full'); }); } } if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',bind);}else{bind();} window.addEventListener('load',enhance); })(); </script></html> ===== 1 Resources and Features ===== ==== 1.1 Product Overview ==== sTPC-EXXX-3568B Series (Production Models: sTPC-E101-3568B / E121-3568B / E150-3568B / E156-3568B / E170-3568B / E215-3568B) is based on the Rockchip **RK3568** platform, a **Fanless ARM Touch Panel PC (PANEL PC)**, with screen sizes covering 10.1″ / 12.1″ / 15″ / 15.6″ / 17″ / 21.5″ in six specifications. The unit adopts an aluminum-magnesium alloy front frame + a fully sealed rear enclosure, the front is a multi-point capacitive touch screen, the lower rear concentrates the power supply, serial port, USB, HDMI, network port and other external interfaces, the antenna and SIM card are located on the upper rear. Supports VESA mount and embedded (cutout) as two installation methods, suitable for production line dashboards, equipment HMI, self-service query terminals and other industrial sites. **Product Features** * Supports Rockchip RK3568: 4 × Cortex-A55 @2.0GHz, 1TOPS NPU * Fully onboard I/O design, interfaces concentrated on the lower rear, maintenance requires no disassembly * Fanless fully sealed structure, support for VESA / embedded mounting * Android 11 and Ubuntu 20.04, dual OS optional **Model Naming Rules** ^ Field ^ Meaning ^ | sTPC | Touch Panel PC Series (SmartLinc Touch Panel Computer) | | E101 / E121 / E150 / E156 / E170 / E215 | Screen Size: 10.1″ / 12.1″ / 15″ / 15.6″ / 17″ / 21.5″ | | 3568B | Main Control Platform: Rockchip RK3568, B version unit | ==== 1.2 Unit Specifications ==== ^ Item ^ Specifications ^ | **Processor** | Rockchip RK3568, 4 cores 4 × Cortex-A55, max frequency 2.0GHz | | **GPU** | Mali-G52 | | **NPU** | 1 TOPS(INT8) | | **Memory** | 2GB / 4GB (onboard) | | **Storage** | Onboard 32GB eMMC | | **Storage Expansion** | 1 × Micro SD (TF) card slot | | **Display Output** | 1 × HDMI, up to 3840 × 2160 | | **Ethernet** | 1 × 10/100/1000Mbps auto-negotiation | | **Wireless** | Onboard 2.4G/5G dual-band Wi-Fi, 802.11 a/b/g/n/ac + Bluetooth 5.0 | | **4G** | LTE 4G module EG800AK-C (auto-dial), see 4.4 | | **USB** | 2 × USB3.0 (1 channel multiplexed with OTG) + 2 × USB2.0 | | **Serial Port** | 4 × Serial Port: 2 × RS485 + 2 × RS232 (3.5mm pitch 3P pluggable terminal), ttyS1 ~ ttyS4 | | **Audio** | 1 × SPK (8Ω 6W, PH2.0-4P), 1 × Ø3.5 Mic in | | **SIM** | 2 × Micro SIM slots (one of two) | | **Indicator LED** | 1 × power supply indicator LED (green), 1 × system indicator LED (blue) | | **Button** | 1 × Recover flash button (pinhole), 1 × Return button (short press to return / hold 3s at power-on to enter flashing) | | **GPIO** | 16 pins (PH2.0-16P) terminal, odd pins GPO / even pins GPI, optional breakout, see 2.3 | | **Touch Screen** | multi-point capacitive, transmittance ≥ 87%, USB controller | | **Operating System** | Android 11 / Ubuntu 20.04 (standard); Debian 11 available per project | | **Video Codec** | H.264 / H.265 hardware codec (VPU), see 5.13 | | **Power Supply Input** | DC 12V (±0.3V), 5.5×2.1mm barrel plug, with over-current, over-voltage protection; E150 (15″) supports DC 12~24V wide voltage | | **Unit Power Consumption** | ≤ 20W | | **Structure** | Aluminum-Magnesium Alloy Enclosure, Fanless, Supports VESA / Embedded Mounting | | **Operating Temperature** | -20 ~ 70℃(10.1″ / 12.1″ / 15″);0 ~ 50℃(15.6″ / 17″ / 21.5″) | | **Storage Temperature** | -20 ~ 70℃(10.1″ / 12.1″ / 15″);-20 ~ 60℃(15.6″ / 17″ / 21.5″) | | **Relative Humidity** | 5 ~ 95% @40℃ (Non-Condensing) | | **Vibration** | 1.5Grms, IEC 60068-2-64, Random 5~500Hz, 1hr/Axis | | **Shock** | 10G, IEC 60068-2-27, Half-Sine Wave, 11ms Duration | | **EMC** | CE / FCC Class A | **Note:** Specifications are subject to change without prior notice. Data in this section corresponds to specification sheet v1.3 (updated 2026-06-24). ==== 1.3 Model and Configuration ==== ^ Model ^ Size ^ Resolution ^ Brightness ^ Backlight MTBF ^ Operating Temperature ^ 2GB Memory Part Number ^ 4GB Memory Part Number ^ | sTPC-E101-3568B | 10.1″ | 1280 × 800 | 350cd/m² | 30000hrs | -20 ~ 70℃ | B11.AE101.38.0024 | B11.AE101.38.0025 | | sTPC-E121-3568B | 12.1″ | 1024 × 768 | 500cd/m² | 50000hrs | -20 ~ 70℃ | B11.AE121.38.0004 | B11.AE121.38.0005 | | sTPC-E150-3568B | 15″ | 1024 × 768 | 350cd/m² | 50000hrs | -20 ~ 70℃ | B11.AE150.38.0018 | B11.AE150.38.0019 | | sTPC-E156-3568B | 15.6″ | 1920 × 1080 | 250cd/m² | 15000hrs | 0 ~ 50℃ | B11.AE156.38.0012 | B11.AE156.38.0013 | | sTPC-E170-3568B | 17″ | 1280 × 1024 | 250cd/m² | 30000hrs | 0 ~ 50℃ | B11.AE170.38.0010 | B11.AE170.38.0011 | | sTPC-E215-3568B | 21.5″ | 1920 × 1080 | 250cd/m² | 30000hrs | 0 ~ 50℃ | B11.AE215.38.0006 | B11.AE215.38.0007 | **Note:** All models use a capacitive touch screen + 32GB onboard eMMC, in two memory configurations (2GB / 4GB); actual part numbers are listed in the table above; see 1.2, 2.3 for wide-range power input and interface group count differences of the 15″ model (E150). ==== 1.4 Optional Accessories ==== ^ Option ^ Description ^ | Power Adapter | 12V 3A power adapter, with a GB-standard power cord | | 4G Kit | EG800AK-C module + 4G external antenna (SMA) | | Wi-Fi Antenna | Rubber duck antenna, 3M suction-mount antenna | ===== 2 Interface Layout and Dimensions ===== ==== 2.1 Unit Appearance ==== The unit uses a flat-front + rear-cable-outlet design: the front holds only the touch screen and the aluminum-alloy front frame; the upper rear houses the antenna, SIM card slot and speaker connector area; the lower rear houses the external interface area (power supply, serial port, USB, HDMI, Ethernet port); the four corners have VESA mounting holes. ^ Unit Front ^ Perspective View ^ | {{wiki:stpc_e156_front_view.jpg?400}} \\ Front: Multi-Point Capacitive Touch Screen + Aluminum-Magnesium Alloy Front Frame | {{wiki:stpc_e156_3568b_perspective.jpg?400}} \\ Perspective: Unit Structure and Rear Expansion Bay | ^ Unit Rear ^ Interface Area (Front View) ^ | {{wiki:stpc_e156_3568b_back.jpg?400}} \\ Rear: VESA Holes + Interface Area | {{wiki:stpc_e156_3568b_io_lower.jpg?400}} \\ Interface Area: DC 12V / Serial Port / HDMI / Ethernet / USB Arranged in a Single Row | ==== 2.2 Interface Overview ==== The external interfaces on the **lower rear** of the unit, from left to right, are: DC 12V → PWR / SYS indicator LEDs → Recover → Return → MIC → RS485 → RS232 → HDMI → LAN → USB3.0 → USB2.0; on the upper rear, from left to right: SIM card slot → 4G antenna → Wi-Fi / BT antenna → SPK speaker connector → GPIO breakout connector. Labels in the figure correspond one-to-one with the numbers in the table below; click an image to view the high-resolution version. ^ Interface Layout (Front View) ^ Interface Layout (Angled View) ^ | {{wiki:stpc_e156_io_a.png?400}} \\ Front View: External Interfaces Lined Up in a Row on the Lower Rear | {{wiki:stpc_e156_io_b.png?400}} \\ Angled View: Positions of RS485 / SIM / Speaker / Antenna Connectors | ^ No. ^ Silkscreen Label ^ Interface ^ Qty ^ Description ^ | 1 | DC 12V | Power Input | 1 | 5.5×2.1mm barrel connector, center positive, outer negative | | 2 | PWR | Power Indicator LED | 1 | Green, steady on when powered | | 3 | SYS | System Indicator LED | 1 | Blue, steady on while the system is running | | 4 | Recover | Flash Button | 1 | Pinhole type; power off, hold and power on to enter Loader / Maskrom | | 5 | Return | Back Button | 1 | Tactile button, equivalent to BACK under Android | | 6 | MIC | Microphone Input | 1 | Ø3.5 phone jack | | 7 | RS485 | RS485 serial port | 2 | 3.5mm 3P terminal, A1 / B1 / G1, ttyS1 | | 8 | RS232 | RS232 serial port | 2 | 3.5mm 3P terminal, R2 / T2 / G2, ttyS2 | | 9 | HDMI | HDMI Output | 1 | Standard Type A, up to 3840×2160 | | 10 | LAN | Ethernet | 1 | RJ45, 10/100/1000M auto-negotiation | | 11 | USB3.0 | USB3.0 | 2 | Blue dual-stack, lower port multiplexed as OTG (flashing / ADB) | | 12 | USB2.0 | USB2.0 | 2 | Black dual-stack | | 13 | SIM | Micro SIM | 2 | Use one of the two | | 14 | 4G | 4G Antenna | 1 | SMA connector | | 15 | Wi-Fi/BT | Wi-Fi Antenna | 1 | SMA connector | | 16 | SPK | Speaker | 1 | PH2.0-4P, 8Ω 6W | | 17 | GPIO | GPIO Expansion | 1 | Optional breakout | | 18 | GND | Grounding Stud | 1 | M4 grounding screw | **Note:** Quantities in the table are the maximum configuration for the series; the actual number of groups varies by model and configuration (the 10.1″ sample in the figure has one group each of RS485 and RS232). Wiring and device nodes follow the silkscreen labels on the unit; see 4.5 for the node mapping. ==== 2.3 Interface Pin Definitions ==== All external connectors on the unit are finished connectors; no bare board pin headers. The serial ports and speaker use pluggable terminal blocks with 3.5mm / 2.0mm pitch; align wiring with the silkscreen labels. Recommended wire gauge: 0.2 ~ 1.5mm²; strip length: 6 ~ 7mm. **DC 12V (5.5×2.1mm Barrel Connector)** ^ Item ^ Definition ^ | Center Pin | +12V | | Outer Ring | GND | | Input Range | DC 12V ±0.3V (15″ model: 12 ~ 24V) | | Protection | Overvoltage protection, overcurrent protection | **RS485 (3.5mm 3P Terminal, 2 Groups: ttyS1 / ttyS3)** ^ Pin ^ RS485-1 (ttyS1)^ RS485-2 (ttyS3)^ Description ^ | 1 | A1 | A3 | Differential Positive (485_A) | | 2 | B1 | B3 | Differential Negative (485_B) | | 3 | G1 | G3 | Signal Ground | Half duplex; transmit/receive direction is switched automatically by hardware; no software RTS control is required. **RS232 (3.5mm 3P Terminal, 2 Groups: ttyS2 / ttyS4)** ^ Pin ^ RS232-1 (ttyS2)^ RS232-2 (ttyS4)^ Description ^ | 1 | R2 | R4 | Receive RXD, connect to peer TXD | | 2 | T2 | T4 | Transmit TXD, connect to peer RXD | | 3 | G2 | G4 | Signal Ground | Full duplex; when connecting to external devices, **cross R/T and share GND**. **Note:** The silkscreen suffix matches the device node number (A1 → ttyS1, R2 → ttyS2, A3 → ttyS3, R4 → ttyS4); therefore RS485 uses ttyS1 / ttyS3 and RS232 uses ttyS2 / ttyS4. Non-consecutive numbering is normal. **SPK(PH2.0-4P)** ^ Pin ^ Silkscreen Label ^ Signal ^ Description ^ | 1 | L+ | Left Channel + | 8Ω 6W | | 2 | L- | Left Channel - | — | | 3 | R- | Right Channel - | — | | 4 | R+ | Right Channel + | 8Ω 6W | **MIC(Ø3.5 phone jack)** ^ Part ^ Signal ^ Description ^ | TIP | MIC+ | Microphone Signal | | SLEEVE | GND | Ground | **USB** ^ Interface ^ Mode ^ Description ^ | USB3.0 (Upper Row) | Host | 5Gbps; connect USB flash drives / keyboard and mouse / industrial cameras | | USB3.0/OTG (Lower Row) | Host / Device | In Device mode, used for system flashing and ADB debugging | | USB2.0 (Dual-Stack) | Host | 480Mbps; connect USB flash drives / keyboard and mouse / printers | **HDMI / LAN / SIM** ^ Interface ^ Specifications ^ | HDMI | Standard Type A 19-pin, up to 3840×2160 | | LAN | RJ45 8P8C, 10/100/1000M auto-negotiation, supports Auto-MDIX, with Link/Act indicator LEDs | | SIM | 2 × Micro SIM, use one of the two, insertion direction follows the silkscreen label on the socket | **GPIO (PH2.0-16P Terminal, Optional Breakout)** The unit GPIO is an optional breakout (rear GPIO connector / internal pin header); align wiring with the silkscreen labels on the unit. ^ Pin ^ Direction ^ Description ^ | Odd pins 1 / 3 / 5 / 7 / 9 / 11 / 13 / 15 | GPO | General-purpose output, fixed by hardware, output only | | Even pins 2 / 4 / 6 / 8 / 10 / 12 / 14 / 16 | GPI | General-purpose input, fixed by hardware, input only | GPO / GPI are fixed by hardware and cannot be swapped by software; the table below lists system-side GPIO numbers, which are a different concept from terminal pin numbers. **System GPIO Numbers** ^ Purpose ^ System GPIO Numbers ^ | GPO (Digital Output) | 95、94、21、22、140、141 | | GPO / GPI (Output / Input) | 13、14、96、93、108、107 | GPIO numbers are kernel gpiochip global numbers and may shift as a whole across firmware versions; unexported pins must be exported before use. ==== 2.4 Mechanical Dimensions ==== ^ Model ^ Unit Dimensions W×H×D (mm) ^ Cutout Dimensions (mm) ^ Net Weight ^ | sTPC-E101-3568B | 269 × 188 × 39 | 261 × 180 | 1kg | | sTPC-E121-3568B | 315 × 250 × 44 | 307 × 242 | 2kg | | sTPC-E150-3568B | 368 × 292 × 46 | 358 × 282 | 2.5kg | | sTPC-E156-3568B | 400 × 257 × 39 | 392 × 249 | 3kg | | sTPC-E170-3568B | 408 × 341 × 46 | 398 × 331 | 4kg | | sTPC-E215-3568B | 549 × 341 × 46 | 539 × 330 | 5kg | {{wiki:pc_dim_101_big.png?760}} Dimension drawing for the 10.1″ model (unit: mm): unit 269 × 188 × 39, cutout 261±2 × 180±2, mounting holes 4 × Ø10, VESA holes 4 × M4 depth 6mm. For dimension drawings of other sizes, see pages 2~3 of the specification sheet. **Structural Description** * Enclosure material: aluminum-magnesium alloy front frame + metal rear enclosure, fanless and fully sealed * Mounting: VESA bracket (4 × M4, depth 6mm) or embedded cutout mounting (clip-fixed) * Cooling: natural cooling for the unit; reserve ≥ 50mm ventilation space at the rear ===== 3 Quick Start ===== ==== 3.1 System Download ==== **Android System** * Android 11 firmware (with root access): contact Sales / Technical Support for the download link **Linux System** * Ubuntu 20.04 firmware (with Qt 5.12.8, GStreamer): contact Sales / Technical Support for the download link * Debian 11 firmware: provided separately per project requirements ==== 3.2 Flashing Tool Download ==== Both tools are official Rockchip releases, uploaded as attachments on this site; download links are at the end of each item: * **USB Driver**: After extraction, double-click DriverInstall.exe to complete installation —— {{wiki:driverassitant_v5.11.zip|DriverAssitant_v5.11 Driver Installation Package (9.4 MB)}} * **Flashing Tool**: After extraction, double-click RKDevTool.exe to launch —— {{wiki:rkdevtool_release_v3.32.zip|RKDevTool_Release_v3.32 Flashing Tool (5.5 MB)}} **Note:** If the driver is not installed successfully, an unknown device appears in Device Manager; reinstall the driver before flashing. ==== 3.3 System Flashing ==== Linux and Android use the same Rockchip tools for flashing; the unit requires no disassembly: connect via the **USB3.0/OTG port** and enter flashing mode via the **Recover pinhole**. **① Connect the OTG Port** Take a USB3.0 male-to-male cable; connect one end to the blue **USB3.0/OTG** port in the lower row of the rear interface area and the other end to a PC USB port: {{wiki:burn_otg_v2.png?560}} **② Install the Rockchip USB Driver** Enter the driver package directory and double-click DriverInstall.exe: {{wiki:flash2.png?560}} When the "Rockchip Driver Assistant" dialog appears, click "Install Driver" and wait for the progress bar to complete: {{wiki:flash3.png?560}} **Note:** If the device is not recognized due to a driver error or after switching PCs, click "Uninstall Driver" in Driver Assistant first, then click "Install Driver" again. **③ Open the Flashing Tool** Extract the tool package and double-click RKDevTool.exe: {{wiki:flash4.png?560}} **④ Put the Unit into Loader Mode** Power off the unit first, hold the rear **Recover** hole with a pin without releasing, then connect DC 12V to power on, and release after about 2 seconds: {{wiki:burn_recover_v2.png?560}} **⑤ Confirm the Device Is Recognized** When **Found One LOADER Device** appears at the bottom of RKDevTool, the device is recognized: {{wiki:flash6.png?560}} If "No device found" keeps showing, go back to step ④ and re-enter, or change the USB port and data cable. **⑥ Select firmware and upgrade** Switch to the "Upgrade Firmware" tab, first click "Firmware" to select update.img, then click "Upgrade": {{wiki:flash7.png?560}} After flashing reaches 100%, the device reboots automatically; first boot takes about 30 ~ 60 seconds. **Note:** - If the device is not recognized when switching from Android to Linux (or vice versa), run "Enter Maskrom" in "Advanced Features" and re-flash - Do not cut power or unplug the cable during flashing; otherwise the unit may fail to boot and must be re-flashed after re-entering Loader - Advanced users can flash via the upgrade_tool command line under Linux: sudo upgrade_tool uf update.img ==== 3.4 USB Drive Upgrade ==== The Android unit can be upgraded offline via USB drive without connecting to a PC. This section **applies only to Android firmware**; for the corresponding Linux procedure see 5.10, for OTA update see 4.13. === 3.4.1 Prepare update.img === Choose one of the two firmware sources: - Obtain a ready-made update.img from SmartInc (see 3.1 for how to get it) - Build it yourself with the SDK: run a full build in the SDK root directory to generate the rockdev/Image-xxx/ directory, then run ./mkupdate.sh (or make otapackage) <code bash> # Build the full image ./build.sh updateimg ls -lh rockdev/update.img </code> USB drive requirements: FAT32 format, available capacity ≥ 4GB (≤ 32GB recommended), place update.img in the root directory with the filename unchanged. === 3.4.2 Local Upgrade via USB Drive === - Copy update.img to the root directory of the USB drive - Insert the USB drive into a USB port on the unit (either USB3.0 / USB2.0 port works) - After the system detects the update package, confirm as prompted in the pop-up; keep the power supply on during the update, and the unit reboots automatically when done **Note:** If no upgrade prompt appears after inserting the USB drive, first check the filename and USB drive format, then reboot the unit and retry; for Android OTA update see 4.13. ===== 4 Android System Usage ===== This chapter **applies only to the Android system** (Android 11). Equivalent functions under Linux (Ubuntu / Debian) are grouped in Chapter 5; interfaces, tools and commands are not mixed between the two chapters; Android application-layer API calls are all documented in 4.12. ==== 4.1 Enable ADB Debugging ==== === 4.1.1 USB ADB Usage ==== - Use a USB data cable to connect the **USB3.0/OTG port** of the unit (blue port on the lower row) to the PC - Under "Settings → About tablet", tap "Build number" 7 times consecutively to enable Developer options - Enter "Developer options" and enable "USB debugging" - On the PC, run adb devices; on first connection, tap "Allow" in the pop-up on the unit <code bash> adb devices # List of devices attached # 0123456789ABCDEF device </code> === 4.1.2 Network ADB Usage ==== When the unit and PC are on the same network segment, debug wirelessly without a data cable. <code bash> adb connect 192.168.8.55:5555 adb devices </code> ==== 4.2 WiFi Usage ==== - Go to "Settings → Network & Internet → WLAN" and turn on the switch - Select the target hotspot and enter the password (onboard 2.4G/5G dual-band, 802.11 a/b/g/n/ac) - After connecting, check the IP address in "Network details" - If the signal is weak, adjust the angle of the rear **Wi-Fi/BT** SMA antenna, or use a suction-mount antenna instead <code bash> adb shell dumpsys wifi | grep -i "curState" adb shell ifconfig wlan0 </code> ==== 4.3 Ethernet Usage ==== The unit has a single network port (LAN, Gigabit auto-negotiation); under Android the device name is **eth0**. All commands below run in adb shell; changing settings requires su privileges. **View Device** <code bash> ip link show </code> **Usage (Dynamic IP)** <code bash> su ifconfig eth0 up ifconfig eth0 dhcp # Some firmware requires dhcpcd eth0 instead </code> **Usage (Static IP)** <code bash> su ifconfig eth0 down ifconfig eth0 192.168.8.55 netmask 255.255.255.0 ifconfig eth0 up </code> **Test** <code bash> ping -c 4 192.168.8.1 </code> **Note:** To make a static IP take effect automatically at boot, configure a static eth0 address in the system, or set the Ethernet static IP via ConnectivityManager at the application layer. ==== 4.4 4G Module Usage ==== The unit's 4G uses a Quectel EG800AK-C module (mounted on the 6A12-J carrier board); the system dials automatically after power-on, with no manual configuration required. === 4.4.1 Support List ==== The unit supports only the 4G modules listed below; the USB ID is used to confirm in the board-side lsusb output whether the module is recognized: ^ Module Model ^ Standard ^ USB ID ^ | Quectel EG800AK-C | LTE 4G | 2c7c:6002 | === 4.4.2 Steps ==== **4G Module** - Attach the 4G antenna, and insert the SIM card into the socket with the notch facing outward and the chip facing the board - After power-on, confirm the SIM card is recognized in "Settings → Network & Internet → Mobile network" - Turn on mobile data; once the 4G icon appears in the status bar, you can access the Internet <code bash> adb shell lsusb # Bus 002 Device 002: ID 2c7c:6002 Quectel Wireless Solutions Co., Ltd. EG800AK-C </code> **Check Signal and Network Registration (AT Commands)** The module AT port is generally /dev/ttyUSB2 and requires root privileges: <code bash> echo -e "AT+CPIN?\r\n" > /dev/ttyUSB2 # Check whether the SIM card is inserted properly echo -e "AT+CSQ\r\n" > /dev/ttyUSB2 # Signal strength, 0~99 is normal echo -e "AT+COPS?\r\n" > /dev/ttyUSB2 # Whether registered on the carrier network echo -e "AT+CGREG?\r\n" > /dev/ttyUSB2 # Whether the data network is ready </code> **Note:** Insert or remove the SIM card only **with power off**; hot-plugging may cause the module to be unrecognized, requiring a power cycle. ==== 4.5 Serial Port Usage ==== The unit provides 2 × RS485 and 2 × RS232; Android node and terminal definitions are as follows (the rear silkscreen label takes precedence): ^ Interface ^ Device Node ^ Pin Definition ^ | RS485-1 | /dev/ttyS1 | A1 / B1 / G1 | | RS485-2 | /dev/ttyS3 | A3 / B3 / G3 | | RS232-1 | /dev/ttyS2 | R2 / T2 / G2 | | RS232-2 | /dev/ttyS4 | R4 / T4 / G4 | === 4.5.1 Test Tool ComAssistant ==== Serial port testing under Android uses **ComAssistant** (serial assistant App) throughout: - Install and open ComAssistant; on first run, grant storage and serial port device permissions - Select the target node in the device list: RS485 uses /dev/ttyS1 or /dev/ttyS3, RS232 uses /dev/ttyS2 or /dev/ttyS4 - Set the parameters to 115200, 8 data bits, 1 stop bit, no parity (8N1) - Tap "Open serial port", enter content in the send area and tap "Send"; during loopback or mutual transmission, observe the receive area at the same time **Note:** ComAssistant requires Root privileges to access /dev/ttyS*; if opening fails, first run su and ls -l /dev/ttyS* in adb shell to check node permissions. === 4.5.2 Test Method ==== - RS232 loopback: short R and T of the same 232 node with a jumper cap - RS232 — RS232 mutual transmission: cross wiring (R↔T, common GND) - RS232 — RS485 mutual transmission: via a 232-to-485 converter module - RS232 — RS232-to-USB — serial port assistant on the PC - RS485 — RS485-to-USB — serial port assistant on the PC - RS485 loopback: short A and B **Precautions** - The unit has a 3.5mm 3P pluggable terminal (no DB9); use a crimp terminal or adapter cable. Adapter cable pinouts may differ between manufacturers; reversing A / B or R / T directly causes communication failure - RS485 is half-duplex; direction is switched automatically by hardware, so observe the frame interval when switching between transmit and receive === 4.5.3 Application-Layer Calls ==== Do not open nodes directly via shell in the app; use the NodkaAPI uart_ interface (see 4.12.5): <code java> NodkaAPI api = NodkaAPI.nodkaAPICreate(context); api.uart_open("/dev/ttyS2", 115200); api.uart_send("/dev/ttyS2", "hello".getBytes()); api.uart_receive("/dev/ttyS2", new UartReceiveDataCallback() { @Override public void onReceiveData(byte[] data) { // Process the received data } }); api.uart_close("/dev/ttyS2"); </code> ==== 4.6 USB and SD Card ==== The unit provides 2 × USB3.0 (lower row multiplexed with OTG) and 2 × USB2.0, plus SD card support. **USB Drive** - Insert the USB drive; "USB storage device" appears on the left side of the file manager - If you can browse the USB drive contents after opening it, the drive is recognized correctly - Before unplugging, unmount it in "Settings → Storage" to avoid data corruption <code bash> adb shell ls /storage # Mount points such as udisk0 or 91A3-2B1C are visible adb shell lsusb </code> **SD Card** <code bash> adb shell ls /storage # SD card mount points such as xxxx-xxxx are visible adb shell dumpsys mount | grep -i mmc </code> **Note:** The OTG port in Device mode (flashing / ADB) cannot act as Host at the same time; before inserting a USB drive, confirm the system has exited flashing mode. For manual mounting under Linux see 5.5. ==== 4.7 Audio Test ==== Unit audio is output via **SPK (PH2.0-4P, 8Ω 6W)** and input via **MIC (Ø3.5)**; connect an external speaker when no built-in speaker is present. **Speaker Output Test** - Connect an 8Ω speaker to the SPK terminal (L+ / L- / R+ / R-) - Open the built-in "Music" player to play the test audio, and press the volume keys to confirm the volume is adjustable and the left/right channels are normal - The test file is at /nodka_test/LR_audio.wav and can be played directly with the "Files" app **Microphone Recording Test** - Insert a Ø3.5 microphone or use the onboard MIC - Open the built-in "Recorder" app, record about 5 seconds and play it back to confirm the audio is clear with no noise **View Audio Path** <code bash> adb shell dumpsys media.audio_flinger | grep -i "Output thread" adb shell getprop | grep -i audio </code> **Note:** If there is no sound, first confirm the SPK terminals L+ / L- / R+ / R- match the speaker wire sequence, then use adb shell tinymix to check whether the amplifier path is open. Under Linux use aplay / arecord, see 5.1. ==== 4.8 HDMI and Dual Display ==== The unit supports simultaneous output to the internal screen + HDMI, up to 3840 × 2160 on HDMI. **Set HDMI Output** - Connect an HDMI monitor and go to "Settings → Display → HDMI" - Select the resolution and refresh rate (1920 × 1080 @ 60Hz recommended) and confirm the image is stable with no flicker - Select the display mode: same display (mirror) or different display (extend) ^ Mode ^ Description ^ | Mirror (Clone) | The internal screen and HDMI show the same image, with the lower resolution of the two | | Extended (Expand) | The two screens show independent images; the app side must specify DisplayId | **View via Command Line** <code bash> adb shell wm size adb shell wm density adb shell dumpsys display | grep -i "mDisplayId" </code> **Note:** In the app, use interfaces such as display_setScreenRotation / display_setScreenBrightness to control the display (see 4.12.3). Under Linux use xrandr or weston.ini, see 5.6. ==== 4.9 Button and Indicator LED Test ==== ^ Item ^ Location ^ Phenomenon / Action ^ Verdict ^ | PWR Indicator LED | Left of the interface area | Solid green after DC 12V is connected | LED on indicates normal power supply | | SYS Indicator LED | Right of PWR | Solid blue after system boot completes | LED on indicates the system is running | | Recover | Pinhole right of the indicator LED | Hold with power off + release 2 seconds after power-on | RKDevTool detects the LOADER device | | Return | Right of Recover | Press to go back one level; hold and power on for 3s to enter flashing mode | UI returns / Enters Loader | **Return Button Test (getevent)** <code bash> adb shell getevent -l # /dev/input/event2: EV_KEY KEY_BACK DOWN # /dev/input/event2: EV_SYN SYN_REPORT 00000000 # /dev/input/event2: EV_KEY KEY_BACK UP </code> Pressing Return produces DOWN, releasing produces UP, indicating the button and driver are normal. **Return Button: Enter Flashing Mode** Hold the Return button, power on and release after 3 seconds to enter flashing mode, without using the Recover pinhole. **Recover Quick Self-Test** Hold the Recover pinhole with power off, then power on; a LOADER device appearing in RKDevTool indicates normal operation (see 3.3 for flashing steps). **Note:** Recover is a pinhole structure; use a needle with diameter ≤ 1.5mm to avoid damaging the internal tact switch. ==== 4.10 Touch Screen Test ==== The unit has a multi-touch capacitive touch screen; the controller connects to the system via USB. **View Touch Device** <code bash> adb shell getevent -pl /dev/input/event* adb shell dumpsys input | grep -i -A2 "touch" </code> **Line Drawing and Multi-Touch Detection** - In "Settings → Developer options → Pointer location", swipe a finger to see the X / Y coordinates and trace - Press and hold five fingers on the screen simultaneously and check whether multiple touch points are reported at the same time (multi-touch) - Tap once on each of the four corners and the center to confirm there is no offset and no dead zone (touch calibration data is written at the factory, so recalibration is generally unnecessary) **Note:** If touch does not respond, first confirm the touch USB cable is connected to the mainboard, then use adb shell lsusb to check whether the touch controller device exists. ==== 4.11 GPIO Usage ==== The unit's GPIO is **an optional breakout** (rear GPIO socket / internal pin header). For the odd/even pin orientation of the 16-pin terminal, system GPIO numbers and terminal mapping, see **2.3**; not repeated in this section. Android apps operate via the NodkaAPI gpio_ interface without shell (see 4.12.4): <code java> NodkaAPI api = NodkaAPI.nodkaAPICreate(context); api.gpio_export(95); // Export the pin api.gpio_direction(95, "out"); // Set as output api.gpio_write(95, 1); // Output high level int v = api.gpio_read(95); // Read back the level api.gpio_unExport(95); // Unexport the pin </code> **Note:** GPIO numbers are global kernel gpiochip numbers and may shift as a whole across firmware versions; run gpio_export first on unexported pins before operating. For Linux command-line (/sys/class/gpio) operations see 5.4. ==== 4.12 API Reference and Usage ==== For Android app development, hardware and system capabilities are wrapped as Java interfaces, so apps need not directly read/write /dev and /sys nodes. The Linux side does not provide this set of interfaces; use the command-line approach in Chapter 5. **Interface Source Package Download** {{wiki:androidapi1.5.zip|AndroidAPI 1.5 Interface Source Package (18.7 MB)}} The package contains AndroidAPI.jar, libandroid-jni.so, AndroidAPI-sources.jar, Javadoc documentation, the AndroidAPIDemo sample project and APK, the platform.jks signing file and readme.txt. Serial port, GPIO and system control interfaces require system signature or Root privileges. === 4.12.1 Usage Instructions === **Interface Categories** ^ Prefix ^ Category ^ Description ^ | devinfo_ | Hardware and system information query | System version, CPU, memory, storage, SN, etc. | | display_ | Display control | Brightness, rotation, resolution, navigation bar and status bar | | gpio_ | GPIO control | Export, direction, read/write level | | uart_ | Serial port control | Open, send/receive, close serial port | | sysctrl_ | System control | Scheduled power on/off, immediate reboot, silent install | **1. Create the instance in Application's onCreate** <code java> public class APIApplication extends Application { private NodkaAPI mNodkaAPI; @Override public void onCreate() { super.onCreate(); mNodkaAPI = NodkaAPI.nodkaAPICreate(this); } public NodkaAPI getNodkaAPI() { return mNodkaAPI; } } </code> **2. Retrieve it in an Activity or Fragment** <code java> private NodkaAPI mNodkaAPI = APIApplication.getApplication().getNodkaAPI(); </code> **Note:** Set android:name to APIApplication in AndroidManifest.xml; serial port, GPIO and system control interfaces require system signature or Root privileges. === 4.12.2 Hardware and System Information Query === ^ Method Name ^ Method Description ^ | devinfo_getAndroidVersion() | Get Android system version information | | devinfo_getAvailMem() | Get available memory capacity | | devinfo_getBuildNumber() | Get system build number information | | devinfo_getCpuCores() | Get CPU core count | | devinfo_getCPUCurFreqKHz() | Get current CPU frequency | | devinfo_getCPUMaxFreqKHz() | Get maximum CPU frequency | | devinfo_getCPUMinFreqKHz() | Get minimum CPU frequency | | devinfo_getCPUTemp() | Get CPU temperature | | devinfo_getDeviceModel() | Get device model information | | devinfo_getKernelVersion() | Get kernel version information | | devinfo_getSerialNum() | Get device SN | | devinfo_getStorageAvailableSize() | Get available local storage capacity | | devinfo_getStorageTotalSize() | Get local storage capacity (excluding system partition) | | devinfo_getTotalMem() | Get total memory capacity | === 4.12.3 Display Control (display_) === ^ Method Name ^ Method Description ^ | display_getNavBar() | Get whether the navigation bar and status bar are shown | | display_getScreenBrightness() | Get screen brightness | | display_getScreenRotation() | Get screen rotation direction | | display_getWindowHeight() | Get screen resolution height | | display_getWindowWidth() | Get screen resolution width | | display_setNavBar(Boolean enable) | Set whether to show the navigation bar and status bar | | display_setNavBarSlideShow(Boolean enable) | Set whether to show the navigation bar and status bar when sliding | | display_setScreenBrightness(int screenBrightness) | Set screen brightness | | display_setScreenRotation(int rotation) | Set screen rotation direction | === 4.12.4 GPIO Control (gpio_) === ^ Method Name ^ Method Description ^ | gpio_direction(int gpioNumber, String direction) | Set the direction of the specified GPIO (input / output) | | gpio_export(int gpioNumber) | Export the specified GPIO pin | | gpio_read(int gpioNumber) | Read the level of the specified GPIO | | gpio_unExport(int gpioNumber) | Unexport the specified GPIO pin | | gpio_write(int gpioNumber, int value) | Set the output level of the specified GPIO | See 4.11 for pin numbers. === 4.12.5 Serial Port Control (uart_) === ^ Method Name ^ Method Description ^ | uart_close(String uartNode) | Close the uart device, e.g. /dev/ttyS2 | | uart_getAvailableDevices() | Get available uart device nodes, returns List<String> | | uart_IsOpen(String uartNode) | Check whether the uart device is open | | uart_open(String uartNode, int baudrate) | Open the uart device and set the baud rate | | uart_receive(String uartNode, UartReceiveDataCallback callback) | Receive serial port data, returned via data callback | | uart_send(String uartNode, byte[] buffer) | Send serial port data | | uart_stopReceive(String uartNode) | Stop receiving data; no more callbacks after this call | See 4.5 for nodes and test methods. === 4.12.6 System Control (sysctrl_) === ^ Method Name ^ Method Description ^ | sysctrl_cancelReboot() | Cancel device reboot | | sysctrl_cancelShutdown() | Cancel scheduled shutdown | | sysctrl_powerOn(String time, boolean repeat) | Set the device power-on time | | sysctrl_reboot(String time, boolean repeat) | Set the device reboot time | | sysctrl_rebootNow() | Reboot the device immediately | | sysctrl_shutdown(String time, boolean repeat) | Set the device shutdown time | | sysctrl_shutdownNow() | Shut down immediately | | sysctrl_installApk(String apkPath) | Silently install an application | ==== 4.13 OTA Update (Android) ==== OTA update on Android is performed by the preinstalled **update** app; the unit must be connected to the Internet first. - Open the app list and find "update" - Tap "UPDATE NOW" and follow the prompts to download and install - Keep the power supply and network connected during the update; the unit reboots automatically when done The update icon in the app list: {{wiki:ota_app_drawer.jpg?560}} SmartInc OTA update interface: {{wiki:ota_updater.png?560}} **Note:** This section covers Android online OTA update; for Android USB drive offline update see 3.4, for Linux OTA update see 5.10. ===== 5 Linux System Usage ===== This chapter **applies only to Linux systems** (Ubuntu 20.04 / Debian 11, Buildroot for some projects). For the corresponding functions on Android, see Chapter 4. Except for **5.11 Cross-compilation** and **5.12.1 Docker Compilation**, which run on the **development host**, all commands in this chapter are executed in the on-board terminal or via SSH. The criteria for buttons, indicator LEDs and the touch screen are the same as in Chapter 4 (see 4.9, 4.10) and are not repeated here. Sections from 5.8 onward are system customization items commonly used for factory projects. ==== 5.1 Sound Card Usage ==== <code bash> aplay -l # List sound cards and devices aplay /nodka_test/LR_audio.wav -D hw:0,0 # Play via the specified sound card device arecord -d 5 -f cd -r 44100 -c 2 -t wav test.wav aplay test.wav </code> Volume adjustment: <code bash> alsamixer amixer -c 0 set 'Playback' 80% </code> **Note:** Unit playback outputs from the SPK terminal (PH2.0-4P); connect an external 8Ω speaker. MIC uses the Ø3.5 interface. ==== 5.2 Network Usage ==== === 5.2.1 Ethernet ==== **View network ports** <code bash> ifconfig -a ip link show </code> **Set a static IP via command line** 1. Open the network configuration file with vim: vim /etc/network/interfaces 2. Modify the IP, netmask and gateway according to the on-site network (the unit has a single network port, configure only eth0) <code bash> auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.2.110 netmask 255.255.255.0 gateway 192.168.2.1 </code> 3. Save and exit (press Esc in vim, type :wq), then reboot the system for the configuration to take effect. **Note:** On Ubuntu 20.04, NetworkManager manages the network by default, so the configuration in /etc/network/interfaces may not take effect; in this case use the nmcli method in 5.2.2, or disable NetworkManager first and then use the method in this section. **Set DNS** <code bash> vi /etc/resolv.conf nameserver 114.114.114.114 </code> **Network priority** <code bash> # Temporary change; the smaller the value, the higher the priority sudo ifmetric eth0 100 # Permanent modification sudo nmcli connection modify "Wired connection name" connection.autoconnect-priority 1 sudo nmcli connection modify "Wired connection name" ipv4.route-metric 100 sudo nmcli connection modify "Wired connection name" connection.autoconnect yes sudo systemctl restart NetworkManager </code> **Verification** <code bash> ping -c 4 192.168.2.1 ping -c 4 www.baidu.com </code> **Note:** In the graphical interface (Debian desktop), set the IP, netmask and gateway directly in "About NetworkManager Applet → Edit Connections…"; when no existing connection is available, click + in the bottom right to create one. === 5.2.2 WiFi ==== **Query and enable the wireless NIC** <code bash> ifconfig -a # Wireless NIC is usually wlan0 ifconfig wlan0 up # Enable the wireless NIC iw dev wlan0 scan # Scan for hotspots to get SSID, signal strength, and encryption method </code> **Connect to a wireless network** <code bash> nmcli d wifi connect "SSID" password "PASSWORD" </code> **Static IP** <code bash> sudo nmcli connection modify NODKA ipv4.addresses 172.10.21.111/24 # IP / subnet mask sudo nmcli connection modify NODKA ipv4.gateway 172.10.21.1 # Gateway sudo nmcli connection modify NODKA ipv4.dns "114.114.114.114,61.177.7.1,8.8.8.8" # DNS sudo nmcli connection modify NODKA ipv4.method manual # Static sudo nmcli device disconnect wlan0 sudo nmcli device connect wlan0 </code> **Dynamic IP (DHCP)** <code bash> sudo nmcli connection modify NODKA ipv4.method auto sudo nmcli connection modify NODKA ipv4.addresses "" # Clear the static IP sudo nmcli connection modify NODKA ipv4.gateway "" # Clear the gateway sudo nmcli connection modify NODKA ipv4.dns "" # Clear DNS (optional) sudo nmcli connection down NODKA sudo nmcli connection up NODKA </code> **Configure as an AP hotspot** <code bash> IFNAME="wlan0" # Wireless NIC node CON_NAME="One" # Hotspot name nmcli con add type wifi ifname $IFNAME con-name $CON_NAME autoconnect yes ssid $CON_NAME nmcli con modify $CON_NAME 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared nmcli con up $CON_NAME </code> **Note:** If the signal is weak, adjust the angle of the rear Wi-Fi/BT antenna or use a suction-cup antenna instead; after connecting, use ip addr show wlan0 to view the assigned address. ==== 5.3 Serial Port Usage (Linux) ==== On Linux, the serial port nodes are the same as on Android: RS485 is /dev/ttyS1, /dev/ttyS3, RS232 is /dev/ttyS2, /dev/ttyS4 (refer to the rear silkscreen label). **Test tools** - GUI: CuteCom (sudo apt install cutecom); select /dev/ttyS2, 115200, 8N1, then open - Command line: built-in com_send / com_recv <code bash> # Send com_send /dev/ttyS2 115200 # Receive (open another terminal) com_recv /dev/ttyS2 115200 </code> **Read/write nodes directly** <code bash> stty -F /dev/ttyS2 115200 cs8 -cstopb -parenb echo "hello" > /dev/ttyS2 # Send cat /dev/ttyS2 # Receive </code> **Test method** For loopback, peer-to-peer and adapter wiring, see **4.5.2**; these are OS-independent and are not repeated in this section. **Precautions** - The unit uses a 3.5mm 3P pluggable terminal (no DB9); use with crimp terminals or an adapter cable; reversing the wire order (A / B, R / T) will directly cause communication failure - RS485 is half-duplex; direction is switched automatically by hardware, so observe the frame interval when switching between transmit and receive - If permission is denied, add the current user to the dialout group: sudo usermod -aG dialout $USER (takes effect after re-login) ==== 5.4 GPIO Usage (sysfs) ==== On Linux, access is unified through /sys/class/gpio. For terminal pin assignment rules and system GPIO numbers, see **2.3**; this section only provides the operation commands. **1. Check whether the relevant IO is exported** <code bash> cd /sys/class/gpio ls </code> **2. Configure GPO (system configuration)** <code bash> for i in {95,94,21,22,140,141}; do echo out >gpio$i/direction; done for i in {13,14,96,93,108,107}; do echo out >gpio$i/direction; done </code> **3. Set GPO high / low** Output high level: <code bash> for i in {95,94,21,22,140,141}; do echo 1 >gpio$i/value; done for i in {13,14,96,93,108,107}; do echo 1 >gpio$i/value; done </code> Read back the current level: <code bash> for i in {95,94,21,22,140,141}; do cat /sys/class/gpio/gpio$i/value; done </code> Output low level: <code bash> for i in {95,94,21,22,140,141}; do echo 0 >gpio$i/value; done for i in {13,14,96,93,108,107}; do echo 0 >gpio$i/value; done </code> **4. Configure GPI (system configuration)** <code bash> for i in {13,14,96,93,108,107}; do echo in >gpio$i/direction; done </code> **5. Get GPI value** <code bash> for i in {13,14,96,93,108,107}; do cat /sys/class/gpio/gpio$i/value; done for i in {95,94,21,22,140,141,13,14,96,93,108,107}; do cat /sys/class/gpio/gpio$i/direction; done </code> **Note:** GPIO numbers are the kernel gpiochip global numbers and may be offset as a whole across firmware versions; if the corresponding node does not exist under /sys/class/gpio, first run echo NUMBER > /sys/class/gpio/export to export it, then proceed. ==== 5.5 USB and SD Card Mounting ==== **USB drive detection** <code bash> dmesg | tail -20 # After insertion, kernel messages show the device name sda / sda1 lsblk # List block devices and mount points </code> **Mount and unmount** <code bash> mkdir -p /mnt/USB1 mount /dev/sda1 /mnt/USB1 df -h umount /mnt/USB1 </code> **SD Card** <code bash> fdisk -l # SD card device name is usually /dev/mmcblk1p1 mount /dev/mmcblk1p1 /mnt/sdcard umount /mnt/sdcard </code> **Note:** ext4 / vfat can be mounted directly; NTFS requires ntfs-3g, exFAT requires exfat-fuse. For how to view on Android, see 4.6. ==== 5.6 Resolution and HDMI ==== The internal screen resolution is fixed by the model (see 1.3 Model and Configuration); HDMI external output can be adjusted with xrandr. **X11 desktop** <code bash> xrandr # List outputs and available modes xrandr --output HDMI-1 --mode 1920x1080 --rate 60 xrandr -o left # Rotate left 90° xrandr -o right # Rotate right 90° xrandr -o inverted # Flip 180° xrandr -o normal # Restore </code> **Temporarily add a custom resolution** <code bash> cvt 800 750 # 800x750 59.86 Hz (CVT) ... Modeline "800x750_60.00" 48.50 800 840 920 1040 750 753 763 779 -hsync +vsync xrandr --newmode "800x750_60.00" 48.50 800 840 920 1040 750 753 763 779 -hsync +vsync xrandr --addmode HDMI-1 800x750_60.00 xrandr --output HDMI-1 --mode 800x750_60.00 </code> **Wayland / Weston (when using a Wayland session)** Ubuntu 20.04 uses Xorg by default, so the xrandr method applies; if you switch to a Wayland session, xrandr is not supported under Wayland — edit /etc/xdg/weston/weston.ini: <code bash> [output] name=HDMI-A-1 mode=1920x1080 </code> Reboot the system or restart the weston service for the changes to take effect. **Dual display mode** For the definitions of the clone (mirror) and extended modes, see **4.8**. On Linux, use the desktop display settings or xrandr to control the on/off and position of the two outputs. ==== 5.7 Remote Access and File Transfer ==== <code bash> sudo apt update && sudo apt install -y openssh-server sudo systemctl enable --now ssh ip addr show </code> Transfer from a PC: <code bash> scp ./update.img root@192.168.8.55:/home/root/ </code> Graphical tools: WinSCP / FileZilla, protocol SFTP, port 22. ==== 5.8 Auto-run Programs at Boot ==== There are three methods by startup timing; choose as needed and they can be combined: **before login → at login → after entering the graphical interface**. Place the same program in only one of them. === 5.8.1 Execute Before Login === Suitable for background services that do not depend on the desktop and must run at boot. - Edit the /etc/rc.local file - Add the program call before exit 0 - Save and exit (press Esc, type :wq and press Enter) <code bash> sudo vim /etc/rc.local # Add before exit 0 /path/to/myprogram & exit 0 </code> **Note:** /path/to/myprogram is the full program path; the trailing & runs the program in the background, otherwise it blocks the subsequent login process. The last line of the file must be exit 0 for the script to be executed. **Note:** Ubuntu 20.04 does not enable /etc/rc.local by default; make sure rc-local.service is enabled. For systemd-only setups, use a custom service or the startup script in 5.8.3 instead. === 5.8.2 Execute After Login === Applies only to the current user and runs when user login completes. - Edit the user profile file ~/.profile - Append the startup command at the end of the file - Save and exit - Run source ~/.profile to apply the changes immediately <code bash> vim ~/.profile # Append at the end of the file /path/to/myprogram & source ~/.profile </code> **Note:** ~/.profile applies only to the current user; to apply to all users, use /etc/profile instead. === 5.8.3 Execute After Entering the Graphical Interface === Place here applications that need to display a UI only after the desktop is up (e.g. a full-screen main program). **Debian(LXDE)** - Edit the autostart file - Append the startup command at the end - Save and exit; reboot or re-login to take effect <code bash> vim /root/.config/lxsession/LXDE/autostart # Append at the end /path/to/myprogram > /dev/null 2>&1 & </code> **Ubuntu** On Ubuntu, this is handled uniformly by a startup script; write the command into /nodka_test/autorun.sh (this script runs automatically after the desktop starts). <code bash> sudo vim /nodka_test/autorun.sh # Append at the end /path/to/myprogram > /dev/null 2>&1 & </code> **Note:** > /dev/null 2>&1 discards program output to avoid filling the partition with logs; & ensures background execution. ==== 5.9 UI and Display Customization ==== === 5.9.1 Status Bar Customization === The LXDE panel (taskbar / menu bar) configuration is stored in: <code> $HOME/.config/lxpanel/LXDE/panels/panel </code> Open it with a text editor to add/remove plugins and adjust position and size; after editing, run lxpanelctl restart or log in again for the changes to take effect. === 5.9.2 Disable the Desktop Environment === Default contents of the desktop autostart file /root/.config/lxsession/LXDE/autostart: <code> @lxpanel --profile LXDE @pcmanfm --desktop --profile LXDE @xscreensaver -no-splash pulseaudio -D /nodka_test/autorun.sh </code> ^ Line ^ Function ^ | @lxpanel --profile LXDE | Start the LXDE panel (taskbar and menu) | | @pcmanfm --desktop --profile LXDE | Let PCManFM manage the desktop, handling wallpaper and icons | | @xscreensaver -no-splash | Screen saver | | pulseaudio -D | Start the audio service | | /nodka_test/autorun.sh | Autostart script executed after the desktop is up | To disable the desktop and show only the application UI, simply comment out the first three lines: <code> #@lxpanel --profile LXDE #@pcmanfm --desktop --profile LXDE #@xscreensaver -no-splash pulseaudio -D /nodka_test/autorun.sh </code> **Note:** After commenting out the panel and PCManFM, the desktop has no taskbar and no wallpaper icons, showing only the autostart program window; suitable for units shipped with a full-screen application. === 5.9.3 Replace the Boot LOGO === The boot LOGO is stored in the resource partition. Execute steps ① ~ ⑥ in order in the unit Linux terminal (root privileges required): for steps requiring commands, the description corresponds to the code block immediately following; see the table below for the file location in ④. **① Prepare the BMP image** Prepare a BMP image and set its size to the screen resolution (e.g. HDMI 1920×1080). **② Copy the bmpconvert tool and grant execute permission** {{wiki:bmpconvert.zip|Download the bmpconvert conversion tool (2.3 KB, unzip to get the script)}}, then unzip and copy to /usr/bin: <code bash> sudo cp bmpconvert /usr/bin/ sudo chmod +x /usr/bin/bmpconvert </code> **③ Mount the resource partition** <code bash> sudo mount /dev/block/by-name/resource /mnt </code> **④ Place the boot LOGO file** Place the BMP image into /mnt with the file name corresponding to the screen type: ^ Screen Type ^ File Location ^ | HDMI / eDP / LVDS | /mnt/logo.bmp、/mnt/logo_kernel.bmp | | MIPI | /mnt/logo_mipi.bmp、/mnt/logo_kernel_mipi.bmp | **⑤ Run bmpconvert conversion** For HDMI / eDP / LVDS screens, run: <code bash> sudo bmpconvert /mnt/logo.bmp sudo bmpconvert /mnt/logo_kernel.bmp </code> For MIPI screens, use the corresponding file name instead: <code bash> sudo bmpconvert /mnt/logo_mipi.bmp sudo bmpconvert /mnt/logo_kernel_mipi.bmp </code> **Error handling:** If step ⑤ produces the following output, the system only has python3 and lacks the python command: <code> root@rk3568: bmpconvert /mnt/logo.bmp /usr/bin/env: 'python': No such file or directory root@rk3568: bmpconvert /mnt/logo_kernel.bmp /usr/bin/env: 'python': No such file or directory </code> Create the python symlink first, then rerun the two commands in step ⑤: <code bash> sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.9 1 sudo bmpconvert /mnt/logo.bmp sudo bmpconvert /mnt/logo_kernel.bmp </code> **⑥ Reboot the system** <code bash> sudo reboot </code> **Note:** logo.bmp is displayed during the U-Boot stage and logo_kernel.bmp during the kernel boot stage; replace both. Back up the original files under /mnt before making changes. === 5.9.4 Switching Between Different LCD Displays === **HDMI**: Supported by default; default output 1920×1080, no configuration needed. **eDP / LVDS**: The display parameters must match the panel. Run dis in the terminal to open the display settings interface, select the matching parameters and click Save; reboot to apply. <code bash> dis </code> {{wiki:cm_lcd_sml.png?620}} Display Settings interface: Select parameters matching the panel and click Save. === 5.9.5 Screen Rotation === **Debian: Modify the xorg Configuration** - First use xrandr to check the screen node name (e.g. eDP-1, HDMI-1) - Edit /etc/X11/xorg.conf.d/20-modesetting.conf - Change the Option "Rotate" value and reboot <code> Section "Monitor" Identifier "eDP-1" # Screen node name, query with xrandr Option "Rotate" "inverted" # Rotation direction, see the table below EndSection </code> ^ Value ^ Rotation Angle ^ | normal | 0° (default) | | right | 90° clockwise | | inverted | 180° clockwise | | left | 270° clockwise | **Ubuntu: Use xrandr** <code bash> xrandr --output HDMI-1 --rotate left # Rotate left 90° xrandr --output HDMI-1 --rotate right # Rotate right 90° xrandr --output HDMI-1 --rotate inverted # Rotate 180° xrandr --output HDMI-1 --rotate normal # Restore default </code> **Note:** Add the rotation command to the end of /nodka_test/autorun.sh to apply it automatically at boot. **Touch Rotation** After screen rotation, touch coordinates will be misaligned; modify CalibrationMatrix in /usr/share/X11/xorg.conf.d/40-libinput.conf accordingly: <code> Section "InputClass" Identifier "libinput touchscreen catchall" Option "CalibrationMatrix" "-1 0 1 0 -1 1 0 0 1" MatchIsTouchscreen "on" MatchDevicePath "/dev/input/event*" Driver "libinput" EndSection </code> ^ Screen Orientation ^ CalibrationMatrix ^ | 0° (default) | 1 0 0 0 1 0 0 0 1 | | 90° (clockwise) | 0 1 0 -1 0 1 0 0 1 | | 180° (upside down) | -1 0 1 0 -1 1 0 0 1 | | 270° (90° counterclockwise) | 0 -1 1 1 0 0 0 0 1 | ==== 5.10 OTA Firmware Update ==== === 5.10.1 OTA over Network === The upgrade is performed by the on-board /usr/bin/ota script. Edit the script as needed, set the FTP address and account, place the corresponding firmware at the FTP download location, then run ota. The files to modify and the corresponding code are as follows. **① Edit the upgrade script /usr/bin/ota** <code bash> sudo vim /usr/bin/ota </code> **② Set the following three items in the script** <code> URL=ftp://<firmware server address> USERNAME=<username> PASSWORD=<password> </code> **③ Save and run the upgrade** <code bash> ota </code> Follow the prompts to complete the upgrade. **Note:** The server address, account and firmware directory are provided by us; do not power off during the upgrade; the device reboots automatically when complete. === 5.10.2 OTA Update via USB Drive === Under Linux, the on-board /usr/bin/ota script performs the OTA update, with the USB drive as temporary firmware storage. Follow steps ① ~ ⑤ in order: for steps requiring commands, the description corresponds one-to-one with the code block immediately following it; ③④ are condition checks and require no commands. **① Unmount the USB drive** <code bash> sudo umount /dev/sdb </code> **② Format the USB drive as ext4** <code bash> sudo mkfs.ext4 /dev/sdb </code> **③ Confirm the system supports OTA update** The board must already have the /usr/bin/ota script (see 5.10.1 for script configuration). **④ Confirm USB drive specifications** The USB drive must be formatted as linux ext4 with more than 8G of free space; otherwise the upgrade package cannot be written. **⑤ Plug in the network cable and USB drive, then run the upgrade** <code bash> ota </code> Follow the prompts to complete the upgrade; do not power off during the process; the device reboots automatically when complete. **Note:** /dev/sdb is a common device node for USB drives; the actual node depends on the lsblk output. This section describes the Linux OTA update (ext4, ≥8G, ota command); it is a separate process from the Android USB drive upgrade in 3.4 (FAT32, update.img) and the Android OTA update in 4.13; do not mix them. ==== 5.11 Cross-Compilation Environment ==== === 5.11.1 Install the Cross-Compilation Environment via apt ==== On a Debian / Ubuntu host, a single command installs the aarch64 cross toolchain; then confirm the version with -v: <code bash> sudo apt install -y crossbuild-essential-arm64 aarch64-linux-gnu-gcc -v </code> === 5.11.2 Download a Specific Toolchain Version ==== For a specific version, download the corresponding toolchain from ARM (developer.arm.com/downloads/-/gnu-a), extract it, then add the bin directory to PATH: <code bash> export PATH=$PATH:/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/ aarch64-none-linux-gnu-gcc --version </code> **Note:** Write it to ~/.bashrc or /etc/profile to make it permanent; replace the path with the actual extraction directory. === 5.11.3 Toolchain Downloads === Common cross-compilation toolchains and how to obtain them: * **aarch64-linux-gnu-gcc cross toolchain**: Provided in the SDK prebuilts directory * **arm-linux-gnueabihf cross toolchain**: For compiling 32-bit user-space programs * **x86 host arm64 cross-compilation toolchain**: Released by ARM, for compiling aarch64 (arm64) programs on an x86_64 host **Download:** [[https://pan.baidu.com/s/1OjJVuzDB3hFMgO6yS3EAZw|gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz]] Baidu Netdisk <html><span class="sml-code">Extraction code hkku</span></html> **Note:** This toolchain requires no installation; extract it and add the bin directory inside the archive to PATH; call aarch64-none-linux-gnu-gcc when compiling. ==== 5.12 Qt Application Development ==== Preinstalled environments: **Debian 11 → Qt 5.15.2**, **Ubuntu 20.04 → Qt 5.12.8**. Choose between the two methods as applicable. === 5.12.1 Import a Docker Image for Compilation === Use a ready-made build image; the host does not need Qt installed, isolation is good, and it suits batch compilation. - Import the image - Start the container and mount the application directory to /mnt (replace source with the actual path) - Inside the container, enter /mnt and run qmake and make <code bash> sudo docker load < nodka_docker_qt_build_20230223.tar sudo docker run --rm --mount type=bind,source=/home/APP_PATH,target=/mnt/ -i -t 09a37c1b2fc3 /bin/bash cd /mnt qmake make </code> **Note:** The image is large and is provided separately by us; the container ID (09a37c1b2fc3) follows the actual docker images output. === 5.12.2 Set Up the Qt Build Environment on the Board === **1. Install Qt Creator** <code bash> sudo apt-get install qtcreator sudo apt-get install qt5-default </code> If qt5-default has been removed from the official repository, use the following set of dependencies instead: <code bash> sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator </code> **2. Add qmake** Qt Creator → Tools → Options → Kits → Qt Versions → Add, select the on-board qmake: <code> /usr/local/qt5.12-arm/bin/qmake </code> {{wiki:qt_set_qmake.png?620}} Add the on-board qmake path in Qt Versions. **3. Configure the Cross-Compiler** In the same window, switch to Compilers → Add → GCC and add g++ and gcc respectively: <code> g++:/usr/bin/aarch64-linux-gnu-g++ gcc:/usr/bin/aarch64-linux-gnu-gcc </code> g++ compiler location: {{wiki:qt_set_compiler_gpp.png?620}} gcc compiler location: {{wiki:qt_set_compiler_gcc.png?620}} Add the cross-compiler; when the host has crossbuild-essential-arm64 installed, the compiler is under /usr/bin; with a third-party toolchain, enter its installation path. **4. Configure the Debugger (optional, for online debugging)** <code bash> sudo apt install -y gdb-multiarch </code> The board must have /usr/bin/gdbserver; if not, install gdbserver (included in Buildroot, no installation needed). Add /usr/bin/gdb-multiarch in Debuggers in Qt Creator. {{wiki:qt_set_debugger.png?620}} **5. Configure Devices** Enter the board IP and username root; set a static IP for the board to avoid disconnections during debugging. {{wiki:qt_set_device.png?620}} **6. Configure Kits** Combine the Qt version, compiler, debugger and device above into one Kit. When the target system is Ubuntu, also fill in the sysroot path in the Kit. {{wiki:qt_set_kits_std.png?620}} In Kits, combine the Qt version, compiler, debugger and device. ==== 5.13 Video Hardware Codec Support ==== The on-board VPU supports H.264 / H.265 hardware encoding and decoding; the system ships with GStreamer plugins and OpenGL ES / OpenCL runtime libraries. **GStreamer Encoding/Decoding** The system includes test scripts; run them directly to verify hardware decoding and encoding: <code bash> /rockchip-test/video/test_dec-gst.sh # Hardware decode test /rockchip-test/video/test_enc-gst.sh # Hardware encode test </code> **OpenGL ES** Use glmark2 to benchmark and verify the GPU: <code bash> glmark2-es2 </code> **WebGL** Open Chromium, enter the following address in the address bar, and check WebGL and hardware acceleration status: <code> chrome://gpu </code> **OpenCL** <code bash> clinfo </code> {{wiki:cm_clinfo.png?620}} clinfo output: confirm platform, device and OpenCL version information. ===== 6 General Methods ===== This chapter covers query commands, basically the same under Android (adb shell) and the Linux terminal; differences are noted in individual entries where applicable. ==== 6.1 Check CPU Temperature ==== <code bash> cat /sys/class/thermal/thermal_zone0/temp # Output is in millidegrees Celsius; 45200 means 45.2℃ </code> ==== 6.2 Check the CPU Serial Number ==== <code bash> cat /proc/device-tree/serial-number # On Android getprop ro.serialno </code> ==== 6.3 Check CPU Frequency ==== <code bash> cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies </code> ==== 6.4 Check Memory Capacity ==== <code bash> free -h cat /proc/meminfo | head -3 </code> ==== 6.5 Check Storage Capacity ==== <code bash> df -h lsblk </code> ==== 6.6 Network Ping Test ==== <code bash> ping -c 4 192.168.8.1 ping -c 4 www.baidu.com ping -c 1 -W 1 8.8.8.8 </code> ==== 6.7 Set System Time and Save to the RTC Chip ==== <code bash> # Check the system time date # Set the system time and write it to the RTC chip sudo date -s "2025-04-08 17:01:01" sudo hwclock -w sudo hwclock -r </code> **Verification**: Power off and disconnect power for more than 5 seconds, then power on and use date to check whether the time is retained. **Note:** Network time synchronization is enabled by default; perform the RTC test with the external network disconnected. **Time Zone Settings** <code bash> ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime reboot </code> In the GUI, select the time zone under "Preferences → Time and Date"; to set another time zone, replace Asia/Shanghai in the command with the corresponding city. ===== 7 Appendix ===== ==== 7.1 FAQ Troubleshooting ==== ^ Symptom ^ Possible Cause ^ Solution ^ | The flashing tool keeps showing "No device found" | Not in Loader mode / USB driver error / cable issue | Re-enter following step ④ in 3.3; uninstall and reinstall the driver; change the USB port and data cable | | Unknown device appears in Device Manager | Rockchip USB driver not installed properly | See 3.2; reinstall DriverInstall | | ADB cannot connect | USB debugging not enabled / wrong USB port | See 4.1; confirm connection to the blue USB3.0/OTG lower port | | Serial port cannot open or no data | Wrong node / no permission / A-B or R-T reversed | See 4.5, 5.3; check the node and wiring against the silkscreen label | | GPIO read/write no response | Not exported / numbering offset varies with firmware | See 2.3, 5.4; export first, then operate | | Touch not responding or coordinates misaligned | Loose touch USB cable / CalibrationMatrix not updated after rotation | See 4.10, 5.9.5 | | After screen rotation the UI is normal but touch is reversed | libinput calibration matrix not updated | See the touch rotation table in 5.9.5 | | Boot LOGO not applied | Only one of the images replaced / bmpconvert not run | See 5.9.3; replace and convert both logo images | | Static IP configuration not effective | NetworkManager and ifupdown coexist | See the note in 5.2.1 | | No prompt during USB drive upgrade | File name is not update.img / format is not FAT32 | See 3.4.1; rename and reformat as FAT32 | ==== 7.2 Document Information and Revision History ==== ^ Item ^ Content ^ | Applicable Products | sTPC-E101 / E121 / E150 / E156 / E170 / E215-3568B | | Main Control Platform | Rockchip RK3568 (4 × Cortex-A55 @2.0GHz, 1TOPS NPU) | | Applicable Systems | Android 11, Ubuntu 20.04 (Debian 11 per project configuration) | | Document Version | v1.4 | | Update Date | 2026-11-11 | ^ Version ^ Date ^ Revision Details ^ | v1.4 | 2026-11-11 | Aligned wording throughout: unified serial port count and silkscreen labels, power supply range, system range and interface/port count conventions; removed duplicates in GPIO and OTA; added SD card / GPIO / codec specifications; added 4.13 and the Chapter 7 appendix | For previous versions, contact Technical Support. ==== 7.3 Technical Support ==== * Firmware, flashing tools, SDK and specifications: contact Sales or Technical Support * When reporting an issue, provide: unit SN (see 6.2 for how to view it), system version, reproduction steps and screenshots * If an exception occurs after modifying the system yourself, reflash the factory firmware first (see 3.3) before deciding whether it is a hardware issue <html><script> (function(){ /* 标题英译后 DokuWiki 生成的锚点 id 变化,按编号把目录重新绑定到真实标题 */ function bind(){ var links=[].slice.call(document.querySelectorAll('#smltoc ul.toclist a')); if(!links.length) return; var heads=[].slice.call(document.querySelectorAll('#bodyContent h2,#bodyContent h3,#bodyContent h4,#bodyContent h5')); function num(s){var m=(s||'').match(/^\s*(\d+(?:\.\d+)*)/);return m?m[1]:'';} function norm(s){return (s||'').replace(/^\s*[\d.]+\s*/,'').replace(/[^a-z0-9]/gi,'').toLowerCase();} for(var i=0;i<links.length;i++){ var a=links[i], n=num(a.textContent), h=null; for(var j=0;j<heads.length;j++){ if(n && num(heads[j].textContent)===n){h=heads[j];break;} } if(!h){ var t=norm(a.textContent); for(var k=0;k<heads.length;k++){ if(norm(heads[k].textContent)===t){h=heads[k];break;} } } if(h&&h.id) a.setAttribute('href','#'+h.id); } } if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',function(){setTimeout(bind,120);}); else setTimeout(bind,120); })(); </script></html> <html><style> #pt-lang{padding:0 10px 0 6px;white-space:nowrap;line-height:1.2;} #pt-lang label{font-size:11px;color:#54595d;margin-right:5px;vertical-align:middle;} #sml-lang{font-size:11px;padding:2px 4px;border:1px solid #c8ccd1;border-radius:3px;background:#fff;color:#202122;vertical-align:middle;cursor:pointer;max-width:112px;} #sml-lang:focus{outline:2px solid #36c;outline-offset:1px;} </style></html> <html><script> (function(){ /* 中英页面配对表:新增产品时在两处(中文页ID / 英文页ID)各加一行,四份脚本保持一致 */ var PAIR={ '首页':'en:home', 'arm触控一体机:stpc-sxxx-3568b系列':'en:stpc-exxx-3568b' }; var UI={ '更新个人信息':'Preferences','个人设置':'Preferences','我的讨论':'My talk', '显示源文件':'Show source','创建该页面':'Create this page', '该主题尚不存在':'This topic does not yet exist', '您访问的页面并不存在。':'This page does not exist yet.', '用于Dokuwiki的vector主题':'Vector template for DokuWiki', '可打印版本':'Printable version','打印/导出':'Print / export', '最近更改':'Recent changes','媒体管理器':'Media manager', '网站地图':'Sitemap','永久链接':'Permanent link','引用此文':'Cite this page', '搜索这个文本':'Search this text','您的足迹:':'You are here:', '最后更改:':'Last modified:','修订记录':'History', '登录':'Log in','登出':'Log out','退出':'Log out','管理':'Admin', '文章':'Page','讨论':'Discussion','阅读':'Read','编辑':'Edit', '导航':'Navigation','首页':'Home','帮助':'Help','联系我们':'Contact us', '工具':'Tools','搜索':'Search',' 由 ':' by ' }; var TITLE={'en:home':'Home','en:stpc-exxx-3568b':'sTPC-EXXX-3568B Series'}; var CUR=(window.JSINFO&&JSINFO.id)||''; var ZH='',EN='',HERE=''; for(var k in PAIR){ if(CUR===k){ZH=k;EN=PAIR[k];HERE='zh';break;} if(CUR===PAIR[k]){ZH=k;EN=CUR;HERE='en';break;} } if(!HERE) return; function pref(){try{return localStorage.getItem('sml_lang')||'zh';}catch(e){return 'zh';}} function setPref(v){try{localStorage.setItem('sml_lang',v);}catch(e){}} function url(id){return '/dokuwiki/doku.php?id='+encodeURIComponent(id);} /* 记住语言:仅把「选过 English 的访客」从中文页导向英文页;直接访问英文页不回跳 */ (function(){ if(HERE!=='zh'||pref()!=='en') return; if(location.search.indexOf('sml=1')>-1) return; location.replace(url(EN)+'&sml=1'); })(); function translate(root){ var keys=Object.keys(UI).sort(function(a,b){return b.length-a.length;}); var w=document.createTreeWalker(root,NodeFilter.SHOW_TEXT,null,false),n,buf=[]; while(n=w.nextNode()){ if(!n.nodeValue||!n.nodeValue.trim()) continue; var p=n.parentNode; if(p&&(p.nodeName==='SCRIPT'||p.nodeName==='STYLE'||p.nodeName==='OPTION')) continue; buf.push(n); } for(var i=0;i<buf.length;i++){ var v=buf[i].nodeValue,o=v; for(var j=0;j<keys.length;j++) v=v.split(keys[j]).join(UI[keys[j]]); if(v!==o) buf[i].nodeValue=v; } var els=root.querySelectorAll('[title],[alt],[placeholder]'),attrs=['title','alt','placeholder']; for(var e=0;e<els.length;e++){ for(var a=0;a<attrs.length;a++){ var val=els[e].getAttribute(attrs[a]); if(!val) continue; var nv=val; for(var j2=0;j2<keys.length;j2++) nv=nv.split(keys[j2]).join(UI[keys[j2]]); if(nv!==val) els[e].setAttribute(attrs[a],nv); } } } function boot(){ /* 旧英文入口 Main_En 已停用:从左侧导航移除本项及其换行 */ (function(){ var box=document.getElementById('p-navigation'); if(!box) return; var as=box.getElementsByTagName('a'); for(var i=as.length-1;i>=0;i--){ var a=as[i], h=a.getAttribute('href')||''; if(!/main_en/i.test(h) && a.textContent.trim()!=='Main_En') continue; var p=a.parentNode; if(!p) continue; var n=a.nextSibling; while(n && n.nodeType===3 && !String(n.nodeValue).trim()){var t=n;n=n.nextSibling;p.removeChild(t);} if(n && n.nodeName==='BR') p.removeChild(n); p.removeChild(a); } })(); if(HERE==='en'||pref()==='en'){ var sels=['#head','#panel','.catlinks','#footer']; for(var i=0;i<sels.length;i++){ var el=document.querySelector(sels[i]); if(el) translate(el); } var th=document.querySelector('#dw__toc h3'); if(th){ var w=document.createTreeWalker(th,NodeFilter.SHOW_TEXT,null,false),n; while(n=w.nextNode()) n.nodeValue=n.nodeValue.split('目录').join('Contents'); } document.documentElement.setAttribute('lang','en'); document.documentElement.setAttribute('xml:lang','en'); if(TITLE[CUR]) document.title=document.title.replace(CUR,TITLE[CUR]); } var ul=document.querySelector('#p-personal > ul'); if(!ul||document.getElementById('pt-lang')) return; var li=document.createElement('li'); li.id='pt-lang'; var lab=document.createElement('label'); lab.htmlFor='sml-lang'; lab.textContent=(HERE==='en'||pref()==='en')?'Language':'语言'; var sel=document.createElement('select'); sel.id='sml-lang'; sel.setAttribute('aria-label',(HERE==='en'||pref()==='en')?'Language':'语言'); var o1=document.createElement('option'); o1.value='zh'; o1.textContent='简体中文'; var o2=document.createElement('option'); o2.value='en'; o2.textContent='English'; sel.appendChild(o1); sel.appendChild(o2); sel.value=(HERE==='en')?'en':pref(); li.appendChild(lab); li.appendChild(sel); ul.appendChild(li); sel.addEventListener('change',function(){ var v=this.value; setPref(v); var t=(v==='en')?EN:ZH; if(t&&t!==CUR) location.href=url(t); else location.reload(); }); } if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',boot); else boot(); })(); </script></html>
您的足迹:
•
sidebar
•
stpc-exxx-3568b
•
首页
登录
文章
讨论
阅读
显示源文件
修订记录
搜索
导航
首页
Main_En
帮助
联系我们
打印/导出
可打印版本
工具
最近更改
媒体管理器
网站地图
永久链接
引用此文