<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://blog.17lai.site</id>
    <title>夜法之书 • Posts by &#34;embeded&#34; category</title>
    <link href="https://blog.17lai.site" />
    <updated>2022-03-24T13:13:38.000Z</updated>
    <category term="github" />
    <category term="jekyll" />
    <category term="blog" />
    <category term="gitlab" />
    <category term="git" />
    <category term="crack" />
    <category term="linux" />
    <category term="hardlink" />
    <category term="bt" />
    <category term="pt" />
    <category term="markdown" />
    <category term="picgo" />
    <category term="wiz" />
    <category term="joplin" />
    <category term="typora" />
    <category term="qnap" />
    <category term="硬盘" />
    <category term="nas" />
    <category term="embeded" />
    <category term="hisilicon" />
    <category term="driver" />
    <category term="3798m" />
    <category term="mpp" />
    <category term="unf" />
    <category term="kernel" />
    <category term="3G" />
    <category term="4G" />
    <category term="3531a" />
    <category term="移植" />
    <category term="嵌入式" />
    <category term="宝塔" />
    <category term="vps" />
    <category term="建站" />
    <category term="nginx" />
    <category term="apache" />
    <category term="mysql" />
    <category term="qbittorrent" />
    <category term="ssd" />
    <category term="hdd" />
    <category term="docker" />
    <category term="registry" />
    <category term="教程" />
    <category term="email" />
    <category term="https" />
    <category term="ssl" />
    <category term="lamp" />
    <category term="php" />
    <category term="tomcat" />
    <category term="transmission" />
    <category term="启动" />
    <category term="pdca" />
    <category term="5w2h" />
    <category term="smart" />
    <category term="swot" />
    <category term="grow" />
    <category term="okr" />
    <category term="wbs" />
    <category term="debian" />
    <category term="laptop" />
    <category term="ed2k" />
    <category term="ati" />
    <category term="tls" />
    <category term="隐私" />
    <category term="安全" />
    <category term="优化" />
    <category term="gitbook" />
    <category term="emby" />
    <category term="sonarr" />
    <category term="jeckett" />
    <category term="portainer" />
    <category term="mariadb" />
    <category term="note" />
    <category term="webdav" />
    <category term="mermaid" />
    <category term="web" />
    <category term="http" />
    <category term="css" />
    <category term="js" />
    <category term="3a" />
    <category term="ae" />
    <category term="image" />
    <category term="ai" />
    <category term="face" />
    <category term="hexo" />
    <category term="matery" />
    <category term="npm" />
    <category term="ccs" />
    <category term="vim" />
    <category term="ide" />
    <category term="thinkpad" />
    <category term="sound" />
    <category term="speaker" />
    <category term="music" />
    <category term="韩红" />
    <category term="刮削" />
    <category term="musicbrainz" />
    <category term="mp3tag" />
    <category term="cmake" />
    <category term="develop" />
    <category term="tmm" />
    <category term="字幕" />
    <category term="plex" />
    <category term="ipv6" />
    <category term="traefik" />
    <category term="proxy" />
    <category term="swarm" />
    <category term="ubuntu" />
    <category term="vscode" />
    <category term="插件" />
    <category term="编码" />
    <category term="earthly" />
    <category term="mstream" />
    <category term="selfhost" />
    <category term="node" />
    <category term="jenkins" />
    <category term="ci/cd" />
    <category term="中岛美嘉" />
    <category term="tools" />
    <category term="winrar" />
    <category term="emoji" />
    <category term="shell" />
    <category term="isp" />
    <category term="awb" />
    <category term="mywork" />
    <category term="plantuml" />
    <category term="mathjax" />
    <category term="cdn" />
    <category term="seo" />
    <category term="devops" />
    <category term="k8s" />
    <category term="harbor" />
    <category term="fitness" />
    <category term="健身" />
    <category term="运动" />
    <category term="drowio" />
    <category term="man" />
    <category term="框架" />
    <category term="图解" />
    <category term="doxygen" />
    <category term="中医" />
    <category term="西医" />
    <category term="文化历史" />
    <category term="管理" />
    <category term="竞品分析" />
    <category term="社会观察" />
    <category term="知识" />
    <category term="智慧" />
    <category term="rss" />
    <category term="rsshub" />
    <category term="bash" />
    <category term="os" />
    <category term="自制" />
    <category term="驱动" />
    <category term="sensor" />
    <category term="nodeppt" />
    <category term="pmbok" />
    <category term="ipd" />
    <category term="绩效" />
    <category term="写作" />
    <category term="vercel" />
    <category term="编译器" />
    <category term="C" />
    <category term="compiler" />
    <category term="故事" />
    <category term="概率" />
    <category term="普朗克" />
    <category term="action" />
    <category term="workflow" />
    <category term="potplayer" />
    <category term="yandex" />
    <category term="source" />
    <category term="hack" />
    <category term="download" />
    <category term="chatgpt" />
    <category term="openai" />
    <category term="不可能三角" />
    <category term="waline" />
    <category term="calibre" />
    <category term="douban" />
    <category term="book" />
    <category term="IPD" />
    <category term="MM方法论" />
    <category term="端到端" />
    <category term="投资" />
    <category term="理财" />
    <category term="金融" />
    <category term="信用卡" />
    <category term="search" />
    <category term="定制服务器" />
    <category term="开源" />
    <category term="echarts" />
    <category term="读书评鉴" />
    <category term="穿越必备" />
    <category term="易学" />
    <category term="google" />
    <category term="高考" />
    <category term="专业" />
    <category term="profile" />
    <category term="tampermonkey" />
    <category term="zhihu" />
    <category term="csdn" />
    <category term="juejin" />
    <category term="webhook" />
    <category term="office" />
    <category term="kms" />
    <category term="破解" />
    <category term="刀郎" />
    <category term="密码" />
    <category term="bitwarden" />
    <category term="人性" />
    <category term="人格分析" />
    <category term="umami" />
    <category term="健康" />
    <category term="恢复" />
    <category term="养生" />
    <category term="windows" />
    <category term="垃圾清理" />
    <category term="速度优化" />
    <category term="热水器" />
    <category term="维护" />
    <category term="汽车" />
    <category term="阳历" />
    <category term="阴历" />
    <category term="阴阳和历" />
    <category term="天干" />
    <category term="地支" />
    <category term="测速" />
    <category term="nat" />
    <category term="光猫" />
    <category term="study" />
    <category term="english" />
    <category term="雅思" />
    <category term="zlibrary" />
    <category term="sql" />
    <category term="ipfs" />
    <category term="postgresql" />
    <category term="sqlite" />
    <category term="dns" />
    <category term="smartdns" />
    <category term="dnsmasq" />
    <category term="高薪" />
    <category term="物理" />
    <category term="侠义相对论" />
    <category term="科学" />
    <category term="广义相对论" />
    <category term="功能测试" />
    <category term="tag" />
    <category term="llm" />
    <category term="api" />
    <category term="免费" />
    <category term="ollama" />
    <category term="codex" />
    <category term="electron" />
    <category term="传媒" />
    <category term="layout" />
    <category term="interaction" />
    <category term="自动化测试" />
    <entry>
        <id>https://blog.17lai.site/posts/798e6e62/</id>
        <title>ISP 数字图像处理 算法概述、工作原理、架构、处理流程</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/798e6e62/"/>
        <content type="html">
&lt;div id=&#34;hexo-blog-encrypt&#34; data-hbe-format=&#34;4&#34;
     data-salt=&#34;56b6d134b2f75d2aab9588d3a174421bc2179d2d5d78e5a53690cb099282bd90&#34; data-nonce=&#34;1e61843ea20e04de61ed1490&#34;
     data-kdf-iterations=&#34;250000&#34; data-auto-save=&#34;true&#34;
     data-storage-key=&#34;&#34;
     data-wpm=&#34;抱歉, 这个密码看着不太对, 请再试试.&#34;
     class=&#34;hbe&#34;&gt;
  &lt;div class=&#34;hbe-container&#34;&gt;
    &lt;div class=&#34;hbe-message&#34;&gt;您好, 这里需要密码.&lt;/div&gt;
    &lt;form id=&#34;hbeForm&#34; class=&#34;hbe-form&#34;&gt;
      &lt;input id=&#34;hbePass&#34; type=&#34;password&#34; class=&#34;hbe-input&#34;
             placeholder=&#34;输入密码&#34; autocomplete=&#34;off&#34; aria-label=&#34;输入密码&#34;/&gt;
      &lt;button type=&#34;submit&#34; class=&#34;hbe-button&#34;&gt;解密&lt;/button&gt;
    &lt;/form&gt;
  &lt;/div&gt;
  &lt;script id=&#34;hbeData&#34; type=&#34;text/plain&#34;&gt;b2d5b9bcad3372ffb0712e02f9c20732c912b8da57140eb240a251727e8fc968de7fdbc45f5e8e6d672a895d74416a94cafc17ba760ace708218d8e9d197b1a998b9727a3fe38464ee285ea40abd2acd8b552387286b624cb4091ac5acd64d0118b661b927e2b1adaf01c2a72421e6f53b1ca5e8813d98ae02fd3496d96a8d659004bcb14b70b17428fb597422d3369ed5ce2f1bdac3d6635920dfcfd949601f93c8f7cd124a263459aaa39332c893ad792402a738feeed4d2c6307cd6a9862bcd2e4e2037d59fef000086a39d37532f38f7f2d26c06d412602e2cfee9325ee3032b7ca7287bc593e57f053a5f29515cb01390f5a25dc4081589ce95313280cfde536b9e56065e7e5c74ea57bbea1b8145fc6c110baef3c73614b84c050e7fe26d3b0185a64983b0c354586c19657aac40065daf75be492e5d86305ac542ef8beef089352fac8caebb5b2cb3b18ccadc8612f1b8f819bce643e72fcf5591ba43739388ca4c71440febe5c51c3afea3f6a1e87959a721d959f041ea5e03e560587d18d6a221a69347ac3c97fc04dda7d1b782d15dce5b25dad1751a06109514396df5c2efa1ca881a19440c99e145f2f729515499aaf95b338ae5df2bb269e299ea833110b6ede9b5a05bd78642cbcf9c9c3be9425283897dd64f6f7a560fb5f8da6dc78c3131220a0a470f066f7b1f579e7d1a70bd93cf90556a7614b5056d90768a9b5a0fdfa1cbba0626d3d71b09b93ef8ce1da96538d46e4bbfb37b6a0518ab8ea6563d82996c21f8f6df2b169b4719987dd98538f22e6f77a7d4ec4a40eb6e21c070705f7c8634b310b2899830017697e3d4c320845262ab6af5d2f54e9321a399e7fb8968e2a025902ed10a9371f5003af5c0f0c0f6e7922eb226fbeca90daa7ae59ca7a4099f18edcc7e8da1287968e2eb45925172d8722d96fab39034c88ccfebc45bc1d5dc4a0d7a6bb44abfb8bd4a115ddc58d8221fa654adbfc0a49b4586980a4ba3db416e98a049a20320b95084dbe9260d9043466c0b7b7ff6bd415187e760802a1a4a5369350dd16602be35f064252040caa2f7530ee8a1e2ffb85a15faa136a87830a4560e73cd2b858b7b51b93b8178deb5c0f754b4195cef11d48165ade68d0434238a59fbff0ed1670fd8851c8dfc9f315b5337e585269efab3e674b76d6951ae6ca80bdc0e2f0aff8d566c89acf14fc8bdf5fa9023029c0242e6ca0156d7099ab02e4e51f201d86391fdca5849ff64a1dc6c25619867a851689a6b0ed740c74e30fa05d834391b9329cbe41c5d7f4eadd1f2329f9db09767da596750feb31da249e0b64c985df0f3fbc43324e942825d032b9777d9151f5d973f289a3f1261fcd258ced330b3c2e59c4efa767670078b93803ac7c00ed998887944f5a6e26419a47d8852d17879f007b99c5b62a9188d63fab718e542e91a73a31b3dfb17b13c73442827f3b1577d13d9943b4eb01fd6d70051f07fda741337339b3c5373b992bb21d31695dd99f191c8fb33070da3a0729f2991e23b9fbfc5569dfc01ef408ff141673a11cb0961989e8e001154c2ca98fc7b755d76fd73cf4c078a7cea77606640535081e91ca653ecb3eeabdf584c737e2d4a3d9dedfa9fbf5dd9e977efb63c0b15c5a9c004de81552f41ae5ec06cb6f1afe820f00dfe58a869ac1ed33e1afcfed044368c3c509c8e6cdff4a4faca9e3fb7ad7aa338e01b76e82a7f220d0d9480c3e8421b6fe3e2213494b4f2e1be711dad752f02dadedb2e9997fdabb4ffcced3a093810c9133796f00fef733bff73ba095602b9a96729a0ac987cab89b3e1219ea7795da734a8097100db32de09f21bc45fb5036fe24cc03b1aa6814547934e667685f3dd81143689e8d32730399aa9162b5fbe2f635f8978c537cc680534ca4680229169035ed5f862ec73eb27442031d6c48de73b46a295d831d5ae03c4afb1c94370f971ac7fa99cb4fd5a8a996968834e81601f408c24ec09f6240e05e40ae984d1f16ab77bda0c5c2dcb98c5dfe79c2d37aa081b0cac9e2a4b2bd412c273181ee0e28a4a57e9e9dbf68cbf37dd0538917c98d4e3f2558f2dd227a2b43f20fe0c0980bae7b5881d041bd48c936bd0e8b670e48ae2381a6d0361418b291ae74edd71a17818d81afbf3c8777087e077a8145ee3d96bd75d1eaec3ffe52abd387573b2dca485a3d3e5decd15ccbd057133341d7cc44a65c70b3eb800ea5d5f168e366dde554b3c24dea531e0013e64ea293850d25ddbe3b74c961f599111dc8cd706568b8f5480a2a6af24e71bed6308d5cd95045aeb604df66f3be40b28502e2823db1f38111764b3eae9d547012da007ededcdd996f8f89406b45a0af05cc05874e13ba46f845e2cd3b16f27ff64f577331c17ec2ce33d6716c53ff78abafdbae251788f223270124ee5837ca12df8a1b8a463af7fefd97b732d62f48538e809d4dcbc2df6e007c7ab51720dc6e4aa5116d98e59b38b83eb711c316a03049aa645ac541255cfed8d41fc9117949c7a5681fb139c3267b2d0bf4390b77138bfc3990cb84245b20a580c37922716efdf3508347d690af6dd8012b41e7f307a8d89cc26bd7f6b00be878af0db34013a5603b868befd62a1bb0db240757d612550ae41d22340fa9dc31238b823d7e63a3aad1e092f70c596f0ea342d8f9cea56fced2a2ec2c691bbeb82ec59943b577689b63bd488e9937928e075ae5105f1c40aae58374a80d77aad6a2ed27a7f623ce43930d46db2af1ffe4fc1d734d387b22e71f2747ff89ad69cec0e159599fbc3b0524cf2936879156ef8e93c4f678181f135f7984361030f700915f2ef2efaecea46ac900084f362b203d3ad034255da24581d126e1b84a0383a11d0c7c94cfb17da22e82f9c7081285257eba3520692e240166e358bcb65c1264e408e2f3b21d38135c5b1b5acf4ff76e0e940bbab1e58f2f4128ba452f2d4fb5b176bde2031d35cd7172d520fad9628fec807913eb0b226b408f0edf3a2492471157436820d0281cf327c1c20a6fe94bc299fd3ec9d39d1ac45a73ce6c702be044afb6e8ac4acbe35b9914fd93400a0b7f87a9a272918e84a96977781040c793be5a1dfc7999466aee02446f1c93ab95f2e40299319257ec3550e4d3b34fbf5312b734ccb2abbecd6ce0908f5e85431f1da61175a55a2e1f04842f72b9af67a12657a1831e3735c2c22739a777f8afee26eff8c6f013d1881c33eb0680bd72084fdc6cae6dd48e11217f4c0b21f7672e608ea651960f8d76d8a8bc42a6a0bd3d07daf1a08d990d0224c78cf3cde4713830f30faf75ef5411d25f29912c12cfee8d194848212bda9e7b3c3055469b16edd97c18f677b5ab31d8f8f7a54f2aeee90acdd74e2de76fff66b0c118d4b7ebb4ef3e0ff8d9111260d0c821e50ebb043affd1783917337c161cf0a77930ede929ca506b0c35df602661719816677e05549e6d811d97bc966a993229c563952df9fb961b1e341dfce3a0720525227e5d5f6e592f7afc5e5554a3ab8568127506f1be4137b97b7bed0b3fec00072c7dcebb0d59d4461391ec9e5da83d8cd629106637fd37b08ae1dfb1d4690117a4ddc9329c9802666033f57c22f4de0105734e8d3fb014b96da9a7d9a6d32a84b0523289100494b0bfd5f779393a25a9b5815ffe93f56085a3e38b7e3254426a9cbb4faa16e4259e752f32911e2817d37f97f73a194f75d623f4075ca38ec2796d9ce5dc432d69ce5bec52c345fd6c40c262555f7ceb3b367234fe37c11944e1d3ee817cc9e7e02ad3679561649a9e0ed3ee72e6e99bd142f80999860c35ffd43d8d973f730e2d0fb6233f1de02189594ca0b5726b7757088d374ed7913c08a03bfc6b4bba40bacd6974bb3b980bae3a35f903395f822c0467c0756c6b9c8ac7f29deee6906cc707662fcf0f94afed4a9407f29e2730cc3f6e3831b358178cccf0ee64524d7a1eb9c1ef918cf1cc7506e616462698e364ecf96c641dae597325e93e39895defd36ab7a164d34c6e3ec9da031e14437614cd5ba31aff61f4c27902571c0650ee1ef0a5fa5957634fdc55013d8699c978de285ea7a792a70a0fc5faf761abc42cb34ea2e575a2231c56e450dd9785b910cc5badc00a4ff5d8b57df64ac467aea4a40e0873ccac24fb1d01cd86d8f014179a64e38f725ab8115bf20ebee653d11a532c06e6dd91f20a3ad55b2f3126f7ad7964b9192d8c073b70db393746cb1c36a934522de2ff17ae706616157b06e9f226c72f13cb3f58ccb22a72e728b718a9a701ed9f7df56e72d7f6474de79786edfb2a4431f5cc6e79cd73ec3a1718cbf80b40885729bc2e69674cef52675515cd7795b02820217f619166c2fa9ca47e244c5f460f7ec18dd65c4812eb633f2e11ff5739cfe3b01782c184863f1ba72f29997f300e1c260a21ff5235cf958ebcc95026cf64ef4cf91c0858d88e1ccc7362916800e73b196527bfb718fa943192c2ea8638339264f5a7f496246b011ff8b343dd5b2ad4456f07194de74de4491e9c4dab1501dc81cd877a9b3387698d1a89f42b060f572e95434a7cd4cccb030939872d775dba6664b3202b873bd133cf7abe8c34300434d0c0d1275d1d6928e678015e8f18f0a1be192c9546616bf20bd1ebe62d417f374f0b50a5d1bcab71ed8cdeb1de8f59233b1371c7dd6a7318cf217907637a8e6f48d6138301c650658cbc4454346837818b5582d31b4b4e6827dc674194d6524844e5552512fcd537fb13d3f3754f512a26aa563640345a82d3fe85a69910d2827511d32c317dfa9fa609df08a227a9ca1d463924294747fa774cd02be0b97c66736c9d400753e3d89fb17e1ddad116fdb3ea1d4d365d3c994019f197d6c9e1c997a79573ed1b2de44d604cd61cbb429eaa6adb721e437551943c76b811046f321c57b00367221709d873d45b69a34a99f00cd8c66a4624321780cbb2df4257207d3ef9d102c609ffba2802930f423c89b059ecedb7e5fec64256cca3d5bcc18b35663b3fbed2809bc0fdbcda3efbeb46af48eb71a7a19c4ec3e7d25c92f7b6c73469d73bf9f17dae1728f15f33f855b0ed6adb30680daec23b20a0098f320a6a9df7ebe1ef680a18a165967f4924f1cd5ae80d091ef14e0348ad7549c12639cc247de331176437be787965cb2ee8488ba4de4e262444615daff5464cc1af7eb8834c32786a5ae6ce9b68c7f7fca9cdd250d2dc56cacd6c0ef5ccbde6a376bbfe852c1706dd45873aaf5d176ff8c93686609d2c61509284a2ca1bd178e65c2be1e4873325dbbbdb7e00519cefe9e12d5963a8df614f3c1ecf779b85d77651cd5c3d60eaef38143d7072536713ed69c067fd375a203b064729ef08e2f05f60cc872347d000c8e408ec0d0d9c610654089d6791441948bec6baf3eb4e306e34c21a7403918fd1ee6c0ac870ef0aa5af947c5d27df8e3b5ca00cfca151444c14c9a6bbe8848c7f15a71a9efa97ee684f22dcd0e783b9e298b0c5dccc5dfb67e59bf42618293459baacf3f87feeac5c9534b6db76943fa64ac35cee800a0b44950e280d95c9c84570b9e9c7e146a4dec9f2f1cbdaceea0ab94cea272f14fd8b69b862581d672ad2fe023b302570455569a140dee854afbc290656930dbd010058ac3b7c16c1990f28d51b8f5910f7d08ddfa518aa471520b650bca2d8eecd30ee6738ff9a1e640fb23d7b44a28b5fd097f5151afd98e20ef536cc3cf44ed304a169992d4018c834b3bcf5634f1c4656567b399f3524a5415bd960d5fceda4bbb6978e6d0276a547adc345250609dc82774c70e4fdd634228abe76a188ac91f1122fb04477e77b02b254293b3171dea252c1ef89c08058933b43dbc4773c3e68391f96ac1ff8df8b3c41b0150f19645517ddb6b1886e8fd1d6f376fedb60115c82608c8f749d70ef727bb155b1338cee04a56f59077729184b7391bb088f56b6c864c246575ff31cb6cb28df9876b53284309821ca1d50657d28d45ed95a0bedd68b06718500e6a127e771906da300775363c39fbc7c3803220256aec0ca19e1001174874cbf7a6e9b108f5ee1a97aa261fff4b97df92bcbd80b9b4491ca9c363af299cfebe45c83f16f72b8288eb6ecd94a62f9cfe49e6fbdf5af17aa20c969782d75da9ae57996310e6cf6db669255a5a94b4fbe26486102742d0d472061f50d16264ed40ac4fc325811fa4c61c9f0be131df494d20cd4b95b2578fd79c1d5f613a396eb7ea2c3334941bea9b53598bcba12790b0d59ed935c10c149b734ac8f8575f1198a0fcbd2819002076ecac5915286b5461ff7bee75b9a830a6d5e9e83896a898da598fcf2960ff026d5932d4d7a40082189f078d4e7f19485e6fda4c109592ae6f34aaa4b68f71c539cfa05f36ddd904303ca8c183d319b088bae9b030b22e1b5510d53b547cf2edd45b3b772d04a6c84f850504bc0b39dab175193a6624e9f1a78ba83b64c51c8664020a17fa8a829c8c71bb22f49c7a3f3568d1c4b351ba0efd3d8fcd75dbbedcb79482e961313d093db4d1e4d28272ef54a1cfb44fc83d24ab47d48e34cb134ab2f450fae051f59f4329b50c3612586baed0b750844efcd2f0afd43410a7aed43bcfa0648bb1bb296d327fa82ae0338c542c298661f9838024fd5dd310c11ec6fd35dd644ce896064a4c93f1c83e35567112fe5b3d3bf89a076c1c46906fd0894bffb06ea6e8b3708f8c94306b8439b54a27632429f82aa085dda4762d72f2b6cdbdf5e165d31079ed566afb783109cfae28687dc6db15b2e9267ba1bc5f8ee2a7db5b436e8c6118d5757112329a90be6fa1193819c60b0dd4b721a3491fff5757a6eb9ea52d5f7a3465a232724eab4f4f89ff13545707fd4ffc9e055332412edb6475eab72e9dad1ff447bfb9c6f9ed2ce9add755872e9ed8ed4c213d6943ce9c077ec1c78785bf016302ce58582743142e8b0420666686b8fe834b9520bec32bc135550f9261346278c7616fe95a65126b6d3caf3953ddb9589cb855d2d9e3cee2d3a46fd438828f233a00b7e7b8312e073fa97bd606483936b505dc9567e396d9dcbf8d52be593a44d6d3a2a1bea9e0f853e5c1ce50f960c6dee50129c95460cbfe2a98cf89b811cc297a0f4d3d1c81db59b2660f22f7d1c1a4f032772410614bc0f4c231fd2ef00bf2a47d754279988aa9c07c80fcf6c00a43cb0c5d3bd6ca8e55b1a4607c058500283c96460524d4fd68d16cf95e43dcca3b7f52a6954f65e3557f3fd6355d71e45d2372f2e1ae8b4672484de378e0b441ce11a1f59ce7687e9d252fc9063dff6b7c886f9842b7c089994a251c49b0d88e07b14e1e8083d62e98823a25fb041167e2483345f0a80168184039b8f7bbf16aea15582acab913051d710d497bc53d7f6fee3c759b0da2c3ccb1ec24796d53df2f8675d6d28f94a8a033bd6778119f852a877ff518d14d45ce869bdd613ad082a6f5b45c81fe4d81f9870c7be0faa4a33e95e6bffbaf30561183d212519e5f90a10f3b81e097b67fc28d4140aa7cf1368eb43cad82eb030d000bb448d363f403ee835eb9b521f61bc9cb6e634440f3b6e21b022dff34f84c91bac5ac8645d2aeacd2435acc07ffda1a981a82522d4496d182a2735c6b19dbc1dc080944e16f0fbe45adc2f273f30bc5237974a8f034920b529b8eb5c72a354866fde8afce77e601f900c212af7df1599107c5d75219973b9cef7ce14a1c0e448aaab8564606ac893abb6e5677234b7a8c55a920af9cf381da65151630c1684a0dfc4697149765a617af50f68a4c3bcc86a300888e5e66556d08cf9281e75acdae30d821ea0e09c95ee83ffcc03028cd55226f8ca7786b89c6beba138fe79de7139584edd6ad31fc94a21fd990d2cda5a55ff927b563d26dea82612e5fe89cfc542da9d2f7979a31952fbff5adecdddb75feb6310873fcbab3daab07e19a575ecbd1713972966f2098f85ba625d539e49d4989f3c8f3edaf63aee464447cffd880cd885cb02697d6599810dd74266238ed876ca11c7a751867f688b8c50758fb54bda89ac58d275374609a9b979db0e0740daad59b214642e697a2836e803462321241197929a3f1c47071d0ab1d8ec964687c8a1d96d466ead928484a7ed2358e15da4d38e8ec098b6fffeab765f5829e91d1c28234439cb8332adfff961422445fa4336480324008b74d0c3a93bb7369664aaea240ca6517bd7ec71ef3195416fe3745cb578b5407e5b7dd9a528c5b87b3341370881a778d2f8391c46d989c1e4d9a31bfe691e1cb95d83ffe24034b7a1c11d253399e8da82043e2883cdcaee92f6b8e8e98d1df5fcaa08e8df2f60179d6cbc9b496f3063a88572cf2e711a38b25d6e7954e7ad0a1fc51712f65f3b67395408d38bb6704842b537787a69778e9ad408a8351483fa1a0fc5de8fa64698384c66f5a2ef3235dada34f9a63fec01b58872c7d50875519651efdec4523e82cec5666ebc06b4a98bff8d0f007f325eb997e1ee6f4ab54f3476375b8df645f17c69c33f1c2f3fadbb31d750ca012d6a0dfd7667e06bf711d3a7e4e0beb676918bcf58e53083cd356ab40e0167cf0976539447669d67d5bfb2206bf6ea0f3e888be66225d29c76b9aa3cfa1eef02cde0bd431c75d14ae70461c4fbe8939bd6a2dbdc1afc422abcbe978720c5f07d99d72dfd96dd45e9c4f6e4497fae037a1df5dd6fddfa62c4435eabec458e13e653a6760be406dc52af67da8ebb728247780a6718a7a2d5e70193e2cb38f927c39fdd238d82d521b17cb166a19ef0b53222ad08fdbc13326f7a8d8076be01e2f3b0f599f73f492ffd0e0a7ed359b21c3f71836011cc2696e4d19bed2810907fbf3140a053a686b7a667b3ac58d5e5fd4fe5b599cc0789d745ea985ccd1fad9825eb051d72c48e8d2b3baa1a55f038e6d0f1962cfec5bed92080b27b74fe892c1f3016c84ac26dbe57693ff54447dca9bc34080ba7b41ba7bae1907000cabde9a8b5275a4185c8b344404b28cb4766024f5c6b2b44ee301a799b3eeea6b0b4a6ed596522ff7c3f8658da84d7c6f47c5bc071f2f80b6a2a482d33a2f8f200d965a3566699a65252d1f951d9de6881d887f1cf4c19410e8f27811216f6372661f5ddf7e32ebc19e6813ecc42e1d86101789494991103c72cc0e88bb53134bc3da6b3c0c262316bbd90944adc8845fa538012cd9740a46fff7a026cc0e317b47d19989003d479cc07d86ced4681f3d88f77f47c141d0da4f3d269268e8202882ed9dcd82d3638899dbb4730b98fec941f368e26812b4556ff6b32ce87a8102d599290ce17d434920afa93807f47ac8d5fecf3ff9c0779dd2da8b7aed84d942b96544719badbb69282a0f427a6ad562d8711112dbb0df530310a910e3720166709139c462e92b0ca115e1ce36720096087a026da91e8ae95338c3b71615e752953d88de60d997656162cb6573216f0e3864cf9922bfb3f04f6d26b82177538a7ce069c27dfe9853a70967bc9274a9b094c302d704eb01212a23ef3b906a0bd16b99a256967a66ad14fa021533feb79be4667320fd9dd8cb03eb19fcd7b3c1d585199abe8e16b7946b5eba7e176ca48d004371992e48f3992c7ccb7a1c0fe17f43077da5c49672d81c7d4a9703c9bc42579c5bfbe761a0f9cf4143a0213b5cb20438b7708de0d473f0b0df6bd2c481e424dec86c8f665cb6dfc84fc41023aba1a05feaf7d271f1530202117ac74a92fa5a02043b3dce902403e122fee5f9832e7557dbe3a29c1b5260823207eb5c05aec18b54c662a20e488abc3cccc2a89e600e97520d9a6d53089cbf33810c4732c5f348c736a276a4eaff0916b6d4bfc5834e4329ff4beeb77bed0eca8bc853e0be889ff2f1762ee409cfacdeea11490d15e3363a6118b55a9f092d2e7169f782905b6e723d04a811374120c19b13640f505b9ca7296c33695df6526385641618a59362c6aca9bd584e0dc8a2387c6a8694dc52de93bf68a8f9a3acd82c5209efe4fea79a81f5d9c1373ff2abefd11da6ba78c7b4b4a9458353e1a38e7692a6f45478769a56ebec0f2677940f0babd347f713cbfd7f123025ae114a570c2cf3e97c339fcac6ecc2055ce801eb11f32c411c2f6a49485ce60f5c2db4d63d6b0ce86c6028e2bde77bcf4e2ac44814a3d958a065fc07374cdd43885fad5844cd467b373c2f9df838dc5eb0f7496a688dcbb0571687eb091396a568b1731854a759d3b696f76ea7b4fe89e6c24cfa95bb7804345a5b89b31300671974023adef6008dbc2e5b0e03a2fbb25581cf7c0883e892e21b7d32709ba85a336b7875ad468dd74d725569b2a6440f0b708f4e47f91e1b1aa86d5c8cd7af2b93ac3b9dd7dea8a73660e7102ac44ad3e0b69b0b9ac2f2e7b18191e04bddcce60bf23d5f079c3ec55534fcf63bf2943f62d4c09bcc319c7200b78a2f666d6e84b57b97ee321b7ba81840e4e038920444b49b93d75385d67c67f1de9db7e99be76c6b5cc6c56f29682aa14b2b00091e33fa74a164def94e0666b9fc68a02d234df43bdb1d21fa1246321d3db17e3f243818a2ee39d2f771da3b5e72ebedafb659f63e83b636b44ed7f3a470fb0446779cd69fb726df80f3810eefc5be1280b17529e0103449131e4998a708e308326d867930f142b06efd25d7bc334222831ecc6d5b50dfea59bbc386159ad8beefbb964c834d995d55e20baed6cc32cb55a82cb09725257da9bbab271cfc69489f5632fcf1a207165a4254b4d2645d42e7b3eee23177696bef0821f92eff8e9b43df5ff2a5d5d103bb04989ba79a46de633085153e22b4f2d8ab52f0accc5625d771899b443f73384e98713430f3edb657ee97027e7671fd4e1bbae611f62cf1b6d1bf501b6c7d2ad73414dd5fc4f8ee361fafdcf3abaa12e396ed0f53cc77e8824401f0f02b132a79bde5777ec5d5cbd7576607251abde85ba0907d8e0da154b6b22179bda114eb651d3c876de50fc21ad106a7514f5f7056759b4e9c16e7e726aa6fe245de6a1c750c5a3833cfc7988a9ae187c3bae7f33db4ba49fcb27b1828fae598de0a16c37978711132327691f053cf03ba6517d67c801307e4cf60bd34443a1b40f6d854bfa2521b0ade21e5f382412032f8b8bc08197953650174b8976b5dd998bddd271a91ab6d08a8473788fff4452e8993086a0f2e1aa6717b652a400c158e8140c017087520fb04cb889efb5f64acc39524fe17592f7638d611785eb0259a8073f0b7f740d4e03844a707aa9098349a51ee487394e237f0abfb4942e2b8654462f081edc48326a1e3d9d36255ef695b6f5afcf380dc3816f58314351478e187a8f6517fa202ed2dcbef8a92611cd3fc6a7059c7567c2418a1d4b4219ef7d58ce9fa4792efe2dd6eb35aaab29d45b5f93a5b626ffa759f5218579f87e3816fc6a2496a67a7a791d54c7dcc9b1c0f053f346a363c7f0aa9046c4c998b5fdc1a88896c91b463e216f2543bab5a26d6705b33f8b8e64f67759cde69a306c6a7e4370476228e20400b7ea770941ce7a872a6b732098312678be2a4acb33a4d5bf449b93656a2509fa25930172c9825fd7e016fb2a9d5a32a2bac5b30484b0e215f0a3e8dfeda47882c6353fce52e61e6afc696ecaffa599af1bb279bc290dab87e071f185872b3f3e63045d536d85ed6af4f6696b7dad2260f66ddf3ddfa688ea80a4262ec9844c3e2a79d501d2108642c00f0edf05a952f98924a0e83888729ebf8f2f31910fe7db4686348a2e3c0c8421cf99b08eb2ee1b66b65c80cf387922852853ac30afabec0c7a390e9da144dbdf14bcb0963891f97986ebde4a25a31742555ec3acc6dae6f219d375c9a7c97f28d832acd103dab6045bd0d7592c37abf4f592fbba10c0d532a6145fab2a79181e1675b639dacd1606b7c1816cdda4d7f41ea3d2bfb4758ea93996762e1db848e8f8d0d764d9b55b0a8964d81e4a499c1094d1ca8ef89aae9c7eec84299e1c1f7a12a2cf5f39d18af7ff1dc104b25d6264f8fce1303e25219eaad336e91e8d54a781722b175f93866c803d7c03ce403ed52a0441b99ac431bb592aa66ba598f84d89e3368839ba09fe166ef53e22ab48a03f553dc18f04d331a30aa9a02c05a432d6686c2d3a01a90f2c3f563f1ffbd032eca06307e3dfa891c2d5f9e9a21821a8817d079062e24a4418b2b5209c2605b3aa9bf8da5a7a7cd3f96ab15cfa77447232474c95f47c3f085783955991b11356e17ac320ae79d07d138f6325aad3bfdfe46ec88fdf962e7586e2e1791413c581a2f89010039a6eade15ddcd10549731236bfc3374f2f35c6444de8eff873996c93abadf052bad4073f26621adb304c0733c66f832561bfbc5dab66a385aa4c8a788f53de1aa54f77894b955f93a9047c9be096285387b88c22ff4023172839075a81bf079cedd772aac245768ec77404e87338b07bd7cea8217a778829170448aa21c5a3bbebaf633dedaafe158deac059975fe32970ff70cfdfba574f7a77845b70701d97320354ac8437d03cae29ad94d202c64becc646f551226dcc2749394614f0fbfdc2bbea572ee30bdb2ae4a98f039e80624da5645bab138ef2b7f7a4f588fb78cbeb14ce0d16138524625d2133bf0c9e3cb0b3ba07329eedee0ba4f8c2a86037bafee4f6c50da14d6827a00bd72f2cec896b48ab440c4560a1e96e44f50ffeab8fe6d4f0f49db137ce54687c2fcbfcf73f405189ed3f530cc2762cb74b2ad9a65f4c321f900a47a57584cf9dbd27bce3dd7b02591d65a9a4085a2bcacad8c49627bf3ca021816bb5204366fe3fbcb64b696017c8526adfb9e9bef425f8922ac83f72c67f006b618a538764e37d9961670d69504a9f4abf6cbe2d6902dad688ee01f4de2803c3fdb47b505d951b32d550ee4b526f777a3a7cfe0cfae1eaf1debb8d4e8537a7c5e37868a0af4dcc946fc1fc5a8eb7f3a5e20ae3cff5482a6050b7ce5988c6658cba1f0daaf2784b08023f3bdc446eec91345f8747db9ee686d0970dbac636682b27b757a1b88d156d5e0dc70988858c37571f6fd78085bdec5721ecc32232a931ccd5c608cd292115fa8432a612818b154ad970c549684d742c76c5cc09f7275b1ce4338543ac9e660d3d0a0e1aea65b408620103d1e36c83b90660a89f4d51fba31aee763aee7f15acf3a4754826bcfb724b118ff60ffdfd61b111653177e1d84f76d3afc6259136f83d7575014d47cf06b37c945df4fd01d83c2cfa6ab75f91ab20e54280cdb8dc485578532f7d39b55580e0a963c914364416fc96e035a9917253b79865669ef36b304be57d80aad6ef324053d8bf771f3127c08daa7400a016959f8a86e750aef9eb57d0402b295b02fdb115f87ea5716a9e8796d84e9bae1dcb8e534ae04211a050fc38403fd064d6d45284d609040e6d39b622afb7b14bb857ded0609efb7282ab4504481d849670a942233935ebf18df4f6b226c16b72ac00f354cb85913cd69b44469650eadbdf9ddf718e203d690793f95efd853cad2f767de463a6a318737dc24519eb8bbde3cd91674f49949a9ca172d43f6a2de68b421ef321b37dacb3ba68b4bed4bec121bf3ae8a0135d2c300291d51615a67f0a344ecb151a6b2dd6411960f15c8c2b1a9141660ea8d8c2ca158aca84ab35d2beeb7917c411d8877beddc6e9a37a4d9723a64caadb6aeeebe9e242d9fa6b154d5b3f7b137112373a6a6ae285c4002c5c7b84538844338122a13f34560b026d24454695ebb2bd3ea490a15ea6b8182e9e12fbddde05e73529de5a0aec09f960478b5450b265865a6905de1dcc5eb6ef23241e5b0589376c2a83740b8b88770dc6ba3d8a4263082ff62022fcf069b2b6aefec2eeb9d6745427f4a620b44e4d6f45f69085abddceed7d42a890b465f5a12227ec7e147ca6a66f2cca48ee8888baf3fefdbfaaf531e66a6b8d932d6e52e516dcd91b0c1c9f8f129fe326c994cfc3512ac1be2cf424ecf3870e6cfaa86241ea07eec560b5aa1c6726f7539129347e76290837d3d1b215fdc428d258ca4990a94589f31c6656530a7503671594e38495a6bb43a2972ff58eed4412f57ed75781f088c40f53b7581eef160c9f84573a7bda58194e340ca9f047ce2879dbe139fef6d83c05857ab0eaa2d446cfbda2f6be698c4123faebe98de4ed9cb66b49788280e0f55b589c33b9694e2ff3f88296260195dc9dbe482d5dff71dd75c2e6ce370ef67816c6e860d314e2485378fce2e77f15396fa761ffcecaca28804b5aecd971aed2164ad98054b2d0fec4bdff95f07fef9447d138e5feb697d87a5b9d1a4fe7b1caae13809b0073bba74368003ba025de9a9b96378cc326ab9d4cd7ff42ee3bde65f11c8eb2ebc91cffd8c78ffe49bd47f8ea0b1dc4049072c30284e4e70901c50894f5d50e93da8d296fcc4257efd37abe29854f91cfb64086a24a85112e416ac224f5375ea1e76b48a621e9f52f7542d14e4130d05eb75a24a9aee8a902838bb57ac7aa608115ae5be3918be3d02b6ba6e4c81a3bb591c1090ea1df229eef514f9200ff13506fc4212660cd8fa8e6f5c05f34f7c14f570a726a998359e7feb1468528a6ebb2ac7fba230d833ed66971000a2db01b8f3bedc1ce7f763bed27873d242761ad7486f15a9d4ceb8b4a5355df87bcce25d718cb476795546401fa874b801577f27f601eba20f42d49686d59030a8a09ce34d3c990f7dc1c29efe8036d0c6b8ae3bc7b8aea1bf636df12a9f77947ad5ebbcdba1f7b92564feffa8356e80d2114441b640bcdc79e64d61bc9b2f10528955e0ee806c2ade07ee753eb1e71dc7959a3ab8d83c15582590e03db75f8e3f7951aba26ca1653bb96c70d36bce5504af78c9e42d0a4a77806e9b0c9437da2f482c5446bbdd9e588a9fce4ff86b7049d3bdc086c59205b52ad8f6d669da39868644d4147473129689ec96e8718d6636cb0ab958fa6ac748d592ee0f052a2534a7db24831bf12ad63d08501a9c0d0e242c3d785ec97d8fffc9003389469a42fd398198ec429a4a3d02a8b07f5e93b8bb31138cb2fb71f9d3a30aa148b1237ca2ff4c2cefe67443870a33eb0628d87317a7e449323d17296716a95994834b0eef29e366c243974d9c95c1972d204f4c823baf2ad6851a026bd7548b699893f801d9ff3df69541b84bc686637ac0aeeb8aa906b5d19d8c01c81b6934a2b50ad5b123c634ea57d6a7d5bcd9d61a77efe364a5329207d2fefe0c3c31eb6d3921486921d02d3f5ce5fca4f0f0aaacd0f30b7f002dab8334c7cba9ada423aad5b055b92eecdbce4bf66c720de0168b5b54d6e12fa240c7dcb218dea0c14822f07280d32f1c1d3ce19047ec85161b3915f07aa95f81afb6d1559e9f6d83eaf73a9989c19cebe03d205480bc30e047fe9a468121f7a06e7266620a09e36b129b2d2fd32c2cf92214c5d27be411125e3ecf4f91b2ae3ae9dd8da2c1781f175f8903037b3b6ef1743fa1fd1656533870637cd86918002de5cbf72412a55b5921fa4279877c8d2c4759a150b13fcd9a2556a745351a771857bcd3df5cbbd0ebf507b05c3e17ac2bf9e50c55e73e4aad7c17b6afdf0db14b4fd0bdaf67ca3843dbd7f97cf6cc4936b51a45d643b8260b5822067eb7dc5aa791019f7da90325b95991d103f33252ac66b36dfec2acedbaeb3641d1c8a97f4a20611d62504be0ee8f2ae8f962219f09ee3b229e06388d74f83348554194bd6e49c8a3ada68bbcd07594db2cc8da6a2b1b7c40e758ee199db48e60f4430b73823e1d357a43c5b07b01ccc23ac5b757959ae6cade5b03f73150fd07b657780ff1d7dc5c4986fa3114ddcc94bdcc15db7de967c82e1357ef18b52f38db1aecd511ba23a1bc5a901d8e6e478c1b5fbbf5ab5ab1c19a1de8f0b4625c954a6a2bef9e50830f254f85ca5085b3f5c4d52a9722afbae18e1d6ef26870c0615fad178b02ec44ab9580367b8501112f66d62f43b3866ab1aea463347c58652e6ed419e0af4b4fd81d6eccb7e04478a3f06d2009888b3d94dcc3d17bbd7417678a3d8038f2d5692d278f627059db3c15f134f1802b47779d8beea5220035a34a32a1b150ff8c96872b68ff1b7ced7c027e3052a0b70ce8aa7831cbb0aa4a3d3902b1104dbafba638d93e59b5182ee797e5822e3cc588c9db9d3f52ac324147281e126ed4c87ee1a287a5f261ef99e5a00adb8d7a7c04952b0329c4a56b0996cb66a7f66575a9117a2405bc96ec3153d0bcd0b420e56bc001e96f554873c16c82b6706be542f1f0ee3c260a148fc3216c2d4574bb6a22fed019948f9e9d72dea2292ab7d3dfe129c1103bc5a6a020f88ca0490acbc2d026feedf0488423c3d18c81d53b1d0e5070a7dd0ef8e567144d14d0d914e8f62bf6718fb0f3aaff60ebdefccccb742c3fbdcc3cd4532e29e6a018d2886c19cf6d0aa580ee41b1e10a4ed5ac86eaa4c2c0262814729d5db8b0bbb9ddf356ada01acbbb6416d5c402b01d341555bb39481201f946dfbce77f8fd2406d0c551c9c7cd36a969edf0feeccef8566e7b69719477e2a1baae89a0ede93e880a198e4f63f41ac6b9b78ca0147932663e0cdb9024cc0b733409db439e4a296b0409e3ad5eaf0337858d2df0c0af76c86b603d31b24fb705fe9688db0651ef74e2c4216b9165652ee608f95f3a773b516478c1881cdd95eeeed6c69d6fd49ccfddf8ff33236efc99a7180081db128566d8bc6f94853a0422676f4693609b0bcca442aa3ca5b5e09875ed11fd8fe9067a8b5a8f655ee08ade75321417b65802d67f51e5e1d56c7e1ea56d5ed0003140c2309d6b9a51ad1bb53c490b49d939bbbfc55502d60187ea466fdf073b67c8ece9c66bd5b9ffa0160f44c68aeb41592d8000e29bf702e4ffe348fd38ba5a0dd4f778f4b0b9d6acd22a518c2f92c19126876283334e9a99fe87bde2549e337864799e963530a8c49e2087d640d1d59c93916339f2691e5a57d6398588a7c27a78214444a4f05e08d733c620654b24995c44e668e265ab13a6ca84ce4ba8bd373d9905dc1098c998575b9f8d5714226670601d9459dfcbc28423dbf49ada7b0d2969547076abc00bbefb7deef59e527346f9d7cc32d056e00e1b46be3ebca0e8138493790faeab44b3d22c6839e2e414edad527f1245c60b3df4f2edbe3396074b8cec3e54bf46ed4718e5f2c6b635c7e63a336d87825380f4c17c0a294c11adef0fb12818bb36bf82d8a32b075b1a0d9a5f128e8c9b4bc1bad575691e0f67872b079bb8d9a37cb088f5db793e0bfad5ed6f73a5aa71bf71d09a84cad98f4e658ab9965fba0f20329f2188c70af0d9eaf6ff19cd736a25893fb02590da1547915ca7aac69926607dca1dc641ad9aa87a6cfc245703898b4d554df637d889f85f59ce9c731b8a9e1b49668414d9fa72fd916330569a871391b578a0f93193d3c5464a8b2e5dc07cd5b66a40b436fb65d6dc94fa14eacd4928d9ff543dfc70d07d0d2d99aa0fb041b7a73821539ac0bc6537df74ab0de7d80bf502e01a563877e3ac36331fd402853dd8cbfbd92d0701de56cffc0d22563f7fd1e571762d1ebe5a67355347304e342aa2390b0ea158367202d92933fff328dc88195be00bec8521032628e4ffc13e33561df034167d37ed98f85b6912dfd5227fea6850e1f962e1a9c1b39b679d40354d77a9e08769655762be6a8aeb6e8bfc71a4493d5eb683b7b5bea5cd788f1e2d9a34b70c34ab574c5d7933bd5067c3da32df1ddeda15afeec4203e66c0a66687198963f2a0bf03945b7942ea300a0b1bcb0b43709ac1355142c5a424870c215438b46dcf46dd29d644f1e051088a76ad00f66fa5b5f2baa4c7a7c828a8687efaf7afd3c18c97bdd9a57a8cadfd381621c056124891f6ed0bd550c5363398923630e0e485b4f95943ab688b94ead01fae0b01817af6d526dc6487a4889dd237d42b9b407ff6eaa68518c0a4edbcf01bedd7b25add5e12fb3b0746803b1c6d2b3b035cbf79edae71263511a6f040c79400e838ea7cb6e9d8421d2cc65971298e2d11e5b0954c7c0de1f9ce19f350f3a812da5cb53db714808d5012cba05ee032e29b80454d40bb5da6871b3d2cee0c855148349e1d4303bc2ea25115b1769470d5fa18a767500018aff4bbae3efa3721d320d594b54109527a70bb5d973d838b8b7013ec56e04894c0f96326e750915a8af153b9613b2ce3ed48c9f858eb389a4d67638399dada54e81115480b84539051a01c1396a51e482a64da35588f84cb47785e922569503c2e74ca6e8b7775f97edf46457a6280fdb170615d18ca8583d303066359c8d6803514e87506b02e4789017b91076bc353ed811c09c3787dc8f2d56e26b6f0e8d3635b947b8a7649f61484509b5d3b3781fffaf6e23a5ed8a96ca9a60408e2b400a7ec03da44a16ac6c177fab6d1dd1bf381eacc94735143816a04cfc31305a331501ff6140232c9e2ab615f972cb521cedcdbc5292d86f4863693d110289ad9b9da9cdff8182cd011afee22951d419df9a2ea7e317c1cb17ae9963ca47960ee0d1bbe995c69af0ac732ed7371369720391a37c83e03046ee989e76f2598943f803ae13fa338b9578f19b230976ff462371b4ce26d25988df626a1c3b82180acce71cccba0b626ad53ca94f53f175ea8057462579b14eb878db3b941f62ae45a375ddef07d6ffca7896fc3a93727cf2e066e9bcd03264fe374dd6e82b23fd461cc5de9f31cadedc7b1f49900bfd4f454d107214c150643bcf4c8ff58620193bc3552b9048a9ea6c1a5f7394669763b4321223bbbc877d98744b943aa96765d3ed44eddff5da094bccb14ae3efd581402307384e7d5b57a0821cb41921954427b928204a5f1fc2f3f1ad2acbb1db1bfd1d63d6f93e9ff70e9a33f8060ed9b9c47dfc8edf72aad123205801adeb51f38ad4c285e288780539f4a20e95bad4cf2484f89372e0fc5513af19ab47840ef8e501481fb4a85f3ef51c200a576d3ba59ae904b1dc9e8622491a774d1aa81ef69b0e4d91d042282726e6767c024915d0e8db38d06b358f0d976904a936138a0ba436cbef149760dd2dcb9c8e6b30f63689fb3c4a8986af9bc306af452c308c5b181819216b89f578499aa3c5e24268fb8002e50be31a5bbce9ceb628608ad48be6eb4825354a9eccd2a45c20b1e96330d059807d8e0d35d68d4c9c0f19f22b499fe8d43dc3f9653e3ab58e25ec28d8f1af9ab0e8ad54ce22b196d09d04d17bc3036873a162fcbc94e09bf7369f7a9cb9a364d2f50c14b2c50f483a3c88e6176e92361c30a4baa0cc7fa3125cd877d47ea95ec125495601282c1de74e707cdfd9fcc12075876ecaa47a3144c2b97a3da9d7538bdc2f7b5143dbf15dddc0432260f9bed58f7f0c1c6463ea3c8a2394149e4d14b48bfc011714fd1213dcc6f11c384f5e257f108b54fb5012cb9fa1d8a580d219ae96317095e052b9772fc4411696bd7e5090fda2a8a3b295aef06a90677e0ebb230465901733c5c26451a980fdbcfac30ed5dd2d7e9a09f9ba88795e705e137ac9a5a6d1f936f536b71b6f3e1ba74a3b359890b863597a494ad9d3fa43a6bc2f80720af31fa9088b4e4433ededcb026d5410508132de52dc105a9098f6fcbcdd7b94e158c2748cb5cd9c8d4377944623e7059bde745a6648f6afe17d4857ebee26878f2dea369762f9774da2e8b617c03fb8a6d56027fa8caa435adf974af154bfca11e9e30bd37b69b64b2e1e87b32519d26cf3a124b093dca82053759df66f2ed712c964dfec444532fcc9ed454e800cc7488afa6986299ed2585558405b7139cc07f0942c58152c7070f6fb5608a9d00ed31851957f511ce3aaea706768ddf04b646a6e748ce9cbe72e1aeb3d596eac143b21d34ae10d70c0e59a829317b05b07e87833ca43320842d0229c27b2822aa8a8d8d979813b2ab73bbe09f6d88d084835aef8d27c8e9b3956b3b8aea378f51150d532c948e1df780e44221f67a56073ff149490b1536ec03f4b080079a238c7d012f6bb25cd175d43ec524b1e6eeee09ce2f1cefdadadda92c5a10c8ff5adeb94df9f6a792790187cf1432cc303a3324bcfdaeadf81571bbddc7f5a6acc2185c8f3a2a049b5d5ae01cc422844f6077d73f574a57b90850f8f7cd477c1e4b899b82c8dadb3652bf489160bde8babffb9b4ccd68f0d39120d7fa0c9af4dcc8eaee8017918e1b002d1b2c30e542b3c5d543981b947dd867144447404409577d7c0da8d67fef39b0dbfef9b7632bdfa01d4de61a7f6fb926573da333bca89159f212d0b225375800f4a9b76e4df4e50f41bffc70283296bb33b1909e61c4a7cf9e47036072bddae84ca931356b9e4b017ef51c017429451f4075e88eb421dcea2647097e341e2b8c4009a8227a6153bc6d96bdf6069731efd9a56f526891b16973c63ccb4d17efaeffc7f2e8b6befdfc881ac52999379bf5978d4292d35701b232b2f38cabd1430774a3a767ef30cdc1e326b234c4107153c9b67f418b0e1d203f6188ca67d92843c4190312e5ae577492d6e354760c856ac15a7ba01203c48d97b480b2a5c460cfca06b0a409389b17f2d16bbd2a753315fe7f179fa40a9fd71e0260477285d3b21e1ad89150da0ec5ce66c997bc57747f9495eff287589dc7d9994c8f034c2a1a7b38ef9827c1de4889815a25e232bfb0bc6488eb34d1fa86b3f948ea892efd564d05bed26cca70ae66ff8990396a2a9870e55a5887957172488189a7df3cf0f6061a8704fe345905ff06dcd8fa3f6f930b965359fc917bbea4d0281a8b84c4a04229f05e5d7020e55eb058c37b6c033d3983f1617689d5778fa874178fee03471dd3a2dc7907d1efc792e69b32a0eab74f37673066f11c8a40211b6e1d78922e0babd8cd0043bca31a9cb65c0cfcaa6ea58a0f9fe55c4d1de97c73411a6a6c2c6d4cfff6c8f20c11b5147bfd2aafc380c18aaacd4c902b8d6dd78ff91c4b59819cc6b79b0158d684a7950125db215f9d44e7ca837a7faecd3624ce97331d43b7ac17e488da34968d2806df8c582ea86a959817f818d613b0f414c0c6d4df6150920e5241ba8afc94cd68a0351f82f66bbcd2ff520ef5b336f99c54c6ea481da31f70b29704bb388f7bad38bd9113a1182f428340022c055e2198f3a2ed1c2a8fd4ffa696c11be6a3b111bad334c471578d8af1d00cf12ef96b32c685b6f44efe3cb2c78eb099925cb9e17fc027f785f10df67205a8da9a3567c2aed6d8ec14525cea64baaa138c5388c41a8502c323c4053dcb82ab309501ab9b88f552d3da08c87d4ea39457959a5f4a45a948a582628f76159c6a32f615af0a89f37864a9ab3bce7ac013f523903afe982d897d89e0035a7f6492b213d20b3444c0a3189cd5e02ee92b8c6b87350ecfa96c37e2623a646b9c59500692dfbe5bf8a8c8f76d84fb05a2838453f6b39983a0deee269fcd61e952befa2cbc77b9d586c3f06b4a0ee5b776358427b1e1d4f6d7a949a750ff07a909683494a8e29fc6b724a80637ae766c460e7ae7c3e12c18db52de841b89528381e8acef3a5c9e0719cfb23931fc9a672dc1d0f62234e024c4d6efb2b203d9b6480dc53f0a6557ecb018dac9b041b78b9ad6fcc8da9b3ff96454c109cdb135e679ea9c4618f1f9b09956d7c6c784f6d8f018474368e5f0242c23bc33b2c55646630038d9e94b830e5c5c3e2c863b1698d64540eee5aa1e418b289a53dcae1988114841a6c0d8f42faeecc119e914cf99877d872512183dcba458ec27dd733d10ef03a32640b11304889a7b19cf5fb5979a08ac5f190fecae6e3ef4477207b9ad7c42e883e4315d3760b5aff91295f0e6a9b1d69fce38aff93b5943d7fc6a796080fcb2566ca7e7aec8e0338595c4cb60ba603c2e511fedca973f7c91586abf6110c57db120b24b730bfd878837684b2d540105cd3dd12e8e5a8700f92ac170bafea5afc21909a80712dd3e990bb46745dd656a27271ea965b027e4a477e7fc37bed9cbb4fab092148c477ddb54329c13130be54b2c4d754da4af60723d6ca4c7e03f4a21aa6b30d77127b3ab661bf6cc15e9970adf9e5647f2f71373568bec9ad6c9914422327320de1cb0a33b8860c95a6d6b9d37685b5918e5ed9a3e6f4c071cfb44e30da9f30f6b5ae627068b43632b373353af4393590c45cf985b10b6e055a9dd60ab96273d11c614560c9e8b6358a251c1d805414237342471d2c879e84fb26bc357b915b5a7790fed7ad716ea3ad635ba17d48e3343f6b08819035a0f395dc5d95e544efcea5c975c747003f8d9e6ad20251c37e8e6cf4f8969b1114e89903605df1b86a6cd1125f82911a89126c80ecd5b28d7e51500b39d2a6023bcb122d878075ff8bd43c9dfb73479b2ff043d051ae05d9182e30f43a2f9bc3a9f271f8eae4e89c01a60acab7cc0afdbba434e20b03b8cacfd2d7e86d27077e32f42e160e7cd8b14b4036cb9d7f6e6c8fa0cad9fc69439c5e1cd191545defc272e9291f2b8c82919995b1a6e8fdced67d1594b29bf927ba07b1f8272ae91b9476d49f10a89f0b56a1020ae75fa65bf8489c09fa82497dfae99df5cf9bbce52bb1668adbc3013bb0a80418d0e6a41a6945a728bf4459de6f134b668863905f690c25bff693aff24c47aa5392935d324b00fc60040c9f9e40abc289937348415f108762d77db3df2169847c59b4297e153c695a559e72a9d7df5b29779bf5b88e38c90a1f87c3d2807f63f9a20e2359df33faf45bcd1bbee898279562970074c37e988cb6be3247f5513a96a91b5e43a78e384fcea69d39d89d043a0ec1ca5c364be50b15217b20d823aa65499d248134953af62394b3aa26c3471e0613e7144e64649926edc15e99794fd777293dad2566206fb649b8796e1dd9629be85c5a8f6d34ba3112a23cc0f29ae233d46181f210d5b57bdd6eb2b65e75709fbd9dd82e42ea65ff1f63c37db729e8b12cdc78cacb0c4e3fe7119a525c173f63ee1a26a87c34520fc8261ff8beabfd858865bc1c3aab7399a3205fad9940e5ef509fe634fc336acd6c92165c91e45b1bdfb2d4f11247e865f8973a576559704d523ab22df79ee4204479f7b10a86b5625a8be891900b1e4ad83dcde864a4373cc89647b7ff0152672177115fd8feafdf9cbb1ef1d6405198552e9e1cbddcc4361e030a0f05b559ca3345ba48dc1f9bc406f5e42a8129411e9f4fc0f570131361a12defa805076b5cd142e473007ff98a8f4468312581b8b5cfa4ee41a4cf52f675b8e27f4ff48c2d33787261c374a488cff46b28c180ebc674ada00caa7bf49966ccb28cf6a5d3ed4679a8be3ac8ed0368168276f59e8bfe3951f68fdc072092f9adceb1557b776824be34c958a6310adbae90151df6a28b1967b77d68f120d2a3f8c685d4a3a09dec69ae87b149c7e518aaf4fd5d4ed12792211e4f03fc8c2eb26b7d25f11d583b0baed0710d97b16db9c0106b17757ee4face4f0dfe416609e464698bd93c63d1edf319e65e3d8ad66e3b3ace90de030cdd562c1052dda157ea27800576150408ebd9ea3f47e65a69d2a6354a587e250be147b1063ea7c1b8e3b57b7d53f1c09e181631fed9e2cdc9648ba862e3c34ac68454d228488e1ead055e9f9056632865dee777932d0ca5932b0b79a4a4a2935b8448ba261cf23af1573084a96355ade17e213880b632a95e6a229884c4eb6b93e8879a61ea3435c297dc724b84a6df6bd3f0f526164ea6b204d0c75ac2bbf437900a311f43e8c60fb86aa4e94a514ff9a7322bcf997ea78c34462d1e66eb77e31a3d208c390ccb4f1c83e7f1c1137816f8646753969de178abe4980976cd2ed57dfd5a344a52adbe98fa0a9c1457b1d1c0082a4f66c24327d3b958557265505b75db1e30fe3211b4539c798d8e1a21fd7b37e49f1e928950f09c6e095aa6c38f090977a8d42452010ec9a3c433e223cd0db764adf9e2e60ae32da34d80fc8e43972168e0a5179f08c1d76d57ca1fa889815420a7411fbb16153072ad3de2fed182299310e765f757fc4d9c80221313b41174f33105f721f816ec063d790372b8e4c1860ec4de56d1fede4fbbbd560f444b9710e26910082cb286930266ccdd5ae9f0fd4b3b9b3d40eba66064a66e9bed1a647341914dac4159f2c6177a1823d4c9c734b31f560483f968648bb700c98d5079496cabb8f17cb319dbe3aaab8610af18793f155800cd27707f38dc089b93298714558199d7c0c96b576027cca5216819fad58cb473b77deb16fac72fea7a1bd73bafe7ba8fc933e51f211c5dab24f20a62a97f164624255689b80c5c935026e7e4dc01605e135033ac6f7962d723efe02a0f16910f38c4a4861ee8d75ed45fd6177545ef64cb327973956106428db0538d584944d672b4dda9bd6add8cdded0baee19d257e3cbb6a6efa074fa857868e9b97a741cb6f9f48b666d7e9bcb0dd599c26147e6824cde94e71c019bdea6b41e9d5a4e26efc8b998b9ece69c2297b20793af6273beaa6b19517b07d45118255d4b8cbece453344084997c1677447c4c5d66a54a0546c599fe4680e8b8e218fd4b8e7fbeb9b0d6f8ab580488366034f5b4a599a3313b660cb7ab33e891fdc970f9beada684a853e347a6e1bf2d9d067cf1f70c594d814534ce91ee0ddda1cad7c65539e5075997b57ca6bb43b5f959d736e75867d4f7c9a5b4c616dea2191ad371991e426447e48c761e25068eb907eacd8a23e1b0ae43e299815b11ccafaa2bf1a84ccae7cc8671e703f7e71f447a35f858cf3ff5d9c9892eec3dc3798ecf357a29095a42d2114f69803e5486ea92598d5199b1eedb0f4314fb94abfa1d3ac0649dbaab2c17598539465f64a0b34163b74e869939ff752866f4018ed22d41242575ec2b9822a594351ca89a695c1b9f00ffd57668e6d94171c5b217578b9b8d5e066dcd0f8fd876134319c0ec61703ae2c91b28111d7cb665dda72bada5ba4fdc818c942e2b5f7b0f7b250d1b349ae8a11de139f667baef79eca966295d99e1ea602868bd35b5d720689efe9638fc557172ff568754cd4276819cef1b556468fada0034da5e0fa8aea10ec96de0c38ed5bb65ec57d0fc87bbeb622672dfb58013b42e384d0c8ff1a2fc7041147045e671768435e35e10095fe1dbf25671d02d12ae28ca7b9d809cd9dbec9c061a44119d18dc8dc303c4bc62bcccd3c272df03321b41cefaf1cc6acc5f08aa75d3dda881dcd6ae98776d8345ef253bbe953b9032bdfa1494b66c0035ca07bac8af09753c2f62d384c8cc27099100e78e2e373960f54ed0f3ebed8c33f39c44416427d928c7aaaa1081647e5797d363e5c77ba3de604c9828d9fba5fd4e0b8c901db6bcd6a2f9555558b10f7e9df81e86876b93624e1feef581d03f7419183f853da39fcc018cf5c7540237a61c844a3e5e2bf350a5fc7f838dbc19b0035f42977d107e271a202aad8319995761d7620237c66297c1747b6941efb9439034b8194512cc148d9bd037bddc45537a08c57806b6ca4808ee06adc23cf434751dbfec1fe572d332411f68307587abadbfaa6a90339b494a4712fb05b6bd5fb2bf422b677850afd328a1c30cdefa651dbbf25a3505c5bebe6b7ffe51cf618d16aa35f5089b921e89986971dde2c4750036726bd42b25ceb4044474e37e1fe1211499bd66fdae0d1d159879496d9d0b89bcc7fa78952bc1fc73450285ed26f64593d6ee0280a15067cf9189723c09a068de6c1eb9c62818d81a1ee8da285591a9d9a22e0827991c38e433f73d716abc18d50861754ca6da617c1f0359219f0209fd71da1294ea9cb873d7aa070839c7e0bcd8e331043982551e04143aec6ee893895f47b8f9dae85b1a87d8d383b317a268647a95be7ed1fe3de852cb6e786425ae1794c855706dfb70fbb4e203c538cb165660f54f0be0d42504304d623b77b7c11bbd88085d8fcd2282a8fc2472516895a1e15f6a844f677415cf771a9b68d21e6733fc4bf54ad782c414cccbc141e1c7174c1ea95959ddb25490c0604d912787730b501ae2d1a42662605b412410456646237ec47ce214e9b790cc728ab5b14da1eafe4207d26b1c462409403e8e0c8319b9265e0e5bb20fdbc31a00c1c8d4b0a1a2ca00c7f98db45188a2780436d7ef644ecf44b17ab27d6ffc03dc32caa746b2636d9871b42ab34cf4d57daefd460d963a92b0bae43fafa0cee630daaca1fa5d8e3dd370234fa5e4320c67781bf6dce015cd9caddef983a19c9d78a994b3a8011f46d283039f981f94aa3944f9c7854d388598442ca241c4a83e1e36351125e08e56861e76d781ac6dc15dfa3a4aa653d0ae2c8e84f25d3a28065039848c96c3aefc7c99d6cd1aca98a1a024486c959c0fe2ed5b27ff4eb108fb5693bc54905c48ca4d760771b1defdfa1bf80ad945ae20251dcebc4574c425d7a9e107aadb51c39d85176d4677d85f6689c50f4c43c3ff39c88462a219bf0413c54b6ee808071df74733d93e40383795175ad3330c9f816f7f178c634c816d76c3e4cee6b7ae7f70e4bbcd0ea869a7029597ea9a5043526fc8d987771fd4c2ee27efa70f3fc444cd718e6515d78e53e57bb1439d5870b75d5cbf7068e6433812c95b381dded998e73e525caafbadc27d7aaaecf0b366e51dca2032132b1baea702fa856650e7de6c25caa5465afc3b0d725f0f93596f3462fa1b09c90a27f36be6f081b3534aac2e0d88106456cf66b14dc78ad3ecde6ec6b9905842e194ddb9b8915adfd2a1b0b7eff7d8618836bb207656bf722a31bd2765cda4dc063aac5de1aa15ebf6cac738e3f8832fe28c177c543c671200d15f1c488705405dad76efdbc600acb11ad78f75f2c952c375ff5c086f09929f888e45cfc3ca7cb4f7ca063da2723fd8d8f3377d948cb64fcecced7e24db6b7ecb847b89f5dd06626d5aa045ee6bdf6630fca5f74b1851b703ebb2bbc7434ab63b29b016ac83a3f5d51d10eb0a0fffb83c466ad2e294efddfe3ae572110133068bc5740eef905edd3cad1d93f227e2481095287f3076ea014baa79b1fd2ca98a35904cd474df0cfa59d64d9c74c31ce5bab182508e23aa75d96873929d081ca8f067a256459348149e6bd9b9a50546d203a2c847835c52c42ea850bab2064d4b61b0202fe0231eb620da530a20321d8f31814ec2cf11a7feb147d4fb1979ee60fd1953845bde81f31446220381d25c90cd1b4b24056a00a4467c39b058b8d34bf40a7857429e18c7d1207539d9334c02e67e729c00beedf9d42e0613f82efa7bb0f1315b02731779ac3b47817558bdbad3adfa1e684b2d6162c3acc872806771ef47733bbfc0ad1cc2cb03935c544730ed5bca03ab14cd849aed2d68e62511b281437ebc92b8c33715e8201778789015ec065868bb762c1007e51c723406d935e21849b385704dffa9e7ee5ecf0eae4d71d240dc5e6876dc003ad3f2fb22c0d5bcdc8273fad2d8a0327cf3d0d4e8672d21897670f53e1fff5b476471368e16fd1e34a8161d1462b8aff85b9030c9d5cd7ad5c9c4b696d02c1100a99200d9865a23aedf74264e0c2499b1ca7848b74db0258f75d46513cfa5ef3e07885e848a0f59ddb9b30be81ec184265ff25d752b3d3eaf3f51d3fc6ab0daa9f88c55306d894fd09021628cb6ab04783610e492660615e753ec6fc8894fb11ff62b0dab9def962e5b11d694c791b0c8d9dd28957933661f94874fa99260fe91cb5a3a7b0e2add0c396ea068006f9673840b08be15761286b7e8de9ad7aa0c9e2e94df0d38b31e992302083dc7cd700fb7af2ea7623ec64fa5c20b17c73828b546d342233c62a728da4374382f5218631d497d6b959d66a7f27a4d8ae6a4c149f1e246bc107b540736556dc864b47efbf7c0dbb764fd24bd194d13eb875e7d0dfe856267218f8ff7ed20ec5047cf8ee34177ee357b9e39ab162bc67e629e3ead876f90101b862957099ed494c2a2a7a0774f1f8764095a2e62f539696fc62363ed8470669744466d6baf427dded355dc6ccaf73a1d1723383e5012dc0e0f2f5aad3039433bc93974c28c64011e2435bc77f33116c3a96aa0088d49f784505c7ed8cdc4965699b0389791e436f05188645d74da7a94e21df5d54d70f7b6829c46bf28fe0cfbbcd04358222a6dcbd3b769e7848560318826aba303d9a193075f28a4857f4aead5ef169060b70b8da9fd2091b0f618c60d9e85935a10910ec2fb8ecf91d6166a326e29433e8fc64e368bed51fcc8d2f07be1a96afe2ac48d42135a6e7abb881e1f57a9bc16fb3389c598415fbe22c9ed4974d2c43410f7a1e0c10e4d31bc69e63764629ef8636f44a75d7ad475cb612c8d1dfe5616e8ff8af19d38d26d4896a66be1c935c14eb47a1c4d2d4a2983fa16848faa6ce4b1400cb4363b5a3b3f6a3661a59b79647e2fd7170222f57c2bf3309fd1c60cf1c0d09a8f4f4145c909455e152ac7b0f43f3e12be5183adbb911bed2635a6eddbef251895cb2ed683b5ae0a844c7a8f82a3aafcf67439b4e2f1ff90d7e5903a09a9434c5e7ea17f605626c0a94c392034744ef66993633b4f2c595123d70cb3884ff65457c6c08dcbb77fc197397b0db86e5bf6ce56a9a69191475db399eb77bce2fc60c309bebb65c25278ba08efa58c89c32a034847214fb56de40da2e68da001f9377c235e702208abbcab55c9a4f6bfa0e76b55b46ae1288a5cf1f8803360e2a30d52187756008c0ebdfcd46be9f39883565b882ed6f4d259bcbc529977d1ca0aa787fec10803c22fecf574fe0309fd17f94d429b841fd9545831ad0e291efed1986d1ba13eff0c2bbf1e41463184f0bcf52b01e359e3c74fde644cc716e2283821e82781a327bae315b2c35026e964e10f8cbf87c4d2849f94a3214b4c637ecdfe89eec96acd35e0db245d211b61ca03b94b3335ddcd217d92e46ec20e941728fe10404e90b44b1bddba6fb29fbac95ede415fca0051fb934ddfa0446097849a6ae72163527cc4813cae5565020797c4613204edeb6f305d08e68fa119e24644c054b8dc0f8417d5e6aac9405f596d1859ee13f2db4c2e7eefe8b606b3bbc12277bf43de23bf252d1881d6eeaf01187af38d9eb037e7739c9f454b4b28661edfc41322ae4fcd6bcb51c6f901f0feda2054bc6c22cfd418cda483e1c4db2b87e88af46ce7aeb2f18ac53e914b2da4495a4650b7f35a6a4266cbbe65d004ecd0bae8d076022e1e16539122af3afcc264c89ce2ded1ccf2af28e47a8919ad6abb96a50a8c527e25469adb0c8fb67e2c75662fbe95377e1ac29fabe53934b60b30a4d47f36af61c8aaa7a1b4b5386a8f53562ec0d45cfc5e0bb5acb03a1e529787c19bd6f4d78fc0fe092550e3175d6446a28ded9a0aa17c42a3cadc35ee25383c51ed059e725b52e4ae2f588e03708df34e746ebd25fd5248698a39dabc8c1c8252b437e85ec2c0ee4057bc49d3f6172cde25bbf2e7da8596881af27499b14acc2ff588c29ad2e47b194a074a933c5df0b6554ad3e0046570b2b8fc50c1969d09f447b28eb8849ef6e05133541f28528fe202f489efb221242282576303e8d2b55dd3a5b97fb8faa36caa95e4f5e7efa4392a756f26469511a353b889b05e085e542a5fe77e2f85f71ff2aeb1521bf0cfc2f767d4e29b32cb4cd7e4d798b08e29785f142b2ec4244770a3da2b60f76914eb08903d1bc27e48b40e71774d880b3d125cb233e9fd900f035cb03f921d4920c4b3554b44561828d2e411bde432a1afc82dacb0bfbd51b8cd3945b6015c835045433b658e2521626be1ca21bdd6772e4204a08c3e2054ac99b339c2fb2f4faae39ee12357594620477cf75a1c812c13003804d4fd6d842c36c26ca424f29d364c4586833a61fad405b0720160da181681cdaa596c9bcc91af8f99ee7d341ea07ced018e2ed825b6e7210bfb6052f8ef20fa75341eb5cbb58330c3f5196ef87fd628db3c51a186414c2ac7d6657220865a6d44a44e8934bce3c3a69444b75790c6bbf6e30f2c9911c7ce8daaa36cef8bdc71f1d1502ed97e5b53fca29d34b920d71a83c4dfb7def31e51e366b8da41646871157ea88defd1c11c3edcd5b5d0ff65d65f2f341f596e240e3361402bccc3ec41990a670aefd6583a999071dea22bc64e1c913b1d442e75dc8bd2c29321d888e030796d707f87862eaa0cacf8cffe503c647da525d927429a298691875cf7c149d93f182174cbb19d75f2427a41d37c35fe1884a07b2cc1e3a012831399bdccb81e75eb0a5813ce9f15a0f9815dd719db07f023f21ed57035016fe64dfa1e6481ff0b2d4370e10665b97c8d344f3b737ae9d436b36dfc55e1367b2496f696318f3451cefa7c54331eb799b5932e59b16f709a097317538cb74744abd0d3ba0e3f5f2ca8a0b659481d009de0b41f74aa196f5cd5092e0fdbd12c457243a2bb53f7a82272c78b4b3e7660c543b50dc3d43f67ef070eb586fdde0303d9c320aa09f141cf52e8ede26da5736546bec523977679192bb2a8a4643edea677b760e4603d51f9c913c478cfe4b51c7b3b570bd4436cd137cdd6afaf919085ce3f665b0ca6919a44db68c5bcf52d6c9bc726c7a423e855233845ecbd81f12a3b483c6b888c116debaadc73c09d85df99929165395eb943c152870165a5cb77b307859846f0c45236071ae9575294e024ba874d706202eac2c5d35692a907927f333b5541690b7d5f3df9c61e71d901bb244e503b9e066a7eae659fb963c89d13654b4e7e190967172dfe9e9850b5027920e6a154f9b95d389f900c1c1ea8c34e9c5cff805e8aebfb5d03ee59114dcfabb2b5ab52504a2aca68d2f6dd02bf05aec06bdd16992487284246f2e51591db6a703e656d41ad30641ee8863f999cc24d5d87d4608efebe929f3b5bcd21cc94a55a4e1ffab1a1ea82ec6413e1ff877387424c705aadfcfc9faf7b63771f3a53110e46a0c0182a19cc520f70789ff6a0d5ca192c27b046034b245e9d0167eec27a59916f58b341c2a67ea7f4c20b4be9f23d80b600394f6a008d01a7af027ac4abca71ebf937d7cf340cb302be68f5211ace5e60847d2304e538b5e08777c915f871c046b28695ffcab3f44d7be40ae987485d1a30dafd38ce2269c5424572f75645f658d492e73d1f0e536d54176a0a545c740f646758ea1874ec25fd0fa2432faac82298ddb781e017673ac46d52de770770b152f83b9209ff0b74120ec7a2a86b43fb378391f73cbf407d90c740cc9fd86252b027756512bfc59983d838faa38d243bcaa3c84074ce71e56c0a6ef0defcd9793ab666e72c85ed45e7fa021ab73939f6d2cdb52c5ae7c276c89ac4b25d972321a5d06c5e3cb06d3c74a1d82f5cdfb17a8ea1f770d73ac971124d4f0ac754c93e4cbd6b1ffc47932f0e8d48abaafd3f813418f461835f2bac7784d3c0be25dd61efc05c86bfbd94fde062fc48495e6cedf5315385900ebfa036071320c379573e8eff85a1b3fb11d32dbc97a8286834723ff93eeb3a94e88bcce516ad07796101cbe64f09abc5a96c13c248f9cbc6ef8e71058ea508cd6d27556f00ce0b0ab31226966912cf6c4345273848016a9e15a9f5306dfcfcd56c1310dc55cdba57d64fd5f9629aa9654279fc09c2c6420582c8ef6952de7b1a0f8519d1bc251e70ea44d34a25673d02cf66378371fa5979cfd4c4604250ee368e889bd1b34b4de5a18570619d4dda1d38e848e129732fdf6a86771c3f584439c9e9bf3a084f57d499d89aa26652ab87fdbee1de27bcf846afd49c400ab268a01aae34c899887035d53324f6773eac5e5fedcad135d2323e762954c666e1836ae6da5f1e387a2f81705f181dc6e398564adfc7f2eb60716974f2c4dd0d62cf6602b525ec7ab83895f4fb826994910109a410830f10b2bd9e6fef97c955b6ce445bbe0945b0a096d705be295b45e34e880ca6f98b320d9d3ad48ec5524ae8c4999bfd7346c068dd7103486022870337f6aa4ca217dcdaa56da838d8777bfaced635ba0ce7e5dffd27f7baf829bf96c1f46989938cdb73c09f161f78aa744a8eea5069de8b70e3beee18230ef7ec7762b2e89282941ced2e49bba27c29d59d79d797fa79f78096c8bb468c230984559ea3cab1506a15e8b5e474fe4f57eac73f410eda0e8eea19eebd33aa686d5b8987ee98162e5c718892f6665de8fd5d1a0d4b46fd0ea8469f210e04664d68dba0abde9921699f4e08448aca1dd9d3300ba49aff711af4f54cd035b14ec5a8bc3de132168cd153e75869b6737122f3e9923301a973ab07575efa1bf2333e881a5ae210296ca01d0ddc5da6fbca9211719ca2bb3a3fb11092221d0f1b5c904c83744d73eb12bc4742e0cbd0f00d09a11690e06441d21716fb9566db2d1a1360cda47bb486b90ab5155c83e28b4b22f5fe3a309c88ae0fd5190d2cdd0c9c3c41fd23389cd00073693daa62010dac8ee3e1b41db9032c1062e958686a531f72c102bf4964c2aea667bccc48c57ebfcd8a7abe0c9183643815084bc9d6706c3d7e04c328a451a43ed9017d53d823e3b6738d5d596820c633904923d46dc81e7e96ce5a055a8dd159380e16443db9305ee7a6e89608c288fc6920308a25e461d71833e5c530d528cb952e8c9279c4b8e73c0f89fc0109daad0cabf91d67250ea23cf92467bf9c3ddb65c0495bb0c7c5eaf14a018e57e48c3bb061daf5fc24fb075fff7a59f159d7ad39ca44454b5c5ea8674417f307501afee4fc09893444432d1b1a5076381c6a16b27e96367cfe99e57994c7da66784f60fbefa602b3b8402a684f73d139e94d7955c5e6e471194dfc19be0efce6790e34ebea1cead0dc98454fc44096776ef3d0668ff272b4682e92f054a12ebfd163db58ef5ec263dbd1ed3291644ac1b682f7fc1a84a3b298924b02f0bed23ebe0311d22eeadb98f56aaf6556931b4b41c8f0d2f86f618e401e487f63ad1ec34fc1a3d5396e63b34262fd22df46667b459974ee272e78419e6ddcd71e1717568a9ec7f5cefe7d1a0bf5a0dc7e2b23b5c3faa9e14708500621909464c8a013ff09c6457e8b6a504545c081cf11b47c49296d34e3dbf7705f28efb90f00e6eaf49cef89173d3f3df7fbc59ece132cd9fdd9e2dca744051af7bb1b8f47b9b50495f286a19998c5135d1a3135db64974f26c9b5184f1d7ba2500dc63748278182ce1a727c878095ae2cc173367cec0ab96674734d7ad103f8d0776fd0990fe25a8f75ff427304206560ad06fb820c2c3695b5a3dcacf677c24f181ee66ef8c843440f47c215b6ec16824498eb699eaf8aa000190e6919098724474ba3ea46924373060bd31883e710ef27613c5d8780421d97cd391f6ae088af15c510975f4d8b603914f024c43f6e8ea3d31a88f5bfb4cc9e46770d8f7c7b425ce3f72a1b4d59b09bc43fb53df25fed3bdfe59e43e710f8b3b69b23fc9a42c89dff084ff291aba229d03631b466360fb25f0a1fe750fd7ff41ab7ace956b8bda9bfc7ecc49619e8039dcba8ce923315ce8dd4ed5a7f2722c22a5e3e05e14b3da01c5bee4f12d4bb2ab42f4b3a54b96a60af8bff109ad7d1c2a67e37c0fb674077b2759b1bd8761cdcc80cabc71354d64618cc45efed1a631f3f9083c3d496d8bdf0e99350d925a77e3edc9488163edb2178e10920ddc127cb5acac7dc420e1958d404a7311352ab26433f4885e3870a078c2910c226c4e3b0e624337735007d146a6e23b471635da9d996b0a56079c6583081b564b78539e72b15c969f15bf701a8acf98ea794d1ac7d045216d0f4e5657ed1c4d246604fa327b5e392161f288930cf12d6c34b1d626c53ea7744b5a2627948c59b05e2f12bba617d1a469f4e488fbd1ab083fab1f013025149214f1b9754f39bd267aace6742cb49df1571fe47c1a6e80164a741e9141c2e42eef8952217bc7c80b266b742b814c106fb1561291d377df8ad6503098a007934db960983edab9fb48232928b8efafb1b90b66884f8adcd8d025749cb074a1256f68977471dd69ed16f61b9fd309dcd34a6dc8518bea4593c6d4d5aad6e79373555086182cb05e2e40984b0ee05d9b46660b0790dbcaf05f7fdc6d630bc48bf1b454b1eac91de8b28d076ea1afc86205150f63b52790a15ef889c616eb7c1e31386d631186f6315e0b396416997ade26098f76fea98884fe2d35540ab3746f300d3c143bb1bbaca65f1430b5c06a7a64a0ff170ec8d26bdfb5dd9801ee6c52a9f0d7ed9aa51fe71301416936919abb495f660633b340d14071528d8dca8bcbc597e1c6efa7fae6e26c5d9d49a99e884ffb9667f8d65ef5a33286462df632d4a0770b8c5cabffcadac3818b20979207f110d6627c835c91dd048eadd5369bbfd6870ccb073cb3147c0a753809253033c9f5b7b1f4268d248e94bfd97e4070ba7e68a820530e93192712eecb572a38d03fedded7994d4bf5d5b40ea621403622e59ebcef5635d779355a8cfbbb0428bccc1842eb4e48a9efd482f68c220bbe8e610181d899ec780c7b14330ed29f45ebb63292f510291bd7e55b4c5b0992444dbb795c0cc9b8f822c9280b18e3eae6176ea5baa46f5949a65710d1d149e0ea1b831c2273f92938c6b23cf7933b2adec3982c44a3225949d50222f6bf47b4f709a163c9304458fad159fbd3925fc88d98edb384518fc73b0390c1abcc71be13b20cdb8a1f28262fc0b2052cf4aedaa6db7d07829988dee12fe03f222f9d9f7efa91abb8e852d3017f36f7dca135b1845e406648efd1bf3f607df77bcddcc2b62b081d343fddd50c928920a668ede8986728f776407e5b7c27d29552c3ed90619b736087189c5b89e08289b222b353f6589070210262fea3009f31bcabc9e0ba8b25a87a2a31df360f04cbacb2fe18041737bb4b0f1bf628454d4d53f1b26170dacb2839ab0e6cb70e69500e7c723a706ed6270fa544801c3ffbed99bf3efb32522b10ab3ea0012571b213ed4bf62eba1d3c93585eb7cf6db7b69620ba982531804903a6d23f58cb67c1ffc6265c5e0b3f931e530dc7b8e61c6dbc5d8ba1a45f79fb71f762babb2a4f35906cb0f08af448cc0c373923ae3fa8022db31288a82344985c9483d6fe272a0d4bee7d327e8227f77bd108146089448567c53cf37230e3defb526790c54495a70bddce7db40f64af5ab134241c48b00a03f72ddb0e89175f59919f915b8d38cc6dd6a518ea7813caffcb6ff7946d171031a24a9ac27aa101f8389a2e6917c04a610b6486d3d82adb28935b4297e2ae673e290ce42911f68c5ffa78c91ec1c733cb0330d94e78d88e6423a3c3573d4ca2fe6d4afdf6b0bd48d5225e1599e4627efef93b3174b3eee71e4d8bdd5a78b94ce6e928288eba73bb2c4f0b7b4399af5c0ae8a1d20192954205af6ebaab161553cbb334d016ef1a85f7dcda85f162621ca72ce01075d56846b60a3aedfd918f9e90d7157fc0a9cb9e8e2f1f9fd66b1fef7349a7bd4047b022f8212d9b58b2037fdbbf6cbfac63e6b3c63210cb0256d7c811a047454f7b37855d4b7d80d8e362cbaa437d55cced0dc0e1c48620022b0916ecfa91ce8e83f6d68e3d480975debb7901c36639e7cc0dcddc054f64aa85155dd7009de5a750d734d77822d44c31e3314a3bab0e629ed807b3c96562c5b156312cbb0f1e6b03b7b09fb52cf93620763248b527c10586d38eb9f21a22d0660508f68c3c4ef799e6499666440a382afbe5979d99bda682735e66161a71ee668fa6569fbf7a9f576308e552664b8d7e2306864ba8cc8f0c542e4e98e276791b80035d5917d5d9f943540f827eaac1b631070d998a3223b81d6f30d740f12a93e3de7afec0c0c0caf2a5810a4e45db6bed60b51194c5886a612c4e4bca6c5ddb5e98a2b5a1c944d4936410de820633c7096bfc75ae6854e59e080c0a725fb990a69356e49816c7bae9605147429712a89c820f2da200307986ffe1a0557ea85460c0d475fada25feadd125493f9f1939a51662e3fed57ae64b7aab0ddd20d47167ec2f180299bbf28b4335789f1e4d9619cd0d67fdfb14ec6b6edeaf30a1423f35b923d917ba1afdc9dce176df3745d88ba31138d072561c66e371850f229fbd18c2f8e50f30a7bedf09bd7b2165774cef83d27ecb4ca2349b72376a1eeab5cb4388ffe0634ef8020c82fc414c0cfe9cf6078d72cc62cd9759bd8431be7940306bc206c9d05cbf30d0c68b28f83d506c33130c22867f533746bc2fbdcac6de5d620a39bd9b0e083df4fe565ba19e8afe201392e9a124214f6e2fa76f85899a9647a7fbd0e30292ddeaf33b22e712812709b67a4c77a2acdb784fc91ad5fcddc92df8098eb09554c8a8c04cdad10d5a77a4b37b3c265c00ca61d7f8b9fbaa3df5869aef253b54ef03258fe40b0c3bb65b4382f097cf3a7be0b9fde9a4df901fc1cf0c7c08a2454946547e520721288687a2489ed2feb6fdc37ab2c0358b298a6fca047dba8f950d2bef63efde4215ebc624f1c5e2bc8e8a8522094219813672ad789e3292be6ceb53c93018a44f3fa61cee8d535f9e30c0c25f3ea6754e7e88ea9396bc231340fefdb13f67d11b270681ab7a1fe7689e921c1ef983560924a37c0c62df91e846b14e0cefe21ba6f80150f33910d1e443a55b18d59946c89d16b387a4bc267ef2db1d514b2ad4bf659f646c5d87886f25030f27df0a776a6564c747066f4586362c580f0c78d33fea47a5accce78e1c818370765861ecbe9a2cb5b904ae9b769ddc3ffcd01d7e9d8723e7f39c597a58ebc5fd31b034c562f12d039af59ef524f5ba206ba2de3ae19f96b6168ac28a63a5bef9e9723e7db963769f3a46613c66e6c6df0431ac69231114a479e5bd6a923fc864dc138e334ab491ff6e48495816d41deefa5585d06d11c16031ac050f26ff4e37fa0bfba3a84279fa3af7cf9afca5e599999264dc8d7a23e095ce34db4e8072c4d86410e9ec0754069a87021f4402c4928448c8fac894c003facc4f1562a54c9a60207930c54ac38226e5841ecdb38b1ea3f9878fbfacf080d71f6eb8e467fb73b967086449c10085c8c1f258d99a8b4eea0ee14ebae2823d5675c90d55b7c98e1a609a62451b3ebc13423a03b20c99c4e10138c703b227555469c539a8a9ea3c7c14017f6a9d429a50967d250ade5d6bfb121e608ec877014504fe40a5d36f8e966c42fe737eb44fb50a087922a58f874345509ad6a56a7d510e2cd887a180937c156ef68faa79253731d6bccdea898e8bbaef474695f16c86fb62bbedfb9dfdf8a378bd5f2acedda5d2322164df11c2062a5e31489e274b55c72381f4a762aaf05191e135abd6724e26f62686174335ad60f60dd8ded5fbaf1168a668b91d5beca77bf7c636c225faaf57614cc7ab0f17210c45e1b0acd8017557fbf5d7ba4b179700c2b5dc81c284077dede0a5518984783b555bf74acead54b659831e63df2f68e17bba67b370e3550e9f54c2afa8e1964a0f0d6c9dd466f20b47be8951a5a6bfec3820acaed73906c58b64bf68a3e4b2c23a807c87e0ddc0653cf8f625271b0582551ead37c08df2b1406490dcee6715ece2089db19338532d5cf4777a996a95d655f2b72a9efe484c14fbd38f5467c06e31c50e6adcaab5a88c82887be9c556b8e1921976b998be30653b93f7fc9c68c69dc6607a6ae44604c6be87c6366df359e61a9dbd09d686c43c41421c7517ec7356883481a3953a2e209d0b20dcba4924a3c66805b50001c8197ee1d676b004a6f02f5593d285a68eb68787b2b3d702ccb7495ecca90849da474e4a71f1589d61aec29eb4b369d0259d3caa370622e9a124ff519d834f8f8027a2f13f42d47353c04885d4bdee26a5480c0d7e66318fa36985f8848498ee6934f1843a63dd28ef662571f752cd76af97d274c2046c38e5f32ea094952833e90e30282b52ed1bc1e55b8efe2fd1600bf71499b08c6818a3d3d2adc49b5ef047b68ad44db82b47b22098edc0ca172f7f5db7d2a13f615760645191189fe15a3d3f7cd3c6a7d2cc7fac2fdd9c4885630db04778991d5cf697f670bc8ded0c15c5b5b7ccbde4b4eab71d4dcce003075292dc68c5cce193d1acbbf51dc066e76451ec1909d77d981ac7c31d46222e2e1297ed004b1b315b4b21ddac02b16d15870f65e39dcd5b35feaac99fffae68aa7799f592d68d0ce6d5b96d04ffe4e6a3d5788b822bcbd2fecaa6b0cf0ae73245156890a4d3e8c361b8b15fead793f06d5888b44ee1526547dc29bbe6e67ae5ba85cd9cc80ba36c63cafd123a9a61c4fe783ae7f71bce8e5e1065fb171196931ed2cd67872505899eadd30877a9451516bd63abe9adc1911a4843f2bd8efc9149bdfb98fd11b38eb5d7829c993ca987d3acaaff89bff71d89c355454f26c0fc14cdd8a95405faa704c58be8416070bb64a66b308539feb99e366c80278fd08cfd36d16b1610effc9dce0c191a7c7d70335b4fa63aae91a0aff5414ccac4776a2c52000976830edc93ebeb54014eb69d1cef86834bd60ccadbb160ff3c28011245533608731f80226f905c0aa1ac641789e4e8e2de7a736cefcfd5fe444ca8fef956666e4ff817831b04550e5dbff1ee418fc879107d597d624c66165730f15be30ed53c6446911616b9d95ae564fe2526359ff01b262f8b942b5359e0b83d2e00f9fcabea779038c55ef992a3a453f161cce3ab67cdf6e55a0fb6774bca33d9660064de8318644db8a4fa7b4aeb05064cd089a46c401f2f3c700d50814fe565c8dd1dac06108e42b79a1d71b82f93894f4f8c71e460fa4de8165bf7316f5a8d50b3c1e043ce1badaee72ab307809f9a069878812709c45018fb4a9c001b2c701f7d845b4948309edb562f0fb70b604f6b8da688f5754941d7d837c6638bfcd986082ca9b4bfbcc7b4ce56fcbde46a68f970b9a02e75c2f7e5e79f58ea8341505bbdcd475cd0e0974d8eaee17002221dd4c697c9158911a5586e6e0ef1c447f78363cff302dedd5f99e09495640a24ef71beb2d7d4ae00e947d39537f24d6510345a6e3a8d1d7713f3cd552677de6bd1eb17d7be96622964b1994af2ff69b33a7f49657057c76075e89b72648bfc8c7abdcaa0ae21624d7b82bc5bf7fe9cbed5f4e31e2ba6f1efe11831cf97fed466bd9945f5928d6e9c0ed6598975564aafcec80a699e7a8a67e83447e476caea7c503e727746db95f63c0c2c8a6ac0e350705367b6091f14b4655db565579d1c236f9a989a53452fa978ee6d05652ceff1d58ea36b5c7c9219e68871ff053b001966b3ba96d3bf5b6b17bf99d5f15aeaa3059bc19dfff15d8e6fb7f576f59a91ae35dbd9ba5135213bc55504455d12a213c29896f8219157e8e7d24e90554a7cd3ed12d995e76a726bc7673e50ddc0589a3662c63be06433fa5fcf0ccb83959a62c703e2ced66c2bf2fcf328dfe3e08296f1eed8992edb091fb2ec996e1c9e8986c69c497c290c6a76287755238480a0104c585d71801ae13d5a87d90050263b44b08ebecf987629a6c3a26ae5bbbe627de2ebc5bda00380330f2ff9ec7ae51eb54bdb9c87ce2626d3f328c25bee611d5207eeaad10e8cb5bef2401fd61902387c2d96cde71cfa5b2457335adfebaf6c1dd441f5&lt;/script&gt;
&lt;/div&gt;&lt;script data-pjax src=&#34;/libs/hbe/hbe-bundle.js?v=13.23&#34;&gt;&lt;/script&gt;&lt;link href=&#34;/libs/hbe/hbe-style.css?v=13.23&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34;&gt;</content>
        <category term="isp" />
        <category term="awb" />
        <category term="mywork" />
        <updated>2022-03-24T13:13:38.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/509c7bd3/</id>
        <title>自动曝光原理</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/509c7bd3/"/>
        <content type="html">&lt;h2 id=&#34;自动曝光的原理&#34;&gt;自动曝光的原理&lt;/h2&gt;
&lt;p&gt;曝光是摄影中十分重要的一个环节，它决定了一张图片的明暗，如下图所示，第一张图片太暗，而第三种图片太亮。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1420210914131959.jpeg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;曝光由什么来决定&#34;&gt;&lt;strong&gt;曝光由什么来决定&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;使用过数码相机的人都知道曝光由光圈、曝光时间、ISO三者共同决定，详细的关系就不赘述。&lt;/p&gt;
&lt;h3 id=&#34;光圈：控制进光量；&#34;&gt;&lt;strong&gt;光圈&lt;/strong&gt;：控制进光量；&lt;/h3&gt;
&lt;h3 id=&#34;曝光时间：光到达的时间长度；&#34;&gt;&lt;strong&gt;曝光时间&lt;/strong&gt;：光到达的时间长度；&lt;/h3&gt;
&lt;h3 id=&#34;iso：增益；&#34;&gt;&lt;strong&gt;ISO&lt;/strong&gt;：增益；&lt;/h3&gt;
&lt;p&gt;但是对于手机以及其他电子产品使用的微型摄像头，光圈大小是固定的，所以手机拍照的曝光由&lt;strong&gt;曝光时间&lt;/strong&gt;和**增益(ISO)**来控制。&lt;/p&gt;
&lt;h2 id=&#34;什么是自动曝光&#34;&gt;&lt;strong&gt;什么是自动曝光&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;数码相机中有一种手动模式，可手动设置光圈、曝光时间、ISO来控制曝光，该模式的使用对摄影师的要求会比较高。另外 数码相机的全自动模式、光圈优先模式、快门优先模式以及手机等电子产品的曝光都属于自动曝光。&lt;/p&gt;
&lt;p&gt;自动曝光就是相机代替人的操作，自动调节曝光时间、光圈、ISO进行曝光，使得所摄物体亮度正常。这句话解释起来很简单，但是存在两个难点问题：第一，相机不如人眼这样可以直观的分辨图像明暗，如何判断这幅图像是否亮度合适；第二，如何调整曝光时间、光圈、ISO,这三者调节的比例。&lt;/p&gt;
&lt;h2 id=&#34;自动曝光的标准&#34;&gt;&lt;strong&gt;自动曝光的标准&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;在此之前需要了解物体的亮度与色彩是由物体对光线的反射率来决定的。例如纯黑色的放射率是0，纯白色的反射率是100%，处于中间的灰度的反射率是18%，这就是18%中间灰度。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1420210914132002.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;具有一定反射率的物体在最终的图像中被还原到了其相应的灰度级，这就意味着达到了正确的曝光。例如摄影师们通常在拍摄之前使用中性灰卡测试曝光是否正常。&lt;/p&gt;
&lt;p&gt;但是相机在各种场景下无法识别物体的反射率，因此采用了一个简单粗暴而又行之有效的方法，统一将图像整体平均亮度设置为中性灰的亮度。该方法基于**科学家认为自然界的平均反射率是18%**这一理论。当然，这个方法也不是走遍天下都不怕，比如拍摄雪景时需要增加曝光补偿，不然会偏暗，因为雪景的亮度远远大于中性灰度。这也就是摄影中的一句口诀的由来“白增黑减”。&lt;/p&gt;
&lt;h2 id=&#34;自动曝光算法&#34;&gt;&lt;strong&gt;自动曝光算法&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;上面已经讲了自动曝光的标准，也就确立了曝光目标，要达到这一目标还要自动曝光算法来实现。&lt;/p&gt;
&lt;p&gt;目前比较常见的算法有平均亮度法、权重均值法、亮度直方图等。其中最普遍的就是平均亮度法。&lt;strong&gt;平均亮度法&lt;/strong&gt;就是对图像所以像素亮度求平均值，通过不断调整曝光参数最终达到目标亮度。而&lt;strong&gt;权重均值法&lt;/strong&gt;是对图像不同区域设置不同权重来计算图像亮度，例如相机中的各种测光模式的选择就是改变不同区域的权重。&lt;strong&gt;亮度直方图法&lt;/strong&gt;是通过为直方图中峰值分配不同权重来计算图像亮度。&lt;/p&gt;
&lt;p&gt;自动曝光实现的过程：&lt;/p&gt;
&lt;p&gt;第一步：对当前图像进行亮度统计；&lt;/p&gt;
&lt;p&gt;第二步：根据当前图像亮度确定曝光值；&lt;/p&gt;
&lt;p&gt;第三步：计算新的曝光参数，曝光时间、光圈、增益；&lt;/p&gt;
&lt;p&gt;第四步：将新的曝光参数应用到相机；&lt;/p&gt;
&lt;p&gt;第五步：重复步骤一到四，直到亮度满足要求。&lt;/p&gt;
&lt;h2 id=&#34;曝光参数调整-曝光表&#34;&gt;&lt;strong&gt;曝光参数调整_曝光表&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;前面留下两个问题：“第一，相机不如人眼这样可以直观的分辨图像明暗，如何判断这幅图像是否亮度合适；第二，如何调整曝光时间、光圈、ISO,这三者调节的比例。” 第一个问题在前面有过解释，第二个问题也就是自动曝光实现步骤的第三步，曝光值由光圈、曝光时间、增益沟通决定，当计算出一个曝光量，曝光三要素有很多种组合方式。一般情况下有曝光曲线，每个曝光量对应一组参数。手机中曝光曲线可以通过Tuning调整。&lt;/p&gt;
&lt;p&gt;From: &lt;a href=&#34;https://zhuanlan.zhihu.com/p/33462189&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;积极的悲观主义者&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;embeded系列&#34;&gt;&lt;strong&gt;Embeded系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/embeded/atom.xml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Embeded 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/13894dce/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;海思MPP&amp;amp;UNF构架源代码级分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/6b2ba137/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3G,4G,Wifi选型需求分析及技术简介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/509c7bd3/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;自动曝光原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/798e6e62/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ISP 数字图像处理 算法概述、工作原理、架构、处理流程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ba4ef326/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;QNAP添加man pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdn.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://cdn.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://cdn.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://cdn.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
&lt;script data-pjax src=&#34;/libs/hbe/hbe-bundle.js?v=13.23&#34;&gt;&lt;/script&gt;&lt;link href=&#34;/libs/hbe/hbe-style.css?v=13.23&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34;&gt;</content>
        <category term="3a" />
        <category term="ae" />
        <category term="image" />
        <updated>2021-09-14T01:25:00.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/6b2ba137/</id>
        <title>3G,4G,Wifi选型需求分析及技术简介</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/6b2ba137/"/>
        <content type="html">&lt;h2 id=&#34;3g-4g-wifi选型需求分析及技术简介&#34;&gt;3G,4G,Wifi选型需求分析及技术简介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;文章写了好多年了，只在一个网站发布过&lt;a href=&#34;http://bbs.ebaina.com/forum.php?mod=viewthread&amp;amp;tid=14995&amp;amp;extra=&amp;amp;page=1&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PDF版本&lt;/a&gt;，行业内应该很多人看过这个。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关于本blog，&lt;strong&gt;图床&lt;/strong&gt;一般使用&lt;strong&gt;github&lt;/strong&gt;，已经配置了CDN，如果图片还是未显示请自行代理解决&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;原创声明警告&lt;/strong&gt;，本文&lt;strong&gt;禁止转载&lt;/strong&gt;，禁止发布到其它任何网站，可以接受约稿。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;用户需求分析&#34;&gt;用户需求分析&lt;/h2&gt;
&lt;p&gt;减少布线，或有的地方很难布线。&lt;/p&gt;
&lt;p&gt;​    例如：偏远森林，沙漠，海岛，土地所有制导致不能随便开挖等各种原因。&lt;/p&gt;
&lt;h3 id=&#34;–3g，4g–&#34;&gt;–3G，4G–&lt;/h3&gt;
&lt;p&gt;优点： 布线，距离远。&lt;/p&gt;
&lt;p&gt;缺点：流量费高（可以和运营商合作 ）&lt;/p&gt;
&lt;h3 id=&#34;–wifi–&#34;&gt;–Wifi–&lt;/h3&gt;
&lt;p&gt;优点：费用低，&lt;/p&gt;
&lt;p&gt;缺点：距离近&lt;/p&gt;
&lt;h2 id=&#34;研发需求分析&#34;&gt;研发需求分析&lt;/h2&gt;
&lt;h2 id=&#34;wanted&#34;&gt;WANTED!&lt;/h2&gt;
&lt;h3 id=&#34;3g，4g选型标准需求&#34;&gt;3G，4G选型标准需求&lt;/h3&gt;
&lt;p&gt;1：产品生命周期，时间空间的重叠。 初产时间较近，出货时间长，&lt;/p&gt;
&lt;p&gt;2：客户那里运营商网络制式？？（例如&lt;strong&gt;TD-LTE****，&lt;strong&gt;&lt;strong&gt;FDD-LTE&lt;/strong&gt;&lt;/strong&gt;，&lt;strong&gt;&lt;strong&gt;CDMA2000&lt;/strong&gt;&lt;/strong&gt;等等&lt;/strong&gt;），&lt;/p&gt;
&lt;p&gt;​    运营商名称？？（一般不同国家不一样，一个国家很多个运营商）&lt;/p&gt;
&lt;p&gt;3：3G，4G具体型号选择： 1：厂家选择？？？ 2：网络制式选择（需要选择制式尽可能支持区域大的，亚洲，欧美，日韩）？？？ 3：USB 使用的技术代差（1：usb猫，2：usb光驱，3：html拨号）&lt;/p&gt;
&lt;p&gt;4：客户3G，4G使用场景？？。流量大小，费用&lt;/p&gt;
&lt;p&gt;**注意：**可能客户那里支持的制式和国内不一样，我们这边验证的制式在客户那里不能用，客户那里支持的制式在国内又没法验证。选择制式的时候特别需要注意。&lt;/p&gt;
&lt;h3 id=&#34;wifi选择需求&#34;&gt;Wifi选择需求&lt;/h3&gt;
&lt;p&gt;5：芯片厂家需要支持Linux驱动。 芯片出来年代？？？，价格？？？，协议标准（决定速度），网络信号质量？？？，传输速度（不同距离速度，是否要求穿墙）？？？&lt;/p&gt;
&lt;p&gt;6：对应的无线路由器调试&lt;/p&gt;
&lt;p&gt;7：客户Wifi使用场景？？。 主要是使用距离引起速度衰变， 现在有2,4G，5G路由，速度有150Mbit/s 300Mbit/s，450Mbit/s。需要ap评估这种速度能否满足各种场景使用需求&lt;/p&gt;
&lt;h2 id=&#34;3g，4g部分&#34;&gt;3G，4G部分&lt;/h2&gt;
&lt;h3 id=&#34;中国2g，3g，4g制式标准&#34;&gt;中国2G，3G，4G制式标准&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730141533.jpg&#34; alt=&#34;运营商制式&#34;&gt;&lt;/p&gt;
&lt;p&gt;UMTS(Universal Mobile Telecommunications System)，意即通用移动通信系统。UMTS是国际标准化组织3GPP制定的全球3G标准之一。作为一个完整的3G移动通信技术标准，UMTS并不仅限于定义空中接口。它的主体包括CDMA接入网络和分组化的核心网络等一系列技术规范和接口协议。除WCDMA作为首选空中接口技术获得不断完善外，UMTS还相继引入了TD-SCDMA和HSDPA技术。&lt;br&gt;
UMTS网络优先选择的就是WCDMA，国内就是中国联通&lt;/p&gt;
&lt;h3 id=&#34;电信&#34;&gt;&lt;strong&gt;电信&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2G CDMA&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3G CDMA2000&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4G TD-LTE&lt;/strong&gt;**，**&lt;strong&gt;FDD-LTE&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;移动&#34;&gt;&lt;strong&gt;移动&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2G GSM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3G TD-SCDMA&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4G TD-LTE&lt;/strong&gt;**，**&lt;strong&gt;FDD-LTE&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;联通&#34;&gt;&lt;strong&gt;联通&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2G GSM&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;3G WCDMA&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;4G TD-LTE&lt;/strong&gt;**，**&lt;strong&gt;FDD-LTE&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中国移动TD-LTE：支持频段38、39、40&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中国联通TD-LTE：支持频段40、41&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中国电信TD-LTE：支持频段40、41&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中国联通FDD-LTE：支持频段3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中国电信FDD-LTE：支持频段3&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;全球制式和区域&#34;&gt;全球制式和区域&lt;/h3&gt;
&lt;h4 id=&#34;2g有gsm，还有cdma。&#34;&gt;2G有GSM，还有CDMA。&lt;/h4&gt;
&lt;p&gt;​    我们平时说的G 网或者C 网了。联通和移动都是GSM，电信的133号段（之前是联通主营，后来转移给电信）是C网&lt;/p&gt;
&lt;h4 id=&#34;3g有3种：wcdma，cdma2000，td-cdma&#34;&gt;3G有3种：WCDMA，CDMA2000，TD_CDMA&lt;/h4&gt;
&lt;p&gt;WCDMA（日本、欧洲）、CDMA2000（北美）、TD-SCDMA（中国移动）&lt;/p&gt;
&lt;p&gt;使用最广泛的是WCDMA。美国、欧洲等国很多是WCDMA和CDMA2000都有的。另外WCDMA、CDMA2000里面还有更细的划分，主要是技术、标准、速度的细微差别。&lt;/p&gt;
&lt;p&gt;WCDMA（欧洲版）：这个是欧洲的主流，也是目前世界范围3G 的使用模式最广的，在中国大陆，是中国联通3G （沃）的模式。&lt;br&gt;
CDMA2000（美国版）：这个数量相对少些，由美国为代表。在大陆，是中国电信3G （天翼）的模式&lt;br&gt;
TD-SCDMA（中国版）：这个是中国大陆自主知识产权的，可以说是中国特色的3G ，虽然大部分的通讯厂商宣布对此技术可以支持，但世界范围内使用的范围有限。在大陆，是中国移动3G的网络模式。&lt;/p&gt;
&lt;h4 id=&#34;4g有2种-lte-fdd，lte-tdd&#34;&gt;4G有2种: LTE FDD，LTE TDD&lt;/h4&gt;
&lt;p&gt;LTE FDD（世界绝大多数国家）、LTE TDD（中国移动和国外极少数地区的个别运营商）。&lt;/p&gt;
&lt;p&gt;TD- LTE是我国自主研发的4G标准，是由TD-SCDMA（3G网络）发展而来。&lt;/p&gt;
&lt;p&gt;LTE FDD是现在国际上主流的，使用最广泛的4G网络，由WCDMA演化而来。&lt;/p&gt;
&lt;p&gt;现在全球有超过200个LTE的商用网络，其中超过90%是FDD的。&lt;/p&gt;
&lt;p&gt;从技术上说，TD- LTE采用的是时分双工，而LTE FDD采用的是频分双工&lt;/p&gt;
&lt;p&gt;TD-LTE和FDD-LTE 是4G的两种国际标准，各有利弊。TD-LTE占用频段少，节省资源，带宽长，适合区域热点覆盖；FDD速度更快，覆盖更广，但占用资源多。适合广域覆盖。&lt;/p&gt;
&lt;h4 id=&#34;国内三家运营商4g网络制式分别如下：&#34;&gt;国内三家运营商4G网络制式分别如下：&lt;/h4&gt;
&lt;p&gt;联通4G：TD-LTE、FDD-LTE&lt;/p&gt;
&lt;p&gt;电信4G：TD-LTE、FDD-LTE&lt;/p&gt;
&lt;p&gt;移动4G：TD-LTE&lt;/p&gt;
&lt;p&gt;虽然联通跟电信都是采用双4G网络制式，但目前4G网络仅在部分地区覆盖，3G网络仍然是不可或缺的。而联通3G采用的是WCDMA，为欧洲标准，是技术发展最成熟、国际通用和覆盖范围最广的制式，目前是国内3G网络最快的，最高可达42Mbps，在国外已将其定义为4G标准。&lt;/p&gt;
&lt;p&gt;综合以上，选型推荐。&lt;/p&gt;
&lt;h2 id=&#34;3g推荐选型：wcdma欧洲，cdma2000美国&#34;&gt;3G推荐选型：WCDMA欧洲，CDMA2000美国&lt;/h2&gt;
&lt;h2 id=&#34;4g推荐选型：fdd-lte&#34;&gt;4G推荐选型：FDD-LTE&lt;/h2&gt;
&lt;h2 id=&#34;wifi部分&#34;&gt;WIFI部分&lt;/h2&gt;
&lt;h2 id=&#34;2-4g和5g究竟是什么&#34;&gt;2.4G和5G究竟是什么&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730141643.jpg&#34; alt=&#34;&#34;&gt;   以往我们一直使用的Wi-Fi大多数是支持 IEEE 802.11n（第四代）无线标准的，而且工作在2.4GHz这个频段上的，所以称之为2.4gWi-Fi，但是严格来说工作在5GHz频段上的不一定就是5G Wi-Fi，因为IEEE 802.11a（第一代）IEEE 802.11n（第四代）和IEEE 802.11ac（第五代)这三种标准都可以工作在5GHz这个频段上。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730141655.jpg&#34; alt=&#34;&#34;&gt;   严格来说只有支持802.11ac的才是真正5G Wi-Fi（在这个视频里我们将它称作ac 5G)，现来在说支持2.4G和5G双频的路由器其实很多都是指支持第四代无线标准，也就是802.11n的双频，而真正支持ac 5G的路由最便宜都要400、500甚至上千元&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730141748.jpg&#34; alt=&#34;&#34;&gt;   我们的路由器一般会有标有一些类似54Mbps，150Mbps，300Mbps这样的参数，要说明一下，这个参数不是指路由器的无线覆盖范围，而是指它的最高传输速率。若要支持ac 5G的也要双方同时支持，单方面支持是不行的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730141738.jpg&#34; alt=&#34;&#34;&gt;   这个速率就相当于车道上的限速标志，当然也不能完全等同与限速标志，因为如果网络中多个设备同时传输要分流的&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730141801.jpg&#34; alt=&#34;&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最后不要忘记要考虑空间的大小，200多平米的房子一般普通无线路由器的2.4G勉强可以覆盖，5G的话150平米就开始有压力，如果房屋太大或者多楼层的话可能就要考虑一下多个无线路由桥接了。&lt;/p&gt;
&lt;h3 id=&#34;5gwifi速度快，穿墙弱&#34;&gt;5GWifi速度快，穿墙弱&lt;/h3&gt;
&lt;p&gt;5G Wi-Fi的最大缺点就是穿墙能力比较弱，墙体对Wi-Fi信号的强度影响是比较大的，每穿过一面墙，Wi-Fi信号就要减弱不少。&lt;/p&gt;
&lt;h3 id=&#34;路由器摆放小技巧。增强信号。&#34;&gt;路由器摆放小技巧。增强信号。&lt;/h3&gt;
&lt;h4 id=&#34;最根本一半是有线速度限制，但信号强度也很重要&#34;&gt;最根本一半是有线速度限制，但信号强度也很重要&lt;/h4&gt;
&lt;p&gt;另外分享一个摆放路由器的方法，如果受制与网线或者台式电脑的位置就没得说，但是如果可以移动的话，这个位置的原则是要经过尽量少的墙体&lt;/p&gt;
&lt;p&gt;最好不要放在地上，更不要放在角落，&lt;/p&gt;
&lt;h4 id=&#34;放在高处&#34;&gt;放在高处&lt;/h4&gt;
&lt;p&gt;而且应该经适当的放高一点，而不是放在地上，这和手机信号塔的原理是一样的，更加不应该因为他碍眼把它放进抽屉、柜子等里面。这些方法可以略微增强信号强度，不过想从根本上解决信号问题，还是要换一款更好的路由。&lt;/p&gt;
&lt;h2 id=&#34;无线网卡选购简介&#34;&gt;无线网卡选购简介&lt;/h2&gt;
&lt;p&gt;常见值得选购的USB无线网卡按技术规格和价位，大致可以分为如下3类：&lt;/p&gt;
&lt;p&gt;单频11n网卡，标注速度200-300M，20-30元。&lt;/p&gt;
&lt;p&gt;双频11n网卡，支持5g频段，标注速度600M，40-50元。&lt;/p&gt;
&lt;p&gt;双频11ac网卡，支持5g频段，标注速度900-1200M或更高，80元以上。&lt;/p&gt;
&lt;p&gt;无线网卡要想达到标注的技术标准和速度，首先需要路由器支持该标准及速度，否则会降速运行。&lt;/p&gt;
&lt;h3 id=&#34;usb协议：速度，选择2-0还是3-0&#34;&gt;USB协议：速度，选择2.0还是3.0&lt;/h3&gt;
&lt;p&gt;USB2.0的速度传输，理论最大速率480M bit/S。 60MB/S&lt;/p&gt;
&lt;p&gt;USB3.0的理论最大速率是5G bit/S，要比USB2.0快10倍！ 640MB/S&lt;/p&gt;
&lt;p&gt;看线路，工艺质量，实际速度可能不到理论速度一半&lt;/p&gt;
&lt;h3 id=&#34;usb3-0-对wifi和bluetooth干扰。&#34;&gt;USB3.0 对wifi和BlueTooth干扰。&lt;/h3&gt;
&lt;p&gt;USB3.0的传输频率确实是5GHz串行，但USB3.0使用4条数据线组成2组，每组负责一个传输方向，实现全双工双向5GHz，而每条数据线的基准频率是2.5GHz。&lt;/p&gt;
&lt;p&gt;所以，总带宽是5GHz没错，但每条线上是2.5GHz，这个频率距离2.4G Wifi的频率太近了，又因为高频设备大多数都使用了SSC技术（扩频时钟？）使得信号不完全分布在一个固定频率上，所以就波及了2.5GHz附近的其它频率，所以对Wifi和蓝牙产生了较大的干扰。&lt;/p&gt;
&lt;h3 id=&#34;usb-3-0-干扰-wifi-2-4g通讯的问题和解决方法&#34;&gt;USB 3.0 干扰 Wifi 2.4G通讯的问题和解决方法&lt;/h3&gt;
&lt;h4 id=&#34;usb3-0-wifi干扰解决方法&#34;&gt;USB3.0 WIFI干扰解决方法&lt;/h4&gt;
&lt;p&gt;USB3.0的确对2.4G有影响，不过一样可以解决，比如&lt;strong&gt;网件&lt;/strong&gt;的解决方法就是，USB3.0 和网口,天线不在一面，USB3.0接口弄到前面，而且是所有接口有&lt;strong&gt;金属屏蔽罩&lt;/strong&gt;（包括WAN和LAN口），连USB接口与主板连线处都用&lt;strong&gt;屏蔽胶布&lt;/strong&gt;包裹。可惜国内厂商哪怕是大如华为，网口也舍不得这点成本用金属屏蔽的。&lt;/p&gt;
&lt;p&gt;带有USB 3.0接口的无线路由，如果出现外接3.0移动硬盘后网速下降，断网，或者ping延时变得很高，说明出现了3.0对无线的干扰。&lt;/p&gt;
&lt;p&gt;USB3.0与无线冲突解决办法：&lt;/p&gt;
&lt;p&gt;第一种：给USB接口加金属膜做屏蔽可以适当降低干扰，但不能完全屏蔽&lt;/p&gt;
&lt;p&gt;第二种：给主板的USB底座增加统一（并与使用设备）接地和增加金属屏蔽罩，基本可以排除&lt;/p&gt;
&lt;p&gt;【推荐】第三种：用1.2米 双磁环带屏蔽层的USB延长线将移动硬盘放到一米外的地方使用，基本可以完全可以排除&lt;/p&gt;
&lt;p&gt;其实不单是无线路由，像我们平常使用的无线鼠标键盘、蓝牙、wifi电视、iPad、手机等各种使用民用2.4G的通信设备都会出现与USB3.0冲突的情况。&lt;/p&gt;
&lt;h4 id=&#34;usb3-0-移动硬盘干扰解决方法&#34;&gt;USB3.0 移动硬盘干扰解决方法&lt;/h4&gt;
&lt;p&gt;相信随着USB3.0使用的用户越来越多，不少人遇到了一插上USB3.0的硬盘，wifi就出现降速或者中断的问题。其本质原因是USB 3.0 干扰2.4GHz下的Wifi通讯。&lt;/p&gt;
&lt;p&gt;解决方法如下，&lt;/p&gt;
&lt;p&gt;1.更换无线路由为5GHz，因为USB 3.0对5GHz的Wifi干扰程度较低&lt;br&gt;
2.把硬盘盒从USB3.0接口换到USB2.0接口也可以将问题解决&lt;br&gt;
3.使用高质量带屏蔽的USB3.0设备/线缆/接口。或者在USB3.0接口处加屏蔽罩（金属箔即可）&lt;br&gt;
4.最简单的，使用1m以上的高质量USB3.0延长线。将USB3.0设备远离电脑主机。&lt;/p&gt;
&lt;p&gt;Intel官方对USB3.0对WIFI干扰的描述文档：&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.usb.org/developers/whitepapers/327216.pdf&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.usb.org/developers/whitepapers/327216.pdf&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;目前在调试的两款型号：&#34;&gt;目前在调试的两款型号：&lt;/h2&gt;
&lt;h3 id=&#34;tl-wn823n&#34;&gt;TL-WN823N&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;​         Bus 002 Device 007: ID 0bda:818b&lt;/li&gt;
&lt;li&gt;​         RTL8192EU&lt;/li&gt;
&lt;li&gt;​         300M迷你型无线USB网卡 TL-WN823N&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;tl-wn725n&#34;&gt;TL-WN725N&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;​         Bus 002 Device 008: ID 0bda:8179&lt;/li&gt;
&lt;li&gt;​         rtl8188eu&lt;/li&gt;
&lt;li&gt;​         150M无线USB网卡 TL-WN725N&lt;/li&gt;
&lt;li&gt;​         网上的驱动版本数据结构和3.10差异较大，不能用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;wifi芯片厂家&#34;&gt;Wifi芯片厂家&lt;/h2&gt;
&lt;h3 id=&#34;realtek：&#34;&gt;Realtek：&lt;/h3&gt;
&lt;p&gt;​         官方无linux驱动支持&lt;/p&gt;
&lt;h3 id=&#34;ralink&#34;&gt;Ralink&lt;/h3&gt;
&lt;p&gt;（已经被MTK收购）： 官方有linux驱动&lt;/p&gt;
&lt;h3 id=&#34;atheros&#34;&gt;Atheros&lt;/h3&gt;
&lt;p&gt;（已经被高通qualcomm收购）：AR9271&lt;/p&gt;
&lt;h2 id=&#34;整理推荐芯片型号：&#34;&gt;整理推荐芯片型号：&lt;/h2&gt;
&lt;p&gt;USB 2.0 Mbit/s&lt;/p&gt;
&lt;h3 id=&#34;rt3070&#34;&gt;rt3070&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.mediatek.cn/products/broadbandWifi/rt3070&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.mediatek.cn/products/broadbandWifi/rt3070&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IEEE 802.11:b/g/n&lt;/li&gt;
&lt;li&gt;Wi-Fi Frequency:2.4GHz&lt;/li&gt;
&lt;li&gt;Antenna:1T1R&lt;/li&gt;
&lt;li&gt;Data Throughput:150Mbit/s&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;rt5370&#34;&gt;rt5370&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.mediatek.cn/products/broadbandWifi/rt5370&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.mediatek.cn/products/broadbandWifi/rt5370&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IEEE 802.11:b/g/n&lt;/li&gt;
&lt;li&gt;Wi-Fi Frequency:2.4GHz&lt;/li&gt;
&lt;li&gt;Antenna:1T1R&lt;/li&gt;
&lt;li&gt;Data Throughput:150Mbit/s&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;rt3573&#34;&gt;RT3573&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.mediatek.cn/products/broadbandWifi/rt3573&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.mediatek.cn/products/broadbandWifi/rt3573&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IEEE 802.11:b/g/n/ac&lt;/li&gt;
&lt;li&gt;Wi-Fi Frequency:2.4GHz, 5GHz&lt;/li&gt;
&lt;li&gt;Antenna:3T3R&lt;/li&gt;
&lt;li&gt;Data Throughput:450Mbit/s&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;rt5572&#34;&gt;RT5572&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.mediatek.cn/products/broadbandWifi/rt5572&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.mediatek.cn/products/broadbandWifi/rt5572&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IEEE 802.11:b/g/n/ac&lt;/li&gt;
&lt;li&gt;Wi-Fi Frequency:2.4GHz, 5GHz&lt;/li&gt;
&lt;li&gt;Antenna:2T2R&lt;/li&gt;
&lt;li&gt;Data Throughput:300Mbit/s&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;集成分析&#34;&gt;集成分析&lt;/h2&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3g，4g集成分析&#34;&gt;3G，4G集成分析&lt;/h2&gt;
&lt;p&gt;根据拨号技术流程，现在已经发现的USB上网有三种&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1：默认识别为USB Modem，使用pppoe拨号脚本拨号。&lt;/li&gt;
&lt;li&gt;2：默认识别为usb cdrom，使用usb-modeswitch 转换usb设备工作状态，转换为USB Modem后再采用pppoe拨号脚本拨号。&lt;/li&gt;
&lt;li&gt;3：使用CGI 调用Html链接方式拨号。不需要我们配置用户名密码，网络制式，最方便。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1：pppoe拨号&#34;&gt;1：Pppoe拨号&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;pppd call wcdma &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2：usb-modeswitch转换usb设备工作模式。&#34;&gt;2：usb_modeswitch转换usb设备工作模式。&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;usb_modeswitch -W -c &amp;#x2F;etc&amp;#x2F;usb_modeswitch.d&amp;#x2F;19D2:0117&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;3：cgi拨号示例&#34;&gt;3：CGI拨号示例&lt;/h3&gt;
&lt;p&gt;从集成实现来说，这种最方便。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;.&amp;#x2F;curl --header &amp;quot;Referer: http:&amp;#x2F;&amp;#x2F;192.168.0.1&amp;#x2F;index.html&amp;quot; http:&amp;#x2F;&amp;#x2F;192.168.0.1&amp;#x2F;goform&amp;#x2F;goform_set_cmd_process?goformId&amp;#x3D;SET_CONNECTION_MODE&amp;amp;ConnectionMode&amp;#x3D;auto_dial

.&amp;#x2F;curl --header &amp;quot;Referer: http:&amp;#x2F;&amp;#x2F;192.168.0.1&amp;#x2F;index.html&amp;quot; http:&amp;#x2F;&amp;#x2F;192.168.0.1&amp;#x2F;goform&amp;#x2F;goform_process?goformId&amp;#x3D;MODE_SWITCH&amp;amp;switchCmd&amp;#x3D;FACTORY&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;wifi集成分析&#34;&gt;Wifi集成分析&lt;/h2&gt;
&lt;p&gt;步骤：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1：驱动移植识别&lt;/li&gt;
&lt;li&gt;2：wireless_tools或者wpa_supplicant拨号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;wpa_supplicant依赖openssl和libnl，支持PSK加密需要用到这个。wireless_tools只支持普通web加密。&lt;/p&gt;
&lt;h2 id=&#34;带宽性能测试&#34;&gt;带宽性能测试&lt;/h2&gt;
&lt;p&gt;服务器运行 iperf -s&lt;/p&gt;
&lt;p&gt;客户端运行 iperf -c 服务器ip -t 60000 -i 2&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;iperf -c 192.168.1.100 -t 60000 -i 2
TP—Link 845&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;笔记本有线连接运行服务端, H3531a（2716TE_C）使用TL-WN823N连接&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@Tvt iperf]# .&amp;#x2F;iperf.hisi3531A -c 192.168.1.100 -t 60000 -i 2
\------------------------------------------------------------
Client connecting to 192.168.1.100, TCP port 5001
TCP window size: 21.0 KByte (default)
\------------------------------------------------------------
[ 3] local 192.168.1.103 port 47671 connected with 192.168.1.100 port 5001
[ ID] Interval    Transfer   Bandwidth
[ 3] 0.0- 2.0 sec 2.25 MBytes 9.44 Mbits&amp;#x2F;sec
[ 3] 2.0- 4.0 sec  256 KBytes 1.05 Mbits&amp;#x2F;sec
[ 3] 4.0- 6.0 sec  128 KBytes  524 Kbits&amp;#x2F;sec
[ 3] 6.0- 8.0 sec  256 KBytes 1.05 Mbits&amp;#x2F;sec
[ 3] 8.0-10.0 sec 1.25 MBytes 5.24 Mbits&amp;#x2F;sec
[ 3] 10.0-12.0 sec 3.75 MBytes 15.7 Mbits&amp;#x2F;sec
[ 3] 12.0-14.0 sec 4.25 MBytes 17.8 Mbits&amp;#x2F;sec
[ 3] 14.0-16.0 sec 3.13 MBytes 13.1 Mbits&amp;#x2F;sec
[ 3] 16.0-18.0 sec 1.75 MBytes 7.34 Mbits&amp;#x2F;sec
[ 3] 18.0-20.0 sec 1.38 MBytes 5.77 Mbits&amp;#x2F;sec
[ 3] 20.0-22.0 sec 1.13 MBytes 4.72 Mbits&amp;#x2F;sec
[ 3] 22.0-24.0 sec  256 KBytes 1.05 Mbits&amp;#x2F;sec
[ 3] 24.0-26.0 sec  128 KBytes  524 Kbits&amp;#x2F;sec
[ 3] 26.0-28.0 sec  128 KBytes  524 Kbits&amp;#x2F;sec
[ 3] 28.0-30.0 sec  512 KBytes 2.10 Mbits&amp;#x2F;sec
[ 3] 30.0-32.0 sec 2.88 MBytes 12.1 Mbits&amp;#x2F;sec
[ 3] 32.0-34.0 sec 1.63 MBytes 6.82 Mbits&amp;#x2F;sec
[ 3] 34.0-36.0 sec 3.50 MBytes 14.7 Mbits&amp;#x2F;sec
[ 3] 36.0-38.0 sec  768 KBytes 3.15 Mbits&amp;#x2F;sec
[ 3] 38.0-40.0 sec 4.38 MBytes 18.4 Mbits&amp;#x2F;sec
[ 3] 40.0-42.0 sec 5.38 MBytes 22.5 Mbits&amp;#x2F;sec
[ 3] 42.0-44.0 sec 7.13 MBytes 29.9 Mbits&amp;#x2F;sec
[ 3] 44.0-46.0 sec 6.63 MBytes 27.8 Mbits&amp;#x2F;sec
[ 3] 46.0-48.0 sec 5.38 MBytes 22.5 Mbits&amp;#x2F;sec
[ 3] 48.0-50.0 sec 5.75 MBytes 24.1 Mbits&amp;#x2F;sec
[ 3] 50.0-52.0 sec 7.50 MBytes 31.5 Mbits&amp;#x2F;sec
[ 3] 52.0-54.0 sec 4.63 MBytes 19.4 Mbits&amp;#x2F;sec
[ 3] 54.0-56.0 sec 7.50 MBytes 31.5 Mbits&amp;#x2F;sec
[ 3] 56.0-58.0 sec 6.75 MBytes 28.3 Mbits&amp;#x2F;sec
[ 3] 58.0-60.0 sec 5.13 MBytes 21.5 Mbits&amp;#x2F;sec
[ 3] 60.0-62.0 sec 5.38 MBytes 22.5 Mbits&amp;#x2F;sec
[ 3] 62.0-64.0 sec 4.75 MBytes 19.9 Mbits&amp;#x2F;sec
[ 3] 64.0-66.0 sec 6.00 MBytes 25.2 Mbits&amp;#x2F;sec
[ 3] 66.0-68.0 sec 3.50 MBytes 14.7 Mbits&amp;#x2F;sec
[ 3] 68.0-70.0 sec 5.50 MBytes 23.1 Mbits&amp;#x2F;sec
[ 3] 70.0-72.0 sec 4.75 MBytes 19.9 Mbits&amp;#x2F;sec
[ 3] 72.0-74.0 sec 1.50 MBytes 6.29 Mbits&amp;#x2F;sec
[ 3] 74.0-76.0 sec 4.50 MBytes 18.9 Mbits&amp;#x2F;sec
[ 3] 76.0-78.0 sec 4.25 MBytes 17.8 Mbits&amp;#x2F;sec
[ 3] 78.0-80.0 sec 5.13 MBytes 21.5 Mbits&amp;#x2F;sec
[ 3] 80.0-82.0 sec 7.88 MBytes 33.0 Mbits&amp;#x2F;sec
[ 3] 82.0-84.0 sec 7.38 MBytes 30.9 Mbits&amp;#x2F;sec
[ 3] 84.0-86.0 sec 4.38 MBytes 18.4 Mbits&amp;#x2F;sec
[ 3] 86.0-88.0 sec 5.25 MBytes 22.0 Mbits&amp;#x2F;sec
[ 3] 88.0-90.0 sec 6.63 MBytes 27.8 Mbits&amp;#x2F;sec
[ 3] 90.0-92.0 sec 5.00 MBytes 21.0 Mbits&amp;#x2F;sec
[ 3] 92.0-94.0 sec 6.88 MBytes 28.8 Mbits&amp;#x2F;sec
[ 3] 94.0-96.0 sec 8.25 MBytes 34.6 Mbits&amp;#x2F;sec
[ 3] 96.0-98.0 sec 7.25 MBytes 30.4 Mbits&amp;#x2F;sec&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;附录&#34;&gt;附录&lt;/h2&gt;
&lt;h2 id=&#34;1：td-lte和lte-fdd标准差异&#34;&gt;1：TD- LTE和LTE FDD标准差异&lt;/h2&gt;
&lt;p&gt;TD- LTE是我国自主研发的4G标准，是由TD-SCDMA（3G网络）发展而来。&lt;/p&gt;
&lt;p&gt;LTE FDD是现在国际上主流的，使用最广泛的4G网络。&lt;/p&gt;
&lt;p&gt;现在全球有超过200个LTE的商用网络，其中超过90%是FDD的。&lt;/p&gt;
&lt;p&gt;从技术上说，TD- LTE采用的是时分双工，而LTE FDD采用的是频分双工&lt;/p&gt;
&lt;p&gt;那什么是频分双工，什么又是时分双工呢？&lt;/p&gt;
&lt;p&gt;先来解释“双工”。&lt;/p&gt;
&lt;p&gt;移动通信系统的工作方式分为：单工、半双工和全双工&lt;/p&gt;
&lt;p&gt;1，单工就是信息只能向一个方向传播。例如寻呼机和收音机，只能接收信息，不能发出信息。&lt;/p&gt;
&lt;p&gt;2，半双工就是信息可以双向传播，但是上传信息的时候只能上传，下载的时候只能下载。例如对讲机，你说话的时候听不见别人别人说，听别人说的时候自己不能说。&lt;/p&gt;
&lt;p&gt;3， 全双工就是信息可以同时双向传播。例如手机，可以边听边说。其中全双工又分为：时分双工TDD，与频分双工FDD。&lt;/p&gt;
&lt;p&gt;​    所谓的频分双工就是将信息上传和信息下载放在两个不同的频段，称为上行频段和下行频段，且这两个频段必须对称。为了不防止上下行频段之间的信息串频，两个频段不能重叠，而且中间必须隔开一段，称为保护频。如下图：上行和下行频段相互分开&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730142158.jpg&#34; alt=&#34;保护帧&#34;&gt;&lt;/p&gt;
&lt;p&gt;所谓的时分双工就是将上传和下载放在同一个频段，也就是上行频段和下行频段完全一样。那它是如何做到上下的信息不串频呢？其实很简单，顾名思义，频分双工分的是频段，那时分双工分的就是时间。将波传播的时间轴一分为二，&lt;/p&gt;
&lt;p&gt;前半部分用于信息的上传，后一部分用于信息的下载。其实这从理论上更像是同步的半双工，但是由于上行和下行时间差距极短，我们无法感觉到，所以从效果上也是全双工。如下图：时间帧的第一帧为上行，第二帧而为下行，上下行共用一个频段，用时间的差将他们隔开。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730142220.jpg&#34; alt=&#34;数据帧&#34;&gt;&lt;/p&gt;
&lt;p&gt;​    接下来说一说移动TD- LTE和电信联通LTE FDD的优缺点，其实就是时分双工与频分双工的特点。&lt;/p&gt;
&lt;p&gt;​     TD- LTE由于采用上行和下行分时，所以上行和下行的时间差导致他信息传输的速度受到一定的限制。他的理论下载峰值为100Mbps，相比FDD的150Mbps来说，慢了不少。当然TD- LTE的基站信号覆盖半径也比LTE FDD小一点。&lt;/p&gt;
&lt;p&gt;​    LTE FDD也并非都是优点。FDD制式必须要找对称分开的上行、下行频段，也就是说它必须浪费更多的频段资源。那中国联通的FDD网为例，工信部给他发的频段牌照为，上行1755&lt;sub&gt;1765MHz和下行1850&lt;/sub&gt;1860MHz（2×10M），实际联通只得到了上下各10M的频段，但是加上当中的保护频段，一共占用了1755~1860MHz也就是105MHz的频段。这就导致了频段资源利用率低，是一种资源的浪费。目前，频率资源本身就紧张，能找到对称的上行和下行频段就尤其难。频率除了用在手机上网通讯上，像广播，军事,甚至无线路由器等民用领域也广泛使用。将来随着科技的进步，频率频段的稀缺会日益严重。&lt;/p&gt;
&lt;p&gt;​    TD-LTE和FDD-LTE 是4G的两种国际标准，各有利弊。TD-LTE占用频段少，节省资源，带宽长，适合区域热点覆盖；FDD速度更快，覆盖更广，但占用资源多。适合广域覆盖。&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wireless.wiki.kernel.org/en/users/drivers&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Kernel wireless 支持列表&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;embeded系列&#34;&gt;&lt;strong&gt;Embeded系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/embeded/atom.xml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Embeded 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/13894dce/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;海思MPP&amp;amp;UNF构架源代码级分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/6b2ba137/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3G,4G,Wifi选型需求分析及技术简介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/509c7bd3/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;自动曝光原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/798e6e62/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ISP 数字图像处理 算法概述、工作原理、架构、处理流程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ba4ef326/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;QNAP添加man pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdn.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://cdn.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://cdn.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://cdn.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
&lt;script data-pjax src=&#34;/libs/hbe/hbe-bundle.js?v=13.23&#34;&gt;&lt;/script&gt;&lt;link href=&#34;/libs/hbe/hbe-style.css?v=13.23&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34;&gt;</content>
        <category term="linux" />
        <category term="embeded" />
        <category term="3G" />
        <category term="4G" />
        <category term="3531a" />
        <category term="移植" />
        <category term="嵌入式" />
        <updated>2021-07-30T08:25:00.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/13894dce/</id>
        <title>海思MPP&amp;UNF构架源代码级分析</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/13894dce/"/>
        <content type="html">&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;文章写了好多年了，只在一个网站发布过&lt;a href=&#34;http://bbs.ebaina.com/forum.php?mod=viewthread&amp;amp;tid=14994&amp;amp;extra=&amp;amp;page=1&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PDF版本&lt;/a&gt;，行业内应该很多人看过这个。由于早期笔记使用Word格式，转换格式时有不少格式错误，笔者尽量修正。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关于本blog，&lt;strong&gt;图床&lt;/strong&gt;一般使用&lt;strong&gt;github&lt;/strong&gt;，已经配置了CDN，如果图片还是未显示请自行代理解决&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;原创声明警告&lt;/strong&gt;，本文&lt;strong&gt;禁止转载&lt;/strong&gt;，禁止发布到其它任何网站，可以接受约稿。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;前言：&#34;&gt;前言：&lt;/h2&gt;
&lt;p&gt;​    本文通过分析海思文档和代码，把海思SDK的MPI和UNF构架大概实现思想和构架进行了简略的分析。着重分析了内存管理，底层功能如何实现。&lt;/p&gt;
&lt;p&gt;​    前面章节简要分析了NVR芯片MPI构架及其内存管理机制，后面着重详细分析了3798M底层模块api和drv实现的细节过程及其方法流程。&lt;/p&gt;
&lt;p&gt;​    本文前面简略分析了DVR，MPI构架的大体实现机制。后面就具体分析3798M UNF构架的实现。&lt;/p&gt;
&lt;p&gt;本文不光分析了UNF构架，还使用了很多工具，辅助分析代码。这里从三个层面分析了UNF的实现。&lt;/p&gt;
&lt;p&gt;1: 应用层，驱动层的实现框架，使用source insight查看代码并着重分析了avplay等几个模块。&lt;/p&gt;
&lt;p&gt;2：静态分析函数调用。使用cflow，dot工具生成调用关系图&lt;/p&gt;
&lt;p&gt;3：动态追踪运行过程。Ltrace, strace, valgrind分析函数调用，perf动态分析内核调用。&lt;/p&gt;
&lt;h2 id=&#34;1-hi35xx系列芯片mpp构架&#34;&gt;1:Hi35xx系列芯片MPP构架&lt;/h2&gt;
&lt;h3 id=&#34;1-1-概述&#34;&gt;1.1 概述&lt;/h3&gt;
&lt;p&gt;海思提供的媒体处理软件平台(Media Process Platform,简称 MPP)，可支持应用软件快速开发。该平台对应用软件屏蔽了芯片相关的复杂的底层处理，并对应用软件直接提供MPI（MPP Programe Interface）接口完成相应功能。该平台支持应用软件快速开发以下功能：输入视频捕获、H.264/MJPEG/JPEG/MPEG4 编码、H264/H.265/VC1/MPEG4/MPEG2/AVS 解码、视频输出显示、视频图像前处理（包括去噪、增强、锐化、Deinterlace） 、编码码流叠加 OSD、视频侦测分析、智能分析、音频捕获及输出、音频编解码等功能。&lt;/p&gt;
&lt;h3 id=&#34;1-2-整体软硬件构架&#34;&gt;1.2 整体软硬件构架&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730160509.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;MPP 平台支持的典型的系统层次如上图所示，主要分为以下层次：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;硬件层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;硬件层由 Hi35xx 芯片加上必要的外围器件构成。外围器件包括 Flash、DDR&lt;br&gt;
（Double Data-Rate） 、视频 Sensor 或 AD、音频 AD 等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;操作系统层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;基于 Linux 3.10.y 的 OS 系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;媒体处理平台&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;基于操作系统层，控制芯片完成相应的媒体处理功能。它对应用层屏蔽了硬件处理细节，并为应用层提供 API 接口完成相应功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;其他驱动&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;除媒体处理平台外,海思为 Hi35xx 芯片的其他相关硬件处理单元提供了相应的驱动,&lt;/p&gt;
&lt;p&gt;包括 GMAC、SDIO、I2C、USB、SSP 等驱动。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;应用层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;基于海思媒体处理平台及其他驱动，由用户开发的应用软件系统。&lt;/p&gt;
&lt;h3 id=&#34;1-3-海思媒体处理平台架构&#34;&gt;1.3 海思媒体处理平台架构&lt;/h3&gt;
&lt;p&gt;海思媒体处理平台的主要内部处理流程如上图所示，主要分为视频输入（VI） 、视频处理（VPSS） 、视频编码（VENC） 、视频解码（VDEC） 、视频输出(VO)、视频侦测分析(VDA)、音频输入(AI)、音频输出(AO)、音频编码（AENC） 、音频解码（ADEC） 、区域管理（REGION）等模块。主要的处理流程介绍如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730160451.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;VI 模块捕获视频图像，可对其做剪切、缩放、镜像等处理，并输出多路不同分辨率的图像数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;解码模块对编码后的视频码流进行解码，并将解析后的图像数据送 VPSS 进行图像处理或直接送 VO 显示。可对 H.264/H.265/VC1/MPEG4/MPEG2/AVS 格式的视频码流进行解码。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VPSS 模块接收 VI 和解码模块发送过来的图像，可对图像进行去噪、图像增强、锐化等处理，并实现同源输出多路不同分辨率的图像数据用于编码、预览或抓拍。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编码模块接收 VI 捕获并经 VPSS 处理后输出的图像数据，可叠加用户通过 Region&lt;br&gt;
模块设置的 OSD 图像，然后按不同协议进行编码并输出相应码流。&lt;br&gt;
VDA 模块接收 VI 的输出图像，并进行移动侦测和遮挡侦测，最后输出侦测分析结果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VO 模块接收 VPSS 处理后的输出图像，可进行播放控制等处理，最后按用户配置的输出协议输出给外围视频设备。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AI 模块捕获音频数据，然后 AENC 模块支持按多种音频协议对其进行编码，最后输出音频码流。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用户从网络或外围存储设备获取的音频码流可直接送给 ADEC 模块，ADEC 支持&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-4-mmz与模块绑定&#34;&gt;1.4 MMZ与模块绑定&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730160438.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;MPP 提供系统绑定接口（HI_MPI_SYS_Bind） ，即通过数据接收者绑定数据源来建立&lt;/p&gt;
&lt;p&gt;两者之间的关联关系（只允许数据接收者绑定数据源） 。绑定后，数据源生成的数据将&lt;/p&gt;
&lt;p&gt;自动发送给接收者。&lt;/p&gt;
&lt;p&gt;Uboot环境变量中定义linux内核使用的内存大小&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;setenv &amp;#39;mem&amp;#x3D;288M console&amp;#x3D;ttyAMA0,115200 root&amp;#x3D;&amp;#x2F;dev&amp;#x2F;mtdblock2 rootfstype&amp;#x3D;jffs2 mtdparts&amp;#x3D;hi_sfc:768K(boot),2304K(sdr021000),13M(rootfs)&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;加载内核模块分配MMZ内存大小&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;insmod mmz.ko mmz&amp;#x3D;anonymous,0,0x8E000000,792M anony&amp;#x3D;1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;例如512M的DDR&lt;/p&gt;
&lt;p&gt;DDR:&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;DDR:                                                          
-----------|----------|  0x80000000   # Memory managed by OS.             
   64M     |   OS     |                                                
           |          |                                                
-----------|----------|  0x84000000   # Memory managed by MMZ block anonymous.         
   448M    |    MMZ   |                                                
           |          |                                                
-----------|----------|  0xA0000000   # Memory managed by MMZ block jpeg.                      &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;1-5-himpp-支持的绑定关系&#34;&gt;1.5 HiMPP 支持的绑定关系&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;数据源&lt;/th&gt;
&lt;th&gt;数据接收者&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VI&lt;/td&gt;
&lt;td&gt;VO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;VENC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;VDA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;VPSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;PCIV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPSS&lt;/td&gt;
&lt;td&gt;VO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;VENC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;VDA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;VPSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;PCIV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VDEC&lt;/td&gt;
&lt;td&gt;VPSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;VO（只能是标清设备或 single 模式分割）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;VDA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;PCIV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vo(WBC)&lt;/td&gt;
&lt;td&gt;VO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;VENC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;VPSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;PCIV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;AENC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;AO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADEC&lt;/td&gt;
&lt;td&gt;AO&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;1-6-函数约定说明&#34;&gt;1.6 函数约定说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Open/Close&lt;br&gt;
Open/Close 操作用来打开、关闭那些可枚举的设备。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create/ Destroy&lt;br&gt;
Create/ Destroy 操作用来创建、销毁那些不可枚举的设备。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Handle&lt;br&gt;
Handle 用来标识一个“不可枚举”类型的设备。Handle 只在本进程内有效，也就是说 Handle 不可以跨进程传递Handle 是一个 32bit 的数据，其低 8bit 表示设备的 ID，高 16bit 表示模块 ID。比如0x00110000 表示模块 ID 为 0x11 的第 0 个设备。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attach /Detach&lt;br&gt;
Attach/Detach 用来绑定、解绑定两个设备直接的关联。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attach 后，目的设备将自动处于 Start/Enable 状态； Detach 后，目的设备将自动处于Stop/Disable 状态。对于多级绑定，&lt;strong&gt;要求从最后一个设备逐级向前绑定，解绑定的顺序则相反，要求逐级向后。&lt;/strong&gt;**&lt;br&gt;
** 当绑定在一起的多个设备可以设置相同属性时，必须通过最后一个设备进行设置。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Get/Put&lt;br&gt;
Get/Put 用来往某个模块输入数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Acquire/Release&lt;br&gt;
Acquire/Release 用来从某个模块获取数据。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Get/Put和Acquire/Release推荐成对使用&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155911.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-7-mpp优缺点&#34;&gt;1.7 MPP优缺点&lt;/h3&gt;
&lt;h4 id=&#34;1-7-1-mpp优点&#34;&gt;1.7.1 MPP优点&lt;/h4&gt;
&lt;p&gt;​    内存VB管理和模块绑定子系统，proc运行时调试信息是MPP构架节约用户时间最大的设计。&lt;/p&gt;
&lt;p&gt;​    大部分外围接口都封装好，用户调用接口直接使用，快速，方便。&lt;/p&gt;
&lt;h4 id=&#34;1-7-2-mpp缺点&#34;&gt;1.7.2 MPP缺点&lt;/h4&gt;
&lt;p&gt;​    没有相应子系统的源代码。出了问题，有bug必须需要海思查看，解决。&lt;/p&gt;
&lt;p&gt;​    MPI接口和标准linux接口差异非常大，构架也不一样。有问题需要找海思。中间时间成本。&lt;/p&gt;
&lt;p&gt;不利于研发技术积累。&lt;/p&gt;
&lt;h2 id=&#34;2-mpp和unf对比&#34;&gt;2:  MPP和UNF对比&lt;/h2&gt;
&lt;p&gt;从函数命名，参数，使用方法来看。UNF和MPP分开比较早，UNF构架在上面函数约定说明基础上的MPI接口封装了一层，UNF-&amp;gt;MPI调用，UNF开发支持更多的模块接口。MPP的模块接口比较固定，比UNF少得多，增强了MMZ内存，VB管理功能，模块绑定功能。&lt;/p&gt;
&lt;p&gt;MPP由HI_MPI_SYS_Bind来绑定两个模块，而UNF还是使用Hi_XXX_Attach来绑定两个模块。&lt;/p&gt;
&lt;p&gt;MPP内存管理MMZ，VB也比UNF更细致，强大。&lt;/p&gt;
&lt;p&gt;UNF支持更多的外设模块。如TUNER（广播电视），CIPHER（芯片内部加密），Subtitle（字幕），PDM（低功耗），SCI（智能卡），GPU等。&lt;/p&gt;
&lt;p&gt;UNF开源。在一些模块的实现中，也使用了一些开源项目，如FFmpeg，Alsa，wpa_supplicant等。&lt;/p&gt;
&lt;h2 id=&#34;3-3798芯片unf处理构架&#34;&gt;3:  3798芯片UNF处理构架&lt;/h2&gt;
&lt;h3 id=&#34;3-1-应用架构&#34;&gt;3.1 应用架构&lt;/h3&gt;
&lt;p&gt;海思媒体处理平台（ MSP）实现了对海思高清机顶盒解决方案处理器中媒体、图形以及外设的屏蔽和封装，对应用软件直接提供 API（ Application Program Interface）接口完成相应功能。典型的应用架构如下图所示&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155841.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3798&lt;strong&gt;&lt;strong&gt;比35xx&lt;/strong&gt;&lt;/strong&gt;多了一个UNF&lt;strong&gt;&lt;strong&gt;层，它在MPI&lt;/strong&gt;&lt;/strong&gt;基础上进行了一层封装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;软件架构主要包含以下 4 层：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;UNF层&lt;/p&gt;
&lt;p&gt;媒体处理平台（ MSP）对外统一的应用开发接口。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MPI层&lt;/p&gt;
&lt;p&gt;处理器各模块硬件能力实现层的用户态部分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DRV层&lt;/p&gt;
&lt;p&gt;处理器各模块硬件能力实现层的内核态部分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HAL层&lt;/p&gt;
&lt;p&gt;处理器各模块的硬件抽象层。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-2-3798sdk-概览（功能介绍）&#34;&gt;3.2 3798SDK 概览（功能介绍）&lt;/h3&gt;
&lt;p&gt;媒体处理平台（ MSP）中所有模块按照功能可以分为媒体处理，图形处理，外设处理 3&lt;br&gt;
类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;媒体处理&lt;/p&gt;
&lt;p&gt;DEMUX、 AVPLAY、 SOUND、 DISPLAY、 VO、 HDMI、 PVR、 VDEC、 VENC、&lt;br&gt;
ADEC、 AENC、 VI、 AI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;图形处理&lt;/p&gt;
&lt;p&gt;HIFB、 HIGO、 TDE、 JPEG、 JPGE、 GPU&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;外设处理&lt;/p&gt;
&lt;p&gt;Cipher、 OTP、 PMOC、 Frontend、 I2C、 SCI、 KEYLED、 GPIO、 IR、 WDG、 C51&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-3-3798内存管理&#34;&gt;3.3 3798内存管理&lt;/h3&gt;
&lt;h4 id=&#34;3-3-1-mmz内存&#34;&gt;3.3.1 Mmz内存&lt;/h4&gt;
&lt;p&gt;3798的mmz内存在uboot bootargs环境变量中分配，在内核中大块连续内存使用dma_alloc_from_contiguous（drv/mmz/drv_media_mem_v2.c）来分配内存， 小块内存使用kmalloc分配，并且使用内核链表标记管理。和应用层交互使用mamp，umamp，并使用内核链表管理内存。这点和35xx DVR芯片有很大区别，DVR芯片模块内存和linux内核使用内存不再一个地方，应该是通过物理地址往虚拟地址映射来使用的。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# cat &amp;#x2F;proc&amp;#x2F;cmdline
mem&amp;#x3D;1G console&amp;#x3D;ttyAMA0,115200 root&amp;#x3D;&amp;#x2F;dev&amp;#x2F;romblock3 rootfstype&amp;#x3D;squashfs mtdparts&amp;#x3D;hinand:5M(boot),1M(baseparam),7M(kernel),18M(rootfs),64M(appfs),16M(qte),4M(config),12M(log),1M(logo) mmz&amp;#x3D;ddr,0,0,500M&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;具体就是在bootargs中配置mem=1G mmz=ddr,0,0,435M&lt;/p&gt;
&lt;p&gt;查看内存使用情况跟监控相同，通过cat /proc/media-mem&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155600.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;3-3-2-解码vid内存&#34;&gt;3.3.2 解码vid内存&lt;/h4&gt;
&lt;p&gt;关于码流解码过程中视频缓冲buffer u32VidBufSize配置：&lt;/p&gt;
&lt;p&gt;创建avplay时，可以指定视频es buf大小，参考如下代码&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;Ret &amp;#x3D; HI_UNF_AVPLAY_GetDefaultConfig(&amp;amp;AvplayAttr, HI_UNF_AVPLAY_STREAM_TYPE_ES);
AvplayAttr.stStreamAttr.u32VidBufSize &amp;#x3D; 2*1024*1024;
Ret |&amp;#x3D; HI_UNF_AVPLAY_Create(&amp;amp;AvplayAttr, &amp;amp;hAvplay[i]);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Es buf的作用存储码流原始es流。&lt;/p&gt;
&lt;p&gt;这个buffer的大小跟码流分辨率、码率都有关系，一般情况下，D1/720P/1080P/4K 码流的配置为 2M/3M/5M/16M 即可，特殊码流除外。&lt;/p&gt;
&lt;h3 id=&#34;3-4-3798模块&#34;&gt;3.4 3798模块&lt;/h3&gt;
&lt;h4 id=&#34;demux：&#34;&gt;DEMUX：&lt;/h4&gt;
&lt;p&gt;​	数据输入模块。IF，TSI，RAM。&lt;/p&gt;
&lt;p&gt;​	NVR使用的是RAM接口输入ES码流。&lt;/p&gt;
&lt;h4 id=&#34;vi&#34;&gt;VI:&lt;/h4&gt;
&lt;p&gt;虚拟VI&lt;/p&gt;
&lt;h4 id=&#34;vdec&#34;&gt;VDEC&lt;/h4&gt;
&lt;p&gt;​	解码器模块提供一组函数指针，供解码使用。目前有264，mpeg4两个。&lt;/p&gt;
&lt;p&gt;视频解码的简单流程是：步骤 1 VDEC 从 Demux 或 ES buffer 获取 ES 数据送 Firmware 进行解码（ Firmware: StreamInput(VDEC-&amp;gt;Firmware)）。步骤 2 Firmware 将解码完的 1D 或者 2D 帧存放在帧 buffer 中。步骤 3 VDEC 从帧 buffer 中获取（ Firmware: Frame Output(Firmware-&amp;gt;VDEC)）视频帧放入其帧队列中。步骤 4 VPSS 在线程中从 VDEC 的帧队列中取帧做解码后处理（ Frame Output(VDEC-&amp;gt;VPSS)）。步骤 5 AVPLAY 向 VDEC 获取视频帧， VDEC 从 VPSS 获取视频帧返回给 AVPLAY。&lt;/p&gt;
&lt;h4 id=&#34;sync：&#34;&gt;SYNC：&lt;/h4&gt;
&lt;p&gt;音视频同步工具&lt;/p&gt;
&lt;h4 id=&#34;display：显示设备&#34;&gt;DISPLAY：显示设备&lt;/h4&gt;
&lt;h4 id=&#34;window：显示通道&#34;&gt;WINDOW：显示通道&lt;/h4&gt;
&lt;p&gt;msp 目录下的“ windowXXYY”节点的中的 XX 为显示通道的编号， YY 为 window 序号。比如 window0100， bit[15:8]的 01 表示该 window 基于 DISPLAY1 创建， bit[7:0]的00 表示 window 序号为 0。有支持3D显示&lt;/p&gt;
&lt;p&gt;DISP（ Display）模块接收 WINDOW 提供的视频图像、 Frame Buffer 提供的图形画面，进行图像叠加处理和图像色彩调节，并将叠加后图像通过多种视频输出端口输出给显示设备；此外， DISP 支持获取视频输出端口上的包含视频和图形的完整图像。&lt;/p&gt;
&lt;p&gt;窗口类型&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Display：独立显示窗口&lt;/li&gt;
&lt;li&gt;Virtual：虚拟窗口&lt;/li&gt;
&lt;li&gt;Main：同源显示主窗口&lt;/li&gt;
&lt;li&gt;Slave：同源显示从窗口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155307.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155256.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;so（-subtitle-output）&#34;&gt;SO（ Subtitle Output）&lt;/h4&gt;
&lt;h4 id=&#34;pdm&#34;&gt;PDM&lt;/h4&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155248.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;PDM(Product Data Manager)模块用于管理与产品相关的数据，包括基本参数、开机画面参数及数据、瞬播参数及数据的管理&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155410.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;用户通过镜像制作工具制作基本参数镜像与瞬播镜像，通过烧写工具烧写至 FLASH，PDM 模块在 BOOT 下将基本参数及瞬播数据读入内存，并传递至 KERNEL。 KERNEL下瞬播从 PDM 模块获取参数及数据，调用 DEMUX、 VDEC、 VO 等模块驱动，完成瞬播播放&lt;/p&gt;
&lt;p&gt;demux&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155234.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;DEMUX 模块接收 DEMOD 或内存中的 TS 流，按客户应用程序（下简称 APP）的设置提取出其中的 SEC 数据、 PES 数据、 TS 数据、音频数据和视频数据。 APP 获取&lt;br&gt;
SEC 数据、 PES 数据和 TS 数据进行处理。 AVPLAY 获取音频数据进行处理， VDEC 获取视频数据进行处理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155217.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;AVPLAY 主要依赖 ADEC/VDEC/DEMUX 等模块，其向应用或中间件播放器提供基本的播放业务相关接口。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155202.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-5-3798和nvr模块使用方面区别：&#34;&gt;3.5 3798和NVR模块使用方面区别：&lt;/h3&gt;
&lt;p&gt;3798模块中vpss，sync等模块是其它模块自动创建，自动绑定处理的。这点和NVR系列芯片差别很大，nvr中vi，vpss，vo都需要用户自己绑定，设置属性，而3798中vpss，vo创建，属性设置是在上层模块中自动处理的（少量设置属性上层传递下去）。&lt;/p&gt;
&lt;p&gt;​    简单来说，MPP接口只实现了基本的功能接口，没有封装或很少封装。&lt;/p&gt;
&lt;p&gt;UNF 应用层实现了很多业务接口，对底层驱动进行了多层封装，并且实现了一些常用的业务。&lt;/p&gt;
&lt;h2 id=&#34;4-3798代码祥看&#34;&gt;4: 3798代码祥看&lt;/h2&gt;
&lt;h3 id=&#34;4-1-分析方法&#34;&gt;4.1 分析方法&lt;/h3&gt;
&lt;h4 id=&#34;4-1-1：查看代码，静态分析应用层，驱动层实现方法&#34;&gt;4.1.1：查看代码，静态分析应用层，驱动层实现方法&lt;/h4&gt;
&lt;p&gt;​    使用Source insight分析kernel，msp代码。&lt;/p&gt;
&lt;h4 id=&#34;4-1-2：图示静态分析函数调用关系&#34;&gt;4.1.2：图示静态分析函数调用关系&lt;/h4&gt;
&lt;p&gt;​    使用cflow， tree2dotx，和dot生成函数静态调用图。&lt;/p&gt;
&lt;h4 id=&#34;4-1-3：图示动态分析函数调用关系：库函数，系统调用，内核调用&#34;&gt;4.1.3：图示动态分析函数调用关系：库函数，系统调用，内核调用&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;​    使用ltrace分析系统库函数&lt;/li&gt;
&lt;li&gt;​    strace分析系统调用流程&lt;/li&gt;
&lt;li&gt;​    使用Ftrace，valgrind，gprof2dot生成运行时调用图。&lt;/li&gt;
&lt;li&gt;​    Perf分析内核空间调用。发现一些依赖库在ubuntu12.04里面不可用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一步实现了valgrind动态分析，其它的几个工具需要交叉编译，TODO。使用Perf可能需要换更新的linux版本。&lt;/p&gt;
&lt;p&gt;其它还有time(大概运行时间)，gconv（覆盖率统计）等分析方式。&lt;/p&gt;
&lt;h3 id=&#34;4-2-基础模块：hi-media-hi-mmz-hi-common&#34;&gt;4.2 基础模块：hi_media hi_mmz hi_common&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730155123.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;​    可以从lsmod中很清晰的看出来hi_media hi_mmz hi_common这几个模块的基础地位。hi_media基础模块管理，hi_mmz提供内存管理，hi_common提供proc，log等基础功能，符号导出供其他海思模块使用。&lt;/p&gt;
&lt;p&gt;Common&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;COMMON 模块是 SDK 的基础模块，提供的 API 主要供 SDK 的其他模块调用。&lt;br&gt;
COMMON 模块现在主要有以下功能：
&lt;ul&gt;
&lt;li&gt;系统初始化和去初始化；&lt;/li&gt;
&lt;li&gt;版本信息获取；&lt;/li&gt;
&lt;li&gt;获取时间戳；&lt;/li&gt;
&lt;li&gt;寄存器读写、映射功能；&lt;/li&gt;
&lt;li&gt;MMZ 内存使用；&lt;/li&gt;
&lt;li&gt;调试信息控制；&lt;/li&gt;
&lt;li&gt;Flash 操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;4-2-1-基本通用模块应用层接口common-api&#34;&gt;4.2.1 基本通用模块应用层接口common/api&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;HiSTBLinuxFS&amp;#x2F;source&amp;#x2F;common&amp;#x2F;api
mpi_mem.c
MEM_POOL_Init 应用层的内存池，重复利用。
mpi_memmap.c
映射使用链表区分。管理mmap映射
 
 
mpi_module.c
HI_MODULE_Init中有打开内存操作，内存统一管理。
模块id，名称注册，相互查找。
 
mpi_stat.c
线程时间归零，等相关处理
 
hi_common.c
proc，sys一些路径目录增删提供了用户层接口，mmz内存管理用户层接口
 
mpi_userproc
用户层提供线程 通用proc接口，proc读写是在其它模块内部实现的，函数指针形式
 
 
注：himedia 相关模块是海思自己实现的内核子系统。有自己实现的总线，驱动，设备模型结构体。也是在标准linux模型基础上封装的。
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;4-2-2-基本通用模块驱动接口common-dev&#34;&gt;4.2.2 基本通用模块驱动接口common/dev&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;HiSTBLinuxFS&amp;#x2F;source&amp;#x2F;common&amp;#x2F;dev
drv_dev_ext_k.c 重要
HI_DRV_DEV_Init 所有模块宏定义在这里，注册模块结构体在这里
himedia.c himedia_bash.c     模块注册，注销基础函数
#define DYNAMIC_MINORS 128 &amp;#x2F;* like dynamic majors *&amp;#x2F;            himedia主设备号218
static unsigned char himedia_minors[DYNAMIC_MINORS &amp;#x2F; 8];
 
typedef struct tagPM_BASEDEV_S&amp;#123;
    HI_S32        id;
    const HI_S8    * name;
    struct device    dev;
&amp;#125;PM_BASEDEV_S;
 
#define TO_PM_BASEDEV(x) container_of((x), PM_BASEDEV_S, dev)
 
typedef struct tagPM_BASEOPS_S &amp;#123;
    HI_S32  (*probe)(PM_BASEDEV_S *);
    HI_S32  (*remove)(PM_BASEDEV_S *);
    HI_VOID (*shutdown)(PM_BASEDEV_S *);
    HI_S32  (*prepare)(PM_BASEDEV_S *);
    HI_VOID (*complete)(PM_BASEDEV_S *);
    HI_S32  (*suspend)(PM_BASEDEV_S *, pm_message_t state);
    HI_S32  (*suspend_late)(PM_BASEDEV_S *, pm_message_t state);
    HI_S32  (*resume_early)(PM_BASEDEV_S *);
    HI_S32  (*resume)(PM_BASEDEV_S *);
&amp;#125;PM_BASEOPS_S;
 
 
typedef struct tagPM_BASEDRV_S &amp;#123;
    HI_S32  (*probe) (PM_BASEDEV_S *);
    HI_S32  (*remove)(PM_BASEDEV_S *);
    HI_VOID (*shutdown)(PM_BASEDEV_S *);
    HI_S32  (*suspend)(PM_BASEDEV_S *, pm_message_t state);
    HI_S32  (*suspend_late)(PM_BASEDEV_S *, pm_message_t state);
    HI_S32  (*resume_early)(PM_BASEDEV_S *);
    HI_S32  (*resume)(PM_BASEDEV_S *);
    struct device_driver driver;
&amp;#125;PM_BASEDRV_S;
 
typedef struct tagPM_DEVICE_S  &amp;#123;
    HI_S32 minor;
    const HI_S8 *name;
    struct module *owner;
    const struct file_operations *app_ops;
    PM_BASEOPS_S *base_ops;
    struct list_head list;
    struct device *app_device;
    PM_BASEDEV_S *base_device;
    PM_BASEDRV_S *base_driver;
&amp;#125;PM_DEVICE_S;
 
static struct class *himedia_class;
static struct file_operations himedia_fops &amp;#x3D; &amp;#123;
    .owner        &amp;#x3D; THIS_MODULE,
    .open        &amp;#x3D; himedia_open,
&amp;#125;;
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h5 id=&#34;设备模型结构体&#34;&gt;设备模型结构体&lt;/h5&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;struct himedia_devobj &amp;#123;
    PM_BASEDEV_S pdev;
    char name[1];
&amp;#125;;
 
typedef struct tagPM_BASEDEV_S&amp;#123;
    HI_S32        id;
    const HI_S8    * name;
    struct device    dev;
&amp;#125;PM_BASEDEV_S;
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h5 id=&#34;海思模块顶层总线himedia-bus&#34;&gt;海思模块顶层总线himedia_bus&lt;/h5&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;struct device himedia_bus &amp;#x3D; &amp;#123;
         .init_name        &amp;#x3D; &amp;quot;himediaBusDev&amp;quot;,
         .release    &amp;#x3D; himedia_bus_release
&amp;#125;;  &amp;#x2F;*top level bus, parent and bus member are both NULL*&amp;#x2F;&amp;#x2F;*CNcomment:这是顶层总线，parent 和 bus 成员为 NULL*&amp;#x2F;
struct bus_type himedia_bus_type &amp;#x3D; &amp;#123;
         .name                &amp;#x3D; &amp;quot;himediaBus&amp;quot;,
         .dev_attrs        &amp;#x3D; himedia_dev_attrs,
         .match               &amp;#x3D; himedia_match,
         .uevent              &amp;#x3D; himedia_uevent,
         .pm                     &amp;#x3D; HIMEDIA_PM_OPS_PTR,
&amp;#125;;
定义HIMEDIA_PM_OPS_PTR
                            static struct dev_pm_ops himedia_dev_pm_ops &amp;#x3D; &amp;#123;
                                     .prepare        &amp;#x3D; himedia_pm_prepare,
                                     .complete       &amp;#x3D; himedia_pm_complete,
                                     .suspend        &amp;#x3D; himedia_pm_suspend,
                                     .resume         &amp;#x3D; himedia_pm_resume,
                                     .freeze         &amp;#x3D; himedia_pm_freeze,
                                     .thaw           &amp;#x3D; himedia_pm_thaw,
                                     .poweroff       &amp;#x3D; himedia_pm_poweroff,
                                     .restore        &amp;#x3D; himedia_pm_restore,
                                     .suspend_noirq  &amp;#x3D; himedia_pm_suspend_noirq,
                                     .resume_noirq   &amp;#x3D; himedia_pm_resume_noirq,
                                     .freeze_noirq   &amp;#x3D; himedia_pm_freeze_noirq,
                                     .thaw_noirq     &amp;#x3D; himedia_pm_thaw_noirq,
                                     .poweroff_noirq &amp;#x3D; himedia_pm_poweroff_noirq,
                                     .restore_noirq  &amp;#x3D; himedia_pm_restore_noirq,
                            &amp;#125;;
                            #define HIMEDIA_PM_OPS_PTR     (&amp;amp;himedia_dev_pm_ops)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730154854.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730154845.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h5 id=&#34;内核到用户往用户空间写文件调试&#34;&gt;内核到用户往用户空间写文件调试&lt;/h5&gt;
&lt;p&gt;drv_file_ext.c 提供内核空间创建，读写用户空间文件函数，/mnt文件存储路径。提供了内核数据导出到用户空间的方法。&lt;/p&gt;
&lt;p&gt;应该是echo * &amp;gt; /proc/msp/** 这种调试方式的实现方式&lt;/p&gt;
&lt;h5 id=&#34;内核log日志&#34;&gt;内核log日志&lt;/h5&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;drv_log_ioctl.h  打印日志相关。  这里日志位置可选0:串口 1:网络 2:U盘
&amp;#x2F;*structure of mode log level *&amp;#x2F;
&amp;#x2F;*CNcomment: 模块打印级别控制信息结构 *&amp;#x2F;
typedef struct hiLOG_CONFIG_INFO_S
&amp;#123;
    HI_U8 ModName[16+12];     &amp;#x2F;*mode name 16 + &amp;#39;_&amp;#39; 1 + pid 10 *&amp;#x2F;
    HI_U8 u8LogLevel;         &amp;#x2F;*log level*&amp;#x2F;&amp;#x2F;*CNcomment:  模块打印级别控制 *&amp;#x2F;
    HI_U8 u8LogPrintPos;      &amp;#x2F;*log output location, 0:serial port; 1:network;2:u-disk*&amp;#x2F;&amp;#x2F;*CNcomment:  模块打印位置控制 0:串口 1:网络 2:U盘 *&amp;#x2F;
    HI_U8 u8UdiskFlag;        &amp;#x2F;* u-disk log flag *&amp;#x2F;
&amp;#125;LOG_CONFIG_INFO_S;

hi_debug.h    log调试级别
&amp;#x2F;**Default level of the output debugging information*&amp;#x2F;
&amp;#x2F;**CNcomment: 默认的调试信息输出级别*&amp;#x2F;
#define HI_LOG_LEVEL_DEFAULT HI_LOG_LEVEL_ERROR
 
&amp;#x2F;**Level of the output debugging information*&amp;#x2F;
&amp;#x2F;**CNcomment: 调试信息输出级别*&amp;#x2F;
typedef enum hiLOG_LEVEL_E
&amp;#123;
    HI_LOG_LEVEL_FATAL   &amp;#x3D; 0,     &amp;#x2F;**&amp;lt;Fatal error. It indicates that a critical problem occurs in the system. Therefore, you must pay attention to it.*&amp;#x2F;
                                  &amp;#x2F;**&amp;lt;CNcomment: 致命错误, 此类错误需要特别关注，一般出现此类错误代表系统出现了重大问题 *&amp;#x2F;
    HI_LOG_LEVEL_ERROR   &amp;#x3D; 1,     &amp;#x2F;**&amp;lt;Major error. It indicates that a major problem occurs in the system and the system cannot run.*&amp;#x2F;
                                  &amp;#x2F;**&amp;lt;CNcomment: 一般错误, 一般出现此类错误代表系统出现了比较大的问题，不能再正常运行 *&amp;#x2F;
    HI_LOG_LEVEL_WARNING &amp;#x3D; 2,     &amp;#x2F;**&amp;lt;Warning. It indicates that a minor problem occurs in the system, but the system still can run properly.*&amp;#x2F;
                                  &amp;#x2F;**&amp;lt;CNcomment: 告警信息, 一般出现此类信息代表系统可能出现问题，但是还能继续运行 *&amp;#x2F;
    HI_LOG_LEVEL_INFO    &amp;#x3D; 3,     &amp;#x2F;**&amp;lt;Message. It is used to prompt users. Users can open the message when locating problems. It is recommended to disable this message in general.*&amp;#x2F;
                                  &amp;#x2F;**&amp;lt;CNcomment: 提示信息, 一般是为提醒用户而输出，在定位问题的时候可以打开，一般情况下建议关闭 *&amp;#x2F;
    HI_LOG_LEVEL_DBG     &amp;#x3D; 4,     &amp;#x2F;**&amp;lt;Debug. It is used to prompt developers. Developers can open the message when locating problems. It is recommended to disable this message in general.*&amp;#x2F;
                                  &amp;#x2F;**&amp;lt;CNcomment: 提示信息, 一般是为开发人员调试问题而设定的打印级别，一般情况下建议关闭 *&amp;#x2F;
 
    HI_LOG_LEVEL_BUTT
&amp;#125; HI_LOG_LEVEL_E;
 
drv_media_mem_v2.c    实现了cat &amp;#x2F;proc&amp;#x2F;media-mem
 
drv_mem_ext.c 实现了 KMEM_POOL_S 的管理，&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h5 id=&#34;内核模块管理&#34;&gt;内核模块管理&lt;/h5&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;drv_module_ext.c

COMMON_DRV_ModInit

         MMNGR_DRV_ModInit

        

    s32Ret &amp;#x3D; HI_DRV_MODULE_Register(HI_ID_SYS,    &amp;quot;HI_SYS&amp;quot;,      HI_NULL);

    s32Ret |&amp;#x3D; HI_DRV_MODULE_Register(HI_ID_MODULE, &amp;quot;HI_MODULE&amp;quot;,   HI_NULL);

    s32Ret |&amp;#x3D; HI_DRV_MODULE_Register(HI_ID_LOG,    &amp;quot;HI_LOG&amp;quot;,      HI_NULL);

    s32Ret |&amp;#x3D; HI_DRV_MODULE_Register(HI_ID_PROC,   &amp;quot;HI_PROC&amp;quot;,     HI_NULL);

    s32Ret |&amp;#x3D; HI_DRV_MODULE_Register(HI_ID_STAT,   &amp;quot;HI_STAT&amp;quot;,     HI_NULL);

    s32Ret |&amp;#x3D; HI_DRV_MODULE_Register(HI_ID_MEM,    &amp;quot;HI_MEM&amp;quot;,      HI_NULL);

 

drv_media_mem.c  使用dma_alloc_from_contiguous来分配

HI_DRV_MMZ_Init 这里根据bootargs传递的mmz参数分配内存大小。 mmz分配时的参数：&amp;lt;mmz_name&amp;gt;,&amp;lt;gfp&amp;gt;,&amp;lt;phys_start_addr&amp;gt;,&amp;lt;size&amp;gt;,&amp;lt;alloc_type&amp;gt;&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730154720.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h5 id=&#34;内核proc的实现&#34;&gt;内核Proc的实现&lt;/h5&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;drv_proc_ext.c
HI_DRV_PROC_Init 实现cat &amp;#x2F;proc&amp;#x2F;hisi&amp;#x2F;msp&amp;#x2F;
    proc_mkdir(&amp;quot;graphics&amp;quot;, g_pHisi_proc);
    proc_symlink(&amp;quot;msp&amp;quot;, NULL, &amp;quot;hisi&amp;#x2F;msp&amp;quot;);
    proc_symlink(&amp;quot;graphics&amp;quot;, NULL, &amp;quot;hisi&amp;#x2F;graphics&amp;quot;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;drv_userproc.c    proc使用红黑树管理目录路径&lt;/p&gt;
&lt;p&gt;​    创建销毁目录，路径在这里实现，具体每一个不同模块的proc文件读写在每个模块内部实现，使用函数指针。&lt;/p&gt;
&lt;h4 id=&#34;4-2-3-业务模块应用层通用组件source-component&#34;&gt;4.2.3 业务模块应用层通用组件source/component&lt;/h4&gt;
&lt;p&gt;/home/andy/HiSTBLinuxFS/source/component  &lt;a href=&#34;http://xn--ciqz3l2zejvhba81ax77b534ada8984d6qek8t.so&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;这个目录里面很多目录只有.so&lt;/a&gt; .a库，没有源代码。&lt;/p&gt;
&lt;p&gt;/source/component/hiplayer 没有源码。&lt;/p&gt;
&lt;p&gt;hi_debug.h   各种调试宏定义，不同级别调试定义&lt;/p&gt;
&lt;p&gt;HI_MALLOC   内存分配使用了内核链表管理&lt;/p&gt;
&lt;p&gt;内存在一个模块内分配，往用户空间传递物理地址，其它模块使用这个物理地址映射到虚拟地址，这样来共享内存&lt;/p&gt;
&lt;p&gt;​    海思这里大多数模块都只提供了编译后的库&lt;/p&gt;
&lt;h3 id=&#34;4-3-海思专用组件&#34;&gt;4.3 海思专用组件&lt;/h3&gt;
&lt;h4 id=&#34;4-3-1-海思msp模块应用层接口source-msp-api&#34;&gt;4.3.1 海思MSP模块应用层接口source/msp/api&lt;/h4&gt;
&lt;h5 id=&#34;avplay分析&#34;&gt;Avplay分析&lt;/h5&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;HI_MPI_AVPLAY_Create
         AVPLAY_FrcCreate  帧率控制？    
         HI_MPI_SYNC_Create     音视频同步
         AVPLAY_CreateThread&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;​     &lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730154354.svg&#34; alt=&#34;HI_MPI_AVPLAY_Create.__avplay_mpi_avplay_c&#34;&gt;&lt;/p&gt;
&lt;p&gt;上图插图的是svg格式图片，可以使用IE，firefox打开，最好使用专门的看图软件打开。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;HI_MPI_VDEC_AllocChan
         VPSS_Control(pstVdec-&amp;gt;hVdec,VPSS_CMD_CREATEVPSS,&amp;amp;(pstVdec-&amp;gt;hVpss))
        
UNF调用一般过程，最终采用ioctl调用驱动   
HI_UNF_AVPLAY_GetBuf
         HI_MPI_AVPLAY_GetBuf
                   HI_MPI_VDEC_ChanGetBuffer
                            VDEC_GetStreamBuf                &amp;#x2F;* If get but not put, return last address *&amp;#x2F;    这里有对不对称调用特殊处理
                                     ioctl(s_stVdecAdpParam.s32DevFd, UMAPC_VDEC_GETBUF, &amp;amp;stBufParam);     
                                    
HI_MPI_AVPLAY_Start
         AVPLAY_StartVidChn
                   HI_MPI_SYNC_Start
                   HI_MPI_VDEC_ChanStart
                             ioctl(g_SyncDevFd, CMD_SYNC_START_SYNC, &amp;amp;SyncId);
         HI_MPI_SYNC_Play 结构体状态改变
         AVPLAY_Play             结构体状态控制
         HI_MPI_STAT_Event                                   
 
HI_MPI_AVPLAY_Stop
         AVPLAY_StopVidChn
                   HI_MPI_VDEC_ChanStop
                            VDEC_ChanStop      这里调用函数指针
                   HI_MPI_VDEC_ResetChan
                            VDEC_ResetStreamBuf
                            VDEC_VPSSCMD(hVdec, VPSS_CMD_RESETVPSS, HI_NULL);         调用函数指针，指向VPSS_Control
                   AVPLAY_ResetWindow
                   HI_MPI_SYNC_Stop
         HI_MPI_STAT_Event(STAT_EVENT_VSTOP, 0);
 
VDEC使用函数指针集来支持多种解码方式，内部vfmw。mjpeg，内部硬件265协处理器
mpi_vdec_vpu.c
HI_MPI_VDEC_Init
         HI_CODEC_Register(VDEC_MJPEG_Codec());
         HI_CODEC_Register(VDEC_VFMW_Codec());
 
static HI_CODEC_S hi_codecVPU_entry &amp;#x3D;
&amp;#123;
    .pszName                  &amp;#x3D; &amp;quot;VPU&amp;quot;,
    .unVersion                 &amp;#x3D; &amp;#123;.stVersion &amp;#x3D; &amp;#123;1, 0, 0, 0&amp;#125;&amp;#125;,
    .pszDescription &amp;#x3D; &amp;quot;Hisilicon H265 codec&amp;quot;,
 
    .GetCap                      &amp;#x3D; HI_VPU_GetCap,
    .Create                       &amp;#x3D; HI_VPU_Create,
    .Destroy            &amp;#x3D; HI_VPU_Destroy,
    .Start                           &amp;#x3D; HI_VPU_Start,
    .Stop                            &amp;#x3D; HI_VPU_Stop,
    .Reset                         &amp;#x3D; HI_VPU_Reset,
    .SetAttr             &amp;#x3D; HI_VPU_SetAttr,
    .GetAttr            &amp;#x3D; HI_VPU_GetAttr,
    .DecodeFrame          &amp;#x3D; HI_VPU_DecodeFrame,
    .EncodeFrame &amp;#x3D; HI_NULL,
    .RegFrameBuffer &amp;#x3D; HI_VPU_RegFrameBuffer,
    .GetStreamInfo        &amp;#x3D; HI_VPU_GetStreamInfo,
    .Control             &amp;#x3D; HI_VPU_Control,
&amp;#125;;
 
avplay，vi和 vo之间使用vpss关联。
HI_UNF_VO_DetachWindow
         HI_MPI_AVPLAY_DetachWindow
                   HI_MPI_VDEC_DestroyPort
         HI_MPI_VI_Detach(hSrc, hWindow);
                   VI_DetachFromVpss
        
HI_MPI_AVPLAY_ChnClose
         AVPLAY_FreeVidChn
                   HI_MPI_VDEC_ChanBufferDeInit
                            VDEC_VFMWSpecCMD(hVdec, VFMW_CMD_DETACHBUF, HI_NULL);
                            VDEC_DestroyStreamBuf(pstVdec-&amp;gt;hStreamBuf);                   ummap内存块，ioctl通知内核vdec销毁内存
                   AVPLAY_FreeVdec
                            HI_MPI_VDEC_FreeChan
                                     VPSS_Control(pstVdec-&amp;gt;hVdec,VPSS_CMD_DESTORYVPSS,&amp;amp;(pstVdec-&amp;gt;hVpss));
                                     VDEC_DestroyCodec(pstVdec);
 
HI_UNF_AVPLAY_Destroy
         HI_MPI_AVPLAY_Destroy
                   HI_MPI_SYNC_Destroy(pAvplay-&amp;gt;hSync);
                   ioctl(g_AvplayDevFd, CMD_AVPLAY_DESTROY, &amp;amp;AvplayUsrAddr.AvplayId);
                  
avplay内部的线程
    (HI_VOID)pthread_join(pAvplay-&amp;gt;AvplayDataThdInst, HI_NULL);
#ifdef AVPLAY_VID_THREAD
    (HI_VOID)pthread_join(pAvplay-&amp;gt;AvplayVidDataThdInst, HI_NULL);
#endif
    (HI_VOID)pthread_join(pAvplay-&amp;gt;AvplayStatThdInst, HI_NULL);          &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;4-3-2-海思msp模块驱动层接口source-msp-drv&#34;&gt;4.3.2 海思MSP模块驱动层接口source/msp/drv/&lt;/h4&gt;
&lt;h5 id=&#34;venc&#34;&gt;VENC&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730161000.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;VENC 模块的具体工作原理如上图所示，注意图中褐色箭头，是 VENC 调用到VPSS 模块，来对帧信息做缩放处理后编码的数据流，该处理只用于外部用户送帧的模式。若在绑定情况下出现帧信息分辨率与编码分辨率不匹配， VENC 模块会通知绑定的前级模块进行缩放处理，而不会自行调用 VPSS 模块缩放。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;VENC_DRV_ModInit
         VENC_DRV_Init
                   HI_DRV_MODULE_Register(HI_ID_VENC, &amp;quot;HI_VENC&amp;quot;, (HI_VOID*)&amp;amp;s_VencExportFuncs);
                            MODULE_DRV_Register
                                     ModuleMgr_Link_AddNode(g_pstKModuleHeader, &amp;amp;stModule); 链表管理
                                     LOGAddModule((HI_PCHAR)pu8ModuleName, (HI_MOD_ID_E)u32ModuleID);  在log模块中注册
         HI_DRV_DEV_Register(&amp;amp;g_VencRegisterData)
                   HI_DRV_PM_Register     海思模块管理非常重要的模块，了解这个函数实现过程就大概明白海思内核模块实现思想了
         VENC_DRV_BoardDeinit();      一些寄存器配置，reset，clock操作。
         venc调用硬件协处理器，涉及263,264，mpeg4，
    snprintf(g_VencRegisterData.devfs_name, 64, &amp;quot;%s&amp;quot;, UMAP_DEVNAME_VENC);
    g_VencRegisterData.fops   &amp;#x3D; &amp;VENC_FOPS;
    g_VencRegisterData.minor  &amp;#x3D; UMAP_MIN_MINOR_VENC;
    g_VencRegisterData.owner  &amp;#x3D; THIS_MODULE;
    g_VencRegisterData.drvops &amp;#x3D; &amp;venc_drvops;      &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h5 id=&#34;avplay&#34;&gt;avplay&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730154040.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AVPLAY 主要由以下三部分组成：
&lt;ul&gt;
&lt;li&gt;音视频解码器&lt;/li&gt;
&lt;li&gt;同步播放控制模块&lt;/li&gt;
&lt;li&gt;命令与状态管理模块&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;主要负责响应外部控制命令的执行、状态查询上报、使解码后的帧数据通过同步控制模块输出&lt;/p&gt;
&lt;h5 id=&#34;avplay初始化分析&#34;&gt;avplay初始化分析&lt;/h5&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;AVPLAY_DRV_ModInit
​    HI_DRV_MODULE_Register
​         HI_DRV_MODULE_Register(HI_ID_AVPLAY, AVPLAY_NAME, HI_NULL);
​             ModuleMgr_Link_AddNode  内核模块管理
​             KMODULE_MEM_POOL_AddModule
​                 KMODULE_MEM_POOL_FindNode    找到空的没有使用的节点
​                 KMODULE_MEM_POOL_MALLOC 分配内存，然后放到链表
​             LOGAddModule                    日志
​    HI_DRV_DEV_Register(&amp;amp;g_AvplayRegisterData)
​         HI_DRV_PM_Register(&amp;amp;s_umap_devs[i]);   himedia封装处理
​             himedia_device_alloc(himedia-&amp;gt;name, -1);
​             himedia_device_add(bdev);
​                 dev_set_name(&amp;amp;pdev-&amp;gt;dev, &amp;quot;%s.%d&amp;quot;, pdev-&amp;gt;name, pdev-&amp;gt;id);
​                 device_add(&amp;amp;pdev-&amp;gt;dev);
​             device_create(himedia_class, &amp;amp;(bdev-&amp;gt;dev), dev, NULL, &amp;quot;%s&amp;quot;, himedia-&amp;gt;name);
​             himedia_driver_alloc(himedia-&amp;gt;name, himedia-&amp;gt;owner, himedia-&amp;gt;base_ops);
​             himedia_driver_register(bdrv);
​                 driver_register(&amp;amp;drv-&amp;gt;driver);
​   
 
  g_AvplayRegisterData.fops &amp;#x3D; &amp;AVPLAY_FOPS;
  g_AvplayRegisterData.minor &amp;#x3D; UMAP_MIN_MINOR_AVPLAY;
  g_AvplayRegisterData.owner &amp;#x3D; THIS_MODULE;
  g_AvplayRegisterData.drvops &amp;#x3D; &amp;AVPLAY_DRVOPS;  
 
  s_umap_devs[i].minor &amp;#x3D; umapd-&amp;gt;minor;
  s_umap_devs[i].name &amp;#x3D; umapd-&amp;gt;devfs_name;
  s_umap_devs[i].owner &amp;#x3D; umapd-&amp;gt;owner;
  s_umap_devs[i].app_ops &amp;#x3D; umapd-&amp;gt;fops;
  s_umap_devs[i].base_ops &amp;#x3D; umapd-&amp;gt;drvops;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h5 id=&#34;ioctl实现分析-基于avplay&#34;&gt;IOCTL实现分析 基于avplay&lt;/h5&gt;
&lt;p&gt;在HI_DRV_DEV_Register&lt;strong&gt;中注册&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;static struct file_operations AVPLAY_FOPS &amp;#x3D;
&amp;#123;
    .owner          &amp;#x3D;  THIS_MODULE,
    .open           &amp;#x3D;  AVPLAY_DRV_Open,
    .unlocked_ioctl &amp;#x3D;  AVPLAY_DRV_Ioctl,
    .release        &amp;#x3D;  AVPLAY_DRV_Close,
&amp;#125;;      
AVPLAY_DRV_Ioctl
         HI_DRV_UserCopy(ffile-&amp;gt;f_dentry-&amp;gt;d_inode, ffile, cmd, arg, AVPLAY_Ioctl);
                   func(inode, file, cmd, (parg));           这里对ioctl进行了一层封装，copy_from_user，copy_to_user的自动化处理
AVPLAY_Ioctl(struct inode *inode, struct file *file, unsigned int cmd, HI_VOID *arg)  
                   CMD_AVPLAY_CREATE            
                            AVPLAY_Create
                                     HI_DRV_MMZ_AllocAndMap(BufName, MMZ_OTHERS, 0x2000, 0, &amp;amp;MemBuf);
                                     HI_DRV_PROC_AddModule(ProcName, HI_NULL, HI_NULL);                 这里实现了proc目录的生成，下面是读写proc
                                pProcItem-&amp;gt;read &amp;#x3D; AVPLAY_ProcRead;
                                pProcItem-&amp;gt;write &amp;#x3D; AVPLAY_ProcWrite;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h5 id=&#34;avplay-多个实例如何找到对应实例&#34;&gt;avplay 多个实例如何找到对应实例&lt;/h5&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;AVPLAY_GET_INST_AND_LOCK();
         AVPLAY_CheckHandle
                   pAvplayUsrAddr-&amp;gt;AvplayId &amp;#x3D; hAvplay &amp;amp; 0xff;
                   ioctl(g_AvplayDevFd, CMD_AVPLAY_CHECK_ID, pAvplayUsrAddr);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;drv中的实现&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;AVPLAY_Ioctl            
         AVPLAY_CheckId              
                   pAvplayUsrAddr-&amp;gt;AvplayUsrAddr &amp;#x3D; g_AvplayGlobalState.AvplayInfo[pAvplayUsrAddr-&amp;gt;AvplayId].AvplayUsrAddr;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h5 id=&#34;vpss&#34;&gt;VPSS&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153749.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;    g_VpssRegisterData.fops   &amp;#x3D; &amp;s_VpssFileOps;
    g_VpssRegisterData.minor  &amp;#x3D; UMAP_MIN_MINOR_VPSS;
    g_VpssRegisterData.owner  &amp;#x3D; THIS_MODULE;
g_VpssRegisterData.drvops &amp;#x3D; &amp;s_VpssBasicOps;
VPSS_DRV_Init
VPSS_CTRL_Init
         VPSS_CTRL_RegistISR     注册中断
         VPSS_CTRL_InitInstList((VPSS_IP_E)i)     管理vpss实例链表初始化
         VPSS_HAL_Init                   内存，寄存器配置
         VPSS_CTRL_CreateThread      内核线程
                   VPSS_CTRL_ThreadProc
                            VPSS_CTRL_CreateTask           创建任务
                            VPSS_CTRL_StartTask               开始任务&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h5 id=&#34;vdec-2&#34;&gt;VDEC&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153702.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153709.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h5 id=&#34;avplay解码es流过程&#34;&gt;Avplay解码ES流过程&lt;/h5&gt;
&lt;p&gt;步骤 1 初始化并配置相关设备，如 DISPLAY、 VO、 SOUND、 DEMUX 设备等。步骤 2 调用 HI_UNF_AVPLAY_Init 接口初始化 AVPLAY 设备。步骤 3 调用 HI_UNF_AVPLAY_GetDefaultConfig 接口获取缺省的 AVPLAY 配置，注意选择HI_UNF_AVPLAY_STREAM_TYPE_ES 模式。步骤 4 根据应用需要，修改码流属性参数。步骤 5 调用 HI_UNF_AVPLAY_Create 接口创建 AVPLAY 播放器。步骤 6 调用 HI_UNF_AVPLAY_ChnOpen 接口打开音频或视频通道。&lt;/p&gt;
&lt;p&gt;步骤 7 调用 HI_UNF_AVPLAY_SetAttr 接口设置音频解码器或视频解码器属性，同步设置为自由播放。步骤 8 调用 HI_UNF_SND_CreateTrack 创建 Track。步骤 9 调用 HI_UNF_SND_Attach 接口将音频播放器与 Track 绑定。步骤 10 调用 HI_UNF_VO_AttachWindow 接口将视频播放器与 VO 的窗口绑定。步骤 11 调用 HI_UNF_VO_SetWindowEnable 接口使能窗口。步骤 12 调用 HI_UNF_AVPLAY_Start 接口发送 Start 命令，开始播放音频或视频。步骤 13 调用 HI_UNF_AVPLAY_GetBuf 接口申请存放音频或视频的缓冲区。步骤 14 通过内存拷贝或文件读取等方式，将音频或视频数据直接写到缓冲区中。步骤 15 调用 HI_UNF_AVPLAY_PutBuf 接口更新音视频缓冲区中的读写指针。步骤 16 播放任务结束后，首先调用 HI_UNF_AVPLAY_Stop 接口停止 AVPLAY，再调用HI_UNF_AVPLAY_Destroy 接口销毁 AVPLAY，释放相关资源。步骤 17 关闭相关设备，如 DISPLAY 设备、 VO 设备、 SOUND 设备、 DEMUX 设备和AVPLAY&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730164615.svg&#34; alt=&#34;HI_MPI_AVPLAY_Create.__avplay_mpi_avplay_c&#34;&gt;&lt;/p&gt;
&lt;p&gt;MCE实现了启动过程画面的平滑切换&lt;/p&gt;
&lt;h5 id=&#34;ir&#34;&gt;IR&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153646.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;驱动层&lt;/p&gt;
&lt;p&gt;负责完成红外模块的中断处理，在底半部中遍历所有协议并调用 match 函数来判定当前收到的红外帧属于哪种协议。如果没有匹配，则丢弃当前帧。完成最顶层的错误处理：如果当前帧当前时刻还不能被解析，则会等待大约 200ms 之后再次尝试，如果失败，则丢弃当前帧。&lt;/p&gt;
&lt;p&gt;协议适配层&lt;/p&gt;
&lt;p&gt;完成各个协议的初始化工作，向上提供遍历协议的接口，向下提供容纳协议描述符的存储空间。&lt;/p&gt;
&lt;p&gt;协议处理层&lt;/p&gt;
&lt;p&gt;协议处理层完成判定：由从某个 symbol 开始的一连串 symbol 是不是符合本协议的一帧。在判定某一帧符合本协议的前提条件下，完成一帧 symbol 的解析，将对应的键值解析出来。如果在解析过程中出错，或者判定是本协议的帧，但无法解析时，完成错误处理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153556.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153604.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153611.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153623.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153630.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;4-4-sample-mosaic分析&#34;&gt;4.4 Sample_mosaic分析&lt;/h4&gt;
&lt;h5 id=&#34;应用层调用&#34;&gt;应用层调用&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153315.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;上图是部分截图，完整大的原图见目录中svg文件&lt;/p&gt;
&lt;p&gt;valgrind --tool=callgrind ./sample_mosaic 1080P.h264 h264&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153400.svg&#34; alt=&#34;samplemosaic-callgrind-all&#34;&gt;&lt;/p&gt;
&lt;h5 id=&#34;系统调用&#34;&gt;系统调用&lt;/h5&gt;
&lt;p&gt;Strace分析&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/07/3020210730153300.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;5-小结：&#34;&gt;5:小结：&lt;/h2&gt;
&lt;p&gt;海思MPI驱动其实就是在标准linux驱动基础之上封装了一层，增加了log，proc，内存管理（映射，链表）功能。MPI是在标准linux驱动基础上封装了DVR常用外围逻辑接口，并且统一并简化了接口操作方式，原来各个外围子系统操作方式差别很大，不同实现框架，实现方式使用方法也不一样（如VI，VO，AI/AO，VPSS，如果自己用标准linux子系统实现要复杂得多）。&lt;/p&gt;
&lt;p&gt;应用层MPI接口是在MPI驱动基础上再次封装了一层，封装了驱动的调用，配置等操作，在驱动功能的基础上进一步封装完成了一些简单的业务功能接口，方便了用户的使用。UNF就是在MPI基础上增加了业务逻辑封装，把常用的业务逻辑封装成接口，大大方便用户的应用程序开发。&lt;/p&gt;
&lt;h3 id=&#34;5-1-unf相对标准内核模块区别&#34;&gt;5.1 UNF相对标准内核模块区别&lt;/h3&gt;
&lt;h4 id=&#34;5-1-1-proc读写调试。&#34;&gt;5.1.1 Proc读写调试。&lt;/h4&gt;
&lt;p&gt;实时查询运行状态，修改设置。通用的proc目录、文件创建销毁有通用接口。读写proc文件在每个内核模块中有单独实现。&lt;/p&gt;
&lt;h4 id=&#34;5-1-2-内核空间往应用空间写文件&#34;&gt;5.1.2 内核空间往应用空间写文件&lt;/h4&gt;
&lt;p&gt;方便调试，Dump内核数据到用户控件方便定位Bug。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-c&#34; data-language=&#34;c&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-c&#34;&gt;HI_DRV_FILE_Open
filp_open
HI_DRV_FILE_Close
​    filp_close
HI_DRV_FILE_Read
​    pFile-&amp;gt;f_op-&amp;gt;read
HI_DRV_FILE_Write
​    pFile-&amp;gt;f_op-&amp;gt;write
HI_DRV_FILE_Lseek
​    vfs_llseek&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;5-1-3log管理&#34;&gt;5.1.3Log管理&lt;/h4&gt;
&lt;p&gt;日志打印分级，实时修改。如何实现的见前面章节。&lt;/p&gt;
&lt;h4 id=&#34;5-1-4内存映射&#34;&gt;5.1.4内存映射&lt;/h4&gt;
&lt;p&gt;物理地址，虚拟地址映射关系管理，小块内存使用kmalloc申请，大块内存使用dma_alloc_from_contiguous申请。&lt;/p&gt;
&lt;p&gt;使用内核链表管理。&lt;/p&gt;
&lt;p&gt;打印到proc，log模块中，实时查看运行状态，内存。&lt;/p&gt;
&lt;p&gt;方便查找，打印。&lt;/p&gt;
&lt;p&gt;在多个内核共享数据也是这样实现的。&lt;/p&gt;
&lt;h3 id=&#34;5-2代码分析方法&#34;&gt;5.2代码分析方法&lt;/h3&gt;
&lt;h4 id=&#34;5-2-1-查看代码，静态分析应用层，驱动层实现方法&#34;&gt;5.2.1 查看代码，静态分析应用层，驱动层实现方法&lt;/h4&gt;
&lt;h4 id=&#34;5-2-2-图示静态分析函数调用关系&#34;&gt;5.2.2 图示静态分析函数调用关系.&lt;/h4&gt;
&lt;p&gt;Cflow, dot&lt;/p&gt;
&lt;h4 id=&#34;5-2-3-图示动态分析函数调用关系：库函数，系统调用，内核调用&#34;&gt;5.2.3 图示动态分析函数调用关系：库函数，系统调用，内核调用&lt;/h4&gt;
&lt;p&gt;​    Ltrace, strace, valgrind, perf&lt;/p&gt;
&lt;p&gt;具体分析方法，使用工具见前面章节。&lt;/p&gt;
&lt;h2 id=&#34;参考文档：&#34;&gt;参考文档：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;03-HMS 开发指南.pdf&lt;/li&gt;
&lt;li&gt;HiSTBAndroidV600R001C00SPC060_cn\document\01-Development Guide&lt;/li&gt;
&lt;li&gt;HiMPP V3.0 媒体处理软件开发参考.pdf&lt;/li&gt;
&lt;li&gt;HiSTBAndroidV600R001C00SPC060_cn\document\01-Development Guide&lt;/li&gt;
&lt;li&gt;3798m SDK 代码&lt;/li&gt;
&lt;li&gt;HMS API Development Reference.chm&lt;/li&gt;
&lt;li&gt;HiSTBAndroidV600R001C00SPC060_cn\document\01-Development Guide\09-API Reference&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;相关文章&#34;&gt;相关文章&lt;/h2&gt;

    &lt;div class=&#34;card-url-wrapper&#34;&gt;
        &lt;a href=&#34;/posts/ed364362/&#34;&gt;&lt;img class=&#34;avatar&#34; src=&#34;/medias_webp/cover/linux.webp&#34;&gt;&lt;/a&gt;
        &lt;div class=&#34;desc-wrapper&#34;&gt;
            &lt;a href=&#34;/posts/ed364362/&#34;&gt;如何编写Linux驱动&lt;/a&gt;
            &lt;hr /&gt;
            &lt;div class=&#34;desc&#34;&gt;本文介绍了编写驱动必备基础知识，编写驱动的难点之处。并从按键驱动到Sensor驱动简单介绍示范了驱动编写过程。并给出了驱动学习方法和评价驱动能力的技术指标！&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    

    &lt;div class=&#34;card-url-wrapper&#34;&gt;
        &lt;a href=&#34;/posts/6b2ba137/&#34;&gt;&lt;img class=&#34;avatar&#34; src=&#34;/medias_webp/cover/3g4g.webp&#34;&gt;&lt;/a&gt;
        &lt;div class=&#34;desc-wrapper&#34;&gt;
            &lt;a href=&#34;/posts/6b2ba137/&#34;&gt;3G,4G,Wifi选型需求分析及技术简介&lt;/a&gt;
            &lt;hr /&gt;
            &lt;div class=&#34;desc&#34;&gt;详细介绍了3G，4G，wifi技术类型，选型，移植，性能介绍全过程。写了好多年了，禁止转载，第一次公开发表。&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    

    &lt;div class=&#34;card-url-wrapper&#34;&gt;
        &lt;a href=&#34;/posts/13894dce/&#34;&gt;&lt;img class=&#34;avatar&#34; src=&#34;/medias_webp/cover/hisi.webp&#34;&gt;&lt;/a&gt;
        &lt;div class=&#34;desc-wrapper&#34;&gt;
            &lt;a href=&#34;/posts/13894dce/&#34;&gt;海思MPP&amp;amp;UNF构架源代码级分析&lt;/a&gt;
            &lt;hr /&gt;
            &lt;div class=&#34;desc&#34;&gt;行业中分析海思MPP内核构架，源码分析，多年经验总结积累结果。写了好多年了，禁止转载，第一次公开发表。&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    

    &lt;div class=&#34;card-url-wrapper&#34;&gt;
        &lt;a href=&#34;/posts/ffcce55d/&#34;&gt;&lt;img class=&#34;avatar&#34; src=&#34;/medias_webp/cover/os.webp&#34;&gt;&lt;/a&gt;
        &lt;div class=&#34;desc-wrapper&#34;&gt;
            &lt;a href=&#34;/posts/ffcce55d/&#34;&gt;如何实现自己的操作系统&lt;/a&gt;
            &lt;hr /&gt;
            &lt;div class=&#34;desc&#34;&gt;作为一个程序员，你肯定设想过创造属于自己的操作系统，这其中涉及非常多的知识。本文大概介绍了涉及的知识点，并给出了相关书籍和参考源代码仓库！&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    

    &lt;div class=&#34;card-url-wrapper&#34;&gt;
        &lt;a href=&#34;/posts/32570315/&#34;&gt;&lt;img class=&#34;avatar&#34; src=&#34;/medias_webp/cover/compiler.webp&#34;&gt;&lt;/a&gt;
        &lt;div class=&#34;desc-wrapper&#34;&gt;
            &lt;a href=&#34;/posts/32570315/&#34;&gt;手把手教你构建 C 语言编译器&lt;/a&gt;
            &lt;hr /&gt;
            &lt;div class=&#34;desc&#34;&gt;“手把手教你构建 C 语言编译器” 这一系列教程将带你从头编写一个 C 语言的编译器。希望通过这个系列，我们能对编译器的构建有一定的了解，同时，我们也将构建出一个能用的 C 语言编译器，尽管有许多语法并不支持。&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;embeded系列&#34;&gt;&lt;strong&gt;Embeded系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/embeded/atom.xml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Embeded 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/13894dce/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;海思MPP&amp;amp;UNF构架源代码级分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/6b2ba137/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;3G,4G,Wifi选型需求分析及技术简介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/509c7bd3/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;自动曝光原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/798e6e62/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ISP 数字图像处理 算法概述、工作原理、架构、处理流程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ba4ef326/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;QNAP添加man pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdn.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://cdn.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://cdn.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://cdn.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
&lt;script data-pjax src=&#34;/libs/hbe/hbe-bundle.js?v=13.23&#34;&gt;&lt;/script&gt;&lt;link href=&#34;/libs/hbe/hbe-style.css?v=13.23&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34;&gt;</content>
        <category term="linux" />
        <category term="embeded" />
        <category term="hisilicon" />
        <category term="driver" />
        <category term="3798m" />
        <category term="mpp" />
        <category term="unf" />
        <category term="kernel" />
        <updated>2021-07-01T10:25:00.000Z</updated>
    </entry>
</feed>
