{"id":323023,"date":"2021-05-13T09:00:43","date_gmt":"2021-05-13T09:00:43","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=323023"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=323023","title":{"rendered":"Embedded Linux \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445. \u0412\u0442\u043e\u0440\u043e\u0435"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u043f\u0440\u043e\u043b\u0438\u0442\u044c \u0441\u0432\u0435\u0442 \u043d\u0430 \u0442\u0435\u043c\u0443 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f Embedded Linux \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u0438 \u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043f\u043e\u0434 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/post\/551972\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0439 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043d\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0439, \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0442\u0430\u043a\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a <a href=\"https:\/\/buildroot.org\/\" rel=\"noopener noreferrer nofollow\">Buildroot<\/a>, \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0432\u0435\u044f\u043d\u0438\u044f\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f, \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043c\u0430\u0439\u043b\u043e\u0432 \u0432 \u0442\u043e\u043f\u043e\u0432\u044b\u0439 \u0447\u0430\u0442, \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0432 \u0443\u0437\u043a\u0438\u0445 \u043a\u0440\u0443\u0433\u0430\u0445, <a href=\"https:\/\/goodgame.ru\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0430\u0439\u0442\u0430<\/a>,&nbsp; \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u043e\u0442 \u0441\u043c\u0430\u0439\u043b-\u043f\u0443\u043b\u044c\u0442\u0430. <\/p>\n<hr>\n<p>\u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0430 \u0441 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0438 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043f\u0440\u0438\u0447\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439, \u0431\u0443\u0434\u044c \u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u044f\u0434\u0440\u0430 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u043b\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u0436\u0435, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439. \u0422\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <a href=\"https:\/\/www.yoctoproject.org\/\" rel=\"noopener noreferrer nofollow\">Yocto Project<\/a>, <a href=\"https:\/\/openwrt.org\/\" rel=\"noopener noreferrer nofollow\">OpenWrt<\/a>, <a href=\"https:\/\/buildroot.org\/\" rel=\"noopener noreferrer nofollow\">Buildroot<\/a>, \u0432\u0441\u0435 <a href=\"https:\/\/opensource.com\/article\/18\/6\/embedded-linux-build-tools\" rel=\"noopener noreferrer nofollow\">\u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438<\/a>, \u0438, \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445, \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f.<\/p>\n<h3>Buildroot<\/h3>\n<p>\u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435, Buildroot \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439, \u043b\u0435\u0433\u043a\u0438\u0439 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043a\u0440\u043e\u0441\u0441\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, Buildroot \u0434\u043b\u044f \u0412\u0441\u0435\u0445 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e\u043d\u0438, \u0438, \u0434\u0430, \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0432\u0441\u0451 \u0442\u0430\u043a \u0438 \u0435\u0441\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0e6\/48a\/007\/0e648a0077386795e8ff8395d4abc5f8.png\" width=\"1192\" height=\"640\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0432 <a href=\"https:\/\/buildroot.org\/downloads\/manual\/manual.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/a> (\u0440\u0430\u0437\u0434\u0435\u043b 2), \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c<\/p>\n<pre><code class=\"bash\">git clone -b 2021.02 https:\/\/git.buildroot.net\/buildroot<\/code><\/pre>\n<p>\u0418, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f BeagleBone Black, \u0430 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439, \u0438 \u043d\u0435 \u043e\u0434\u0438\u043d, \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u043b\u0430\u0442\u044b, \u043d\u0443\u0436\u043d\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443<\/p>\n<pre><code class=\"bash\">cd buidlroot make beaglebone_defconfig make<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, Buildroot \u0441\u0430\u043c \u0441\u043a\u0430\u0447\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u0441\u043e\u0431\u0435\u0440\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a, \u044f\u0434\u0440\u043e Linux, \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0432\u043e\u0431\u0449\u0435\u043c \u0432\u0441\u0435 \u0442\u043e, \u0447\u0442\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u0435\u0449\u0435 \u0441\u0432\u0435\u0440\u0445\u0443. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 <em>beaglebone_defconfig<\/em>&#8216;\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439: <\/p>\n<pre><code class=\"bash\">make menuconfig<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439:<\/p>\n<pre><code class=\"bash\">make list-defconfigs<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u043e \u0432\u0441\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c:<\/p>\n<pre><code class=\"bash\">make help<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435, \u0430 \u0441\u043e\u0437\u0434\u0430\u043c \u0441 \u043d\u0443\u043b\u044f \u0441\u0432\u043e\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u043a\u0443\u0434\u0430, \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430, \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043b\u0430\u0442\u044b.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443, \u0433\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b, Buildroot \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u043f\u043a\u0443 <em>\/board. <\/em>\u041f\u0443\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043b\u0430\u0442\u044b \u0431\u0443\u0434\u0435\u0442 &#171;smilebrd&#187; \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <em>\/board\/smilebrd\/<\/em><\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Buildroot \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u044b, \u0432\u0441\u0435, \u043e \u0447\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. <\/p>\n<pre><code class=\"bash\">make defconfig make menuconfig<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u043b\u044e\u0441 Buildroot \u0441\u0430\u043c \u043e\u0442\u043c\u0435\u0442\u0438\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0442\u0443\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, ARM, Cortex-A8<\/p>\n<pre><code>Target options ---&gt;  \tTarget Architecture (ARM (little endian)) \tTarget Architecture Variant (cortex-A8)<\/code><\/pre>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430, \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043a \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0441\u044f, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <em>savedefconfig<\/em><\/p>\n<pre><code>Build options ---&gt; \t($(CONFIG_DIR)\/configs\/smilebrd_defconfig) Location to save buildroot config <\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/551972\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>, <a href=\"https:\/\/developer.arm.com\/-\/media\/Files\/downloads\/gnu-a\/10.2-2020.11\/binrel\/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz?revision=d0b90559-3960-4e4b-9297-7ddbc3e52783&amp;la=en&amp;hash=985078B758BC782BC338DB947347107FBCF8EF6B\" rel=\"noopener noreferrer nofollow\"><em>gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabih<\/em><\/a><em>f<\/em>, \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f glibc &#8212; \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 C++<\/p>\n<pre><code>Toolchain ---&gt;    Toolchain type (External toolchain)   Toolchain (Custom toolchain)   Toolchain origin (Pre-installed toolchain)   ($(HOME)\/toolchain\/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf) Toolchain path   ($(ARCH)-none-linux-gnueabihf) Toolchain prefix    External toolchain gcc version (10.x)   External toolchain kernel headers series (4.20.x)   External toolchain C library (glibc\/eglibc)   [*]Toolchain has C++ support?<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0432\u044b\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u043c, \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 <em>systemd<\/em>, \u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u043d\u0430 <em>bash.<\/em> \u0422\u0430\u043a\u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0417\u0434\u0435\u0441\u044c \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441\u0431\u043e\u0440\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 uEnv.txt, \u043e \u043d\u0435\u043c \u0440\u0435\u0447\u044c \u0448\u043b\u0430 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043f\u043e\u0437\u0436\u0435  <\/p>\n<pre><code>System configuration ---&gt;    (smile_board) System hostname   (Welcome to smile board) System banner   Init system (systemd)   \/bin\/sh (bash)   (board\/smilebrd\/post-build.sh) Custom scripts to run before creating filesystem images<\/code><\/pre>\n<p>post-build.sh:<\/p>\n<p><a class=\"anchor\" name=\"2\" id=\"2\"><\/a><\/p>\n<pre><code class=\"bash\">#!\/bin\/sh BOARD_DIR=\"$(dirname $0)\"  cp $BOARD_DIR\/uEnv.txt $BINARIES_DIR\/uEnv.txt  cp $BOARD_DIR\/smilebrd_serv.service $TARGET_DIR\/etc\/systemd\/system\/smilebrd_serv.service<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0443\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044f\u0434\u0440\u0430 Linux. \u041a\u0430\u043a \u0438 \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u044f\u0434\u0440\u043e, \u0442.\u0435. Buildroot \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u0430\u0447\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u0443\u0435\u0442 \u0438 \u0441\u043e\u0431\u0435\u0440\u0435\u0442 \u0432\u0441\u0451 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0442\u0430\u0440\u0431\u043e\u043b\u0435. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u044f\u0434\u0440\u0430, \u0442.\u043a. \u0432 \u043d\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u0441\u0432\u0435\u0436\u0435\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0441\u0432\u0435\u0436\u0435\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0430, \u0435\u0449\u0435 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 OpenSSL<\/p>\n<p><a class=\"anchor\" name=\"1\" id=\"1\"><\/a><\/p>\n<pre><code>Kernel ---&gt;   [*] Linux Kernel   Kernel version (Custom tarball) ---&gt; Custom tarball   (file:\/\/$(HOME)\/kernel\/linux-5.4.92.tar.xz) URL of custom kernel tarball    Kernel configuration (Using a custom (def)config file)   (board\/smilebrd\/kernel_smilebrd_defconfig) Configuration file path    [*] Build a Device Tree Blob (DTB)   (am335x-boneblack) In-tree Device Tree Source file names   [*] Needs host OpenSSL<\/code><\/pre>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f <em>firmware<\/em> \u0434\u043b\u044f wifi \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 TP-LINK           TL-WN725N, \u043e\u043d \u043c\u0430\u043b, \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043f\u0440\u043e\u0434\u0430\u0436\u0435, \u043d\u0435\u0434\u043e\u0440\u043e\u0433, \u0441 \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0447\u0438\u043f Realtek 8188EU \u043e \u0447\u0435\u043c \u0438 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <em>connman<\/em> \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a wifi. \u0422\u0430\u043a\u0436\u0435, \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0447\u0430\u0442\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c websocket \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u0442\u0438\u043b\u0438\u0442\u0443 wscat, \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 nodejs, \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 nodejs \u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c<\/p>\n<pre><code>Target packages ---&gt; \tHardware handling ---&gt; \t\tFirmware ---&gt;      \t[*] linux firmware \t\t\t\t\t\tWifi firmware ---&gt;              \t[*] Realtek 81xx \tInterpreter languages and scripting ---&gt;   \t[*] nodejs \t\t[*] NPM for the target \t\t\t\t\t(wscat) Additional modules \tNetworking applications ---&gt; \t\t[*] connman \t\t[*] \tenable WiFi support \t\t[*] \tenable command line client<\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 ext4, \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 500 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442, \u0440\u0430\u0437\u043c\u0435\u0440 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043b\u0430\u043d\u043a\u0438, \u0442.\u043a. \u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u043e\u0431\u044b\u0447\u043d\u043e, \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0432\u0441\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0442\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434 \u043a\u043e\u0440\u043d\u0435\u0432\u0443\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/p>\n<pre><code>Filesystem images ---&gt; \t[*] ext2\/3\/4 root filesystem \text2\/3\/4 variant (ext4) ---&gt; ext4 \t(500M) exact size<\/code><\/pre>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a U-Boot, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u043d\u0435\u0433\u043e, \u0433\u0434\u0435 \u0431\u0440\u0430\u0442\u044c \u0438 \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/551972\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e U-Boot, \u0433\u0434\u0435 \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u043f\u0443\u0442\u044c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c U-Boot. \u041f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f AM3358, \u043d\u043e \u044f, \u0432 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445, \u0432\u043d\u0435\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0443\u0431\u0440\u0430\u0432 2-\u0445 \u0441\u0435\u043a\u0443\u043d\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435, \u044d\u0442\u043e \u0432\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f <em>uboot_smilebrd_defconfig<\/em> \u043e\u0442 <em>am335x_evm_defconfig<\/em>. \u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430<\/p>\n<pre><code>Bootloaders ---&gt;   [*] U-Boot       Uboot Version (Custom tarball) ---&gt; Custom tarball       (file:\/\/$(HOME)\/u-boot\/u-boot-2021.01.tar.xz) URL of custom U-Boot tarball       U-Boot configuration (Using a custom board (def)config file)---&gt;       (board\/smilebrd\/uboot_smilebrd_defconfig) Configuration file path    [*] U-Boot needs dtc   U-Boot binary format ---&gt;    \t[*] u-boot.img   [*] Install U-Boot SPL binary image   \t(MLO) U-Boot SPL\/TPL binary image name(s)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e<\/p>\n<pre><code class=\"bash\">make savedefconfig<\/code><\/pre>\n<p>\u0418, \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u043e\u043c. \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 Buildroot, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u044f\u0434\u0440\u0430 Linux &#8212; <em>kernel_smilebrd_defconfig<\/em>. \u041e\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0433\u043e <em>omap2plus_defconfig<\/em>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 wifi \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0438 \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0430. \u0415\u0441\u043b\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 wifi \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0432 \u044f\u0434\u0440\u0435 \u0435\u0441\u0442\u044c, \u0442\u043e \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0430, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u0442, \u0438 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0438\u043c \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f.<\/p>\n<h3>Linux Device Drivers<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0441 \u0447\u0435\u043c \u0435\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043e \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0435. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f94\/175\/38f\/f9417538f14106658cfca2d352604732.png\" width=\"1186\" height=\"1489\"><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0437\u0434\u0435\u043b\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u043b\u0430\u0442\u0443 \u0441 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c <a href=\"https:\/\/www.st.com\/content\/st_com\/en\/products\/microcontrollers-microprocessors\/stm32-32-bit-arm-cortex-mcus\/stm32-ultra-low-power-mcus\/stm32l4-series\/stm32l4x5\/stm32l475rc.html\" rel=\"noopener noreferrer nofollow\">STM32L475<\/a>. \u041a\u0430\u043c\u0435\u043d\u044c \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u043d\u043e \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 \u043d\u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437-\u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u044b\u043b\u044f\u0449\u0438\u0445\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u043e\u043a <a href=\"https:\/\/www.st.com\/en\/evaluation-tools\/nucleo-l476rg.html\" rel=\"noopener noreferrer nofollow\">NUCLEO<\/a>, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u0431\u043e\u0440\u0442\u0443. \u0421\u043c\u0430\u0439\u043b\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043c\u0438 TSC-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u0442.\u0435. \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u044b\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438, \u0432 \u043f\u0440\u043e\u0440\u0435\u0437\u044f\u0445 \u043f\u043b\u0430\u0442\u044b \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u044b, \u043a\u0443\u0434\u0430 \u0436 \u0431\u0435\u0437 \u043d\u0438\u0445, \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044f \u0441 BeagleBone Black \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c I2C, \u0433\u0434\u0435 STM \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0440\u043e\u043b\u0438 \u0432\u0435\u0434\u043e\u043c\u043e\u0433\u043e. \u0415\u0449\u0435 \u0435\u0441\u0442\u044c UART \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0432\u0434\u0440\u0443\u0433 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0441\u0451. \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0431\u0430\u0448\u0435\u043d\u043a\u0438 \u043a\u0432\u0430\u0440\u0446\u0435\u0432\u043e\u0433\u043e \u0440\u0435\u0437\u043e\u043d\u0430\u0442\u043e\u0440\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e RC \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u043e \u043f\u0438\u0442\u0430\u043d\u0438\u0438 \u043e\u0442 \u043f\u043b\u0430\u0442\u044b BeagleBone Black. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0431\u0435\u0437HAL&#8217;\u044c\u043d\u043e\u0435 \u044f\u0434\u0440\u043e \u043d\u0430 <a href=\"https:\/\/github.com\/scmrtos\/scmrtos\" rel=\"noopener noreferrer nofollow\">Scm-RTOS<\/a>, \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445\u0441\u044f, \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/github.com\/heavyC1oud\/smilebrd\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443, \u043e\u0431\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0443 \u043d\u0435\u0433\u043e \u0442\u0430\u043a\u043e\u0439: \u043f\u0440\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u0443\u043b\u044c\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u043d\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0435, \u0434\u0430\u0432\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0435\u043c\u0443 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c, \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u043e\u0446\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u043c GPIO \u0432 BeagleBone Black, \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u043e\u0441 \u043f\u0443\u043b\u044c\u0442\u0430 \u043f\u043e I2C, \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0435\u0439 \u043a\u043d\u043e\u043f\u043a\u0435 \u043f\u043e\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u0441\u043c\u0430\u0439\u043b\u043e\u043c \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 \u0447\u0430\u0442. \u0412 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0447\u0430\u0442\u0430, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0442\u0432\u0435\u0434\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u043d\u0430 \u043f\u0443\u043b\u044c\u0442\u0435. \u0418\u0442\u043e\u0433\u043e \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 I2C, \u043e\u0434\u0438\u043d GPIO, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043a \u0432\u0445\u043e\u0434, \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043e\u0434\u0438\u043d GPIO, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043a \u0432\u044b\u0445\u043e\u0434, \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u0435\u0441\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;linux\/module.h&gt; #include &lt;linux\/fs.h&gt; #include &lt;linux\/miscdevice.h&gt;           \/\/ miscellaneous character module #include &lt;linux\/kernel.h&gt; #include &lt;linux\/of.h&gt;                   \/\/ Device Tree (of - open firmware) #include &lt;linux\/i2c.h&gt;                  \/\/ i2c devices #include &lt;linux\/uaccess.h&gt; #include &lt;linux\/platform_device.h&gt;      \/\/ platform devices #include &lt;linux\/gpio\/consumer.h&gt;        \/\/ GPIO descriptor #include &lt;linux\/interrupt.h&gt;            \/\/ IRQ #include &lt;linux\/wait.h&gt;  #define CMD_CONTROL_LED 0x10 #define CMD_CONTROL_LED_ARG_OFF 0x00 #define CMD_CONTROL_LED_ARG_ON 0x01  \/\/ private smilebrd structure struct smilebrd_dev {     struct i2c_client* i2c_dev;     struct platform_device* gpio_dev;     struct gpio_desc* button;     struct gpio_desc* led;     unsigned int irq;     unsigned int irq_f;     unsigned int tsc_data;      struct miscdevice miscdevice;     char name[8]; };  static struct smilebrd_dev* smilebrd;  static DECLARE_WAIT_QUEUE_HEAD(wq);  \/**  * @brief Device callback for device node ioctl  *\/ static long smilebrd_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {     \/\/ now exist only SWITCH LED command     switch(cmd) {     case CMD_CONTROL_LED:         if(arg == CMD_CONTROL_LED_ARG_ON) {             gpiod_set_value(smilebrd-&gt;led, 1);         }         else {             gpiod_set_value(smilebrd-&gt;led, 0);         }         break;     default:         break;     }      return 0; }  \/**  * @brief Device callback for device node read  *\/ static ssize_t smilebrd_read(struct file *filp, char __user *userbuf, size_t count, loff_t *ppos) {     \/\/ stopping the process until an interrupt is received     wait_event_interruptible(wq, smilebrd-&gt;irq_f != 0);      \/\/ interrupt received and handled     smilebrd-&gt;irq_f = 0;      \/\/ copy received device data from kernel space to user space     if(copy_to_user(userbuf, &amp;smilebrd-&gt;tsc_data, sizeof(smilebrd-&gt;tsc_data)) != 0) {         return -EIO;     }      return sizeof(unsigned int); }  \/**  * @brief Input GPIO interrupt handler  *\/ static irqreturn_t smilebrd_gpio_irq_handler(int irq, void* dev_id) {     \/\/ send i2c data     smilebrd-&gt;tsc_data = i2c_smbus_read_byte(smilebrd-&gt;i2c_dev);      \/\/ set irq flag     smilebrd-&gt;irq_f = 1;     wake_up_interruptible(&amp;wq);      return IRQ_HANDLED; }  \/**  * @brief File operations structure  *\/ static const struct file_operations smilebrd_fops = {     .owner = THIS_MODULE,     .read = smilebrd_read,     .unlocked_ioctl = smilebrd_ioctl, };  \/**  * @brief Install GPIO  *\/ static int smilebrd_gpio_probe(struct platform_device* pdev) {     int retval;     smilebrd-&gt;gpio_dev = pdev;      \/\/ input GPIO, check signal from smile board     smilebrd-&gt;button = gpiod_get(&amp;smilebrd-&gt;gpio_dev-&gt;dev, \"button\", 0);     gpiod_direction_input(smilebrd-&gt;button);      \/\/ output GPIO, controls \"enable server\" LED     smilebrd-&gt;led = gpiod_get(&amp;smilebrd-&gt;gpio_dev-&gt;dev, \"led\", 0);     gpiod_direction_output(smilebrd-&gt;led, 0);      \/\/ add debounce interval to input GPIO     retval = gpiod_set_debounce(smilebrd-&gt;button, 1000 * 5);        \/\/ time unit 1 us, 1000 us * 5 = 5 ms, MAX = 7 ms     if(retval != 0) {         pr_err(\"could not set debounce interval\\n\");     }      \/\/ add interrupt to input GPIO     smilebrd-&gt;irq = gpiod_to_irq(smilebrd-&gt;button);     retval = request_threaded_irq(smilebrd-&gt;irq, NULL, smilebrd_gpio_irq_handler, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, \"smilepd_drv\", NULL);     if(retval != 0) {         pr_err(\"could not register smilebrd irq handler\\n\");         return retval;     }      pr_info(\"smilebrd gpio probed!\\n\");     return 0; }  \/**  * @brief Remove GPIO  *\/ static int smilebrd_gpio_remove(struct platform_device* pdev) {     free_irq(smilebrd-&gt;irq, NULL);     gpiod_put(smilebrd-&gt;button);     gpiod_put(smilebrd-&gt;led);      pr_info(\"smilebrd gpio remove\\n\");      return 0; }  \/**  * @brief Match driver data with device tree data  *\/ static const struct of_device_id smilebrd_gpio_dt_ids[] = {     { .compatible = \"heavyc1oud,smilebrd_gpio\", },     {} }; MODULE_DEVICE_TABLE(of, smilebrd_gpio_dt_ids);  static struct platform_driver smilebrd_gpio_drv = {     .probe = smilebrd_gpio_probe,     .remove = smilebrd_gpio_remove,     .driver = {         .name = \"smilebrd_gpio\",         .of_match_table = of_match_ptr(smilebrd_gpio_dt_ids),         .owner = THIS_MODULE,     }, };  \/**  * @brief Install I2C  *\/ static int smilebrd_i2c_probe(struct i2c_client* client, const struct i2c_device_id *id) {     \/\/ store pointer to device structure in the bus     i2c_set_clientdata(client, smilebrd);      \/\/ store pointer to I2C client into private structure     smilebrd-&gt;i2c_dev = client;      pr_info(\"smilebrd i2c probed!\\n\");      return 0; }  \/**  * @brief Remove I2C  *\/ static int smilebrd_i2c_remove(struct i2c_client* client) {     \/\/ get device structure from device bus     smilebrd = i2c_get_clientdata(client);      pr_info(\"smilebrd i2c remove\\n\");      return 0; }  \/**  * @brief Match driver data with device tree data  *\/ static const struct of_device_id smilebrd_i2c_dt_ids[] = {     { .compatible = \"heavyc1oud,smilebrd_i2c\", },     {} };  static const struct i2c_device_id smilebrd_i2c_i2cbus_id[] ={     {\"smilebrd_i2c\", 0},     {}, }; MODULE_DEVICE_TABLE(i2c, smilebrd_i2c_i2cbus_id);  static struct i2c_driver smilebrd_i2c_drv = {     .probe = smilebrd_i2c_probe,     .remove = smilebrd_i2c_remove,     .id_table = smilebrd_i2c_i2cbus_id,     .driver = {         .name = \"smilebrd_i2c\",         .of_match_table = of_match_ptr(smilebrd_i2c_dt_ids),         .owner = THIS_MODULE,     }, };  \/**  * @brief Whole driver initialization  *\/ static int __init smilebrd_init(void) {     \/\/ allocate mem for private structure     smilebrd = kzalloc(sizeof(struct smilebrd_dev), GFP_KERNEL);      \/\/ initialize misc device     smilebrd-&gt;miscdevice.name = \"smilebrd\";     smilebrd-&gt;miscdevice.minor = MISC_DYNAMIC_MINOR;     smilebrd-&gt;miscdevice.fops = &amp;smilebrd_fops;      \/\/ register miscdevice     if(misc_register(&amp;smilebrd-&gt;miscdevice)) {         pr_err(\"could not register smilebrd misc device\\n\");         return EINVAL;     }      \/\/ register smilebrd gpio driver     if(platform_driver_register(&amp;smilebrd_gpio_drv)) {         pr_err(\"could not register smilebrd gpio driver\\n\");         return EINVAL;     }      \/\/ register smilebrd i2c driver     if(i2c_register_driver(THIS_MODULE, &amp;smilebrd_i2c_drv)) {         pr_err(\"could not register smilebrd i2c driver\\n\");         return EINVAL;     }      return 0; }  \/**  * @brief Whole driver deinitialization  *\/ static void __exit smilebrd_exit(void) {     \/\/ deregister miscdevice     misc_deregister(&amp;smilebrd-&gt;miscdevice);      \/\/ deregister smilebrd gpio driver     platform_driver_unregister(&amp;smilebrd_gpio_drv);      \/\/ deregister smilebrd i2c driver     i2c_del_driver(&amp;smilebrd_i2c_drv);      \/\/ free mem previously allocated in smilebrd_init     kfree(smilebrd); }  module_init(smilebrd_init); module_exit(smilebrd_exit);  MODULE_LICENSE(\"GPL\"); MODULE_AUTHOR(\"HeavyC1oud vheavyC1oud@gmail.com\"); MODULE_DESCRIPTION(\"smilebrd driver\");<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e, <a href=\"https:\/\/www.kernel.org\/doc\/html\/latest\/driver-api\/driver-model\/overview.html#:~:text=The%20Linux%20Kernel%20Driver%20Model,into%20globally%20accessible%20data%20structures.\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432<\/a> Linux \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/825\/104\/725\/825104725c395e24dcec2fb33cb9dd4e.png\" alt=\"Bootlin Linux Kernel and Driver Development Training\" title=\"Bootlin Linux Kernel and Driver Development Training\" width=\"445\" height=\"593\"><figcaption>Bootlin Linux Kernel and Driver Development Training<\/figcaption><\/figure>\n<p>&#171;\u0421\u0432\u0435\u0440\u0445\u0443&#187; \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u0444\u0440\u0435\u043c\u0432\u043e\u0440\u043a\u043e\u043c, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435 <em>\/dev<\/em> \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c <em>open\/read\/write\/close<\/em>, \u043c\u043e\u0436\u0435\u0442 \u0435\u0449\u0435 <em>ioctl.<\/em> \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a, \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u0445 \u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u0442\u0438\u043c \u0443\u0437\u043b\u043e\u043c, \u044d\u0442\u043e \u0442\u0438\u043f, \u0438 \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 <em>major<\/em> \u0438 <em>minor<\/em>.<\/p>\n<p>\u0412 Linux, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 &#8212; \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435, \u0431\u043b\u043e\u0447\u043d\u043e\u0435 \u0438\u043b\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0444\u0435\u0439\u0441, \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442,  \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438, \u0442.\u0435. \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a \u043f\u043e\u0442\u043e\u043a\u0443 \u0431\u0430\u0439\u0442\u043e\u0432. \u0427\u0438\u0441\u043b\u0430 major \u0438 minor \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0442 <a href=\"https:\/\/www.kernel.org\/doc\/Documentation\/admin-guide\/devices.txt\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0439 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438<\/a>, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, USB-UART \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u0438\u043a \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 BeagleBone Black, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e <em>\/dev\/ttyUSB0 <\/em>\u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 <em>major<\/em>\/<em>minor<\/em> &#8212; 188\/0, \u0447\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0434\u043b\u044f <em>USB serial converters<\/em> \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430 0.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7bb\/cee\/5ad\/7bbcee5add90c4da0cfc060724472f63.png\" width=\"589\" height=\"25\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0437\u043d\u0430\u044f \u043e\u0431\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0430, \u043f\u0440\u0438\u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u0431\u043e\u0440 \u0441\u0442\u043e\u0438\u0442 \u0441 \u043a\u043e\u043d\u0446\u0430<\/p>\n<pre><code class=\"cpp\">module_init(smilebrd_init); module_exit(smilebrd_exit);  MODULE_LICENSE(\"GPL\"); MODULE_AUTHOR(\"HeavyC1oud vheavyC1oud@gmail.com\"); MODULE_DESCRIPTION(\"smilebrd driver\");<\/code><\/pre>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u043f\u043e \u0441\u0443\u0442\u0438, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u044f\u0434\u0440\u0430, \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u044d\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u0431\u0449\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0435\u0441\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0438 \u043d\u0430\u0431\u0440\u0430\u0442\u044c <em>modinfo<\/em>. <\/p>\n<p><em>module_init(smilebrd_init)<\/em> \u0438 <em>module_exit(smilebrd_exit)<\/em> \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u0432\u043e\u043e\u0431\u0449\u0435 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 \u044f\u0434\u0440\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e, \u0442.\u043a. \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u043a\u043e\u0434\u0430 \u044f\u0434\u0440\u0430, \u0438 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a \u0432\u0435\u0440\u0441\u0438\u0438, \u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0436\u0438\u0432\u0443\u0442 \u0434\u043e\u043b\u044c\u0448\u0435. \u042d\u0442\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0437\u0430\u0434\u0430\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u044f. \u041a\u043e\u0433\u0434\u0430 \u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f? \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u043f\u0438\u0441\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0442.\u043a. \u043e\u043d \u0443\u043a\u0430\u0437\u0430\u043d \u0432 Device Tree \u0438\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0431\u0443\u0434\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u044f<\/p>\n<pre><code class=\"cpp\">static int __init smilebrd_init(void) {     \/\/ allocate mem for private structure     smilebrd = kzalloc(sizeof(struct smilebrd_dev), GFP_KERNEL);      \/\/ initialize misc device     smilebrd-&gt;miscdevice.name = \"smilebrd\";     smilebrd-&gt;miscdevice.minor = MISC_DYNAMIC_MINOR;     smilebrd-&gt;miscdevice.fops = &amp;smilebrd_fops;      \/\/ register miscdevice     if(misc_register(&amp;smilebrd-&gt;miscdevice)) {         pr_err(\"could not register smilebrd misc device\\n\");         return EINVAL;     }   ...<\/code><\/pre>\n<p>\u0412\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043d\u0430 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0438 \u0434\u0430\u043b\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f &#171;\u0432\u0435\u0440\u0445\u043d\u044f\u044f&#187; \u0447\u0430\u0441\u0442\u044c, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u044f\u0432\u043d\u043e \u043a \u043a\u0430\u043a\u043e\u043c\u0443-\u043b\u0438\u0431\u043e \u0442\u0438\u043f\u0443, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0434\u0435\u043b\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 <em>major<\/em> \u043d\u043e\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442 \u0438 \u043d\u0435\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043d, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0436\u0438\u0437\u043d\u044c \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c <a href=\"https:\/\/www.kernel.org\/doc\/html\/v4.14\/driver-api\/misc_devices.html\" rel=\"noopener noreferrer nofollow\"><em>Miscenallaneous device<\/em><\/a>, \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u044f\u0434\u0440\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442 \u0435\u043c\u0443 <em>major <\/em>\u043d\u043e\u043c\u0435\u0440 10, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <em>MISC_DYNAMIC_MINOR<\/em> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 <em>minor<\/em> \u0438 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0443\u0437\u0435\u043b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0434\u043b\u044f \u043d\u0435\u0433\u043e, \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <em>miscdevice.fops<\/em> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441 \u0444\u0430\u0439\u043b\u043e\u043c<em>.<\/em><\/p>\n<p><em>miscdevice.fops<\/em>, \u0442.\u0435. <em>file operations,<\/em> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 <a href=\"https:\/\/elixir.bootlin.com\/linux\/latest\/source\/include\/linux\/fs.h#L1888\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <\/a>\u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 <em>open<\/em>, <em>read<\/em>, <em>write<\/em>, <em>poll<\/em>, <em>mmap<\/em>  \u0438.\u0442.\u0434. \u041d\u0443\u0436\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <em>read<\/em> \u0438 <em>ioctl,<\/em> \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435 <em>.owner<\/em>, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 <em>THIS_MODULE<\/em><\/p>\n<pre><code class=\"cpp\">static const struct file_operations smilebrd_fops = {     .owner = THIS_MODULE,     .read = smilebrd_read,     .unlocked_ioctl = smilebrd_ioctl, };<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u0443\u0437\u043b\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u043e\u043d \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043c \u0434\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u043e \u043a\u0430\u0441\u0430\u043d\u0438\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u0443\u043b\u044c\u0442\u0430. \u0414\u0430\u043d\u043d\u044b\u0435 \u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 I2C \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043e\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0433 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<pre><code class=\"cpp\">static ssize_t smilebrd_read(struct file *filp, char __user *userbuf, size_t count, loff_t *ppos) {     \/\/ stopping the process until an interrupt is received     wait_event_interruptible(wq, smilebrd-&gt;irq_f != 0);      \/\/ interrupt received and handled     smilebrd-&gt;irq_f = 0;      \/\/ copy received device data from kernel space to user space     if(copy_to_user(userbuf, &amp;smilebrd-&gt;tsc_data, sizeof(smilebrd-&gt;tsc_data)) != 0) {         return -EIO;     }      return sizeof(unsigned int); }<\/code><\/pre>\n<p><em>ioctl<\/em> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c, \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0447\u0430\u0442\u0430, \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f<\/p>\n<pre><code class=\"cpp\">static long smilebrd_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {     \/\/ now exist only SWITCH LED command     switch(cmd) {     case CMD_CONTROL_LED:         if(arg == CMD_CONTROL_LED_ARG_ON) {             gpiod_set_value(smilebrd-&gt;led, 1);         }         else {             gpiod_set_value(smilebrd-&gt;led, 0);         }         break;     default:         break;     }      return 0; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 &#171;\u0441\u043d\u0438\u0437\u0443&#187;, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 Linux <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d8e\/aff\/e59\/d8eaffe59fde7d7b052dfae8cbc0f305.png\" alt=\"\u0412\u0421\u0415 \u041d\u0410 \u0414\u041d\u041e\" title=\"\u0412\u0421\u0415 \u041d\u0410 \u0414\u041d\u041e\" width=\"689\" height=\"216\"><figcaption>\u0412\u0421\u0415 \u041d\u0410 \u0414\u041d\u041e<\/figcaption><\/figure>\n<p>&#171;\u0421\u043d\u0438\u0437\u0443&#187; \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u0448\u0438\u043d\u0430\u043c\u0438 Platform Device \u0438 I2C, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442 I2C, \u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u0435\u043c\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e \u043a\u0430\u0441\u0430\u043d\u0438\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432 \u0438 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c. \u0412\u043e\u043e\u0431\u0449\u0435, \u0432 \u044f\u0434\u0440\u0435 \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u043dc\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u044b \u0438\u043b\u0438 \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0438. \u0422\u0430\u043a\u0436\u0435, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 \u044f\u0434\u0440\u0430 4.8, \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 GPIO, \u0435\u0441\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0432\u044b\u0432\u043e\u0434\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0447\u0435\u0440\u0435\u0437 \u0438\u0445 \u043d\u043e\u043c\u0435\u0440, \u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u0435\u043d \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0451 \u0432 \u0442\u043e\u043c \u0436\u0435 <em>init&#8217;<\/em>\u0435<\/p>\n<pre><code class=\"cpp\">static int __init smilebrd_init(void) { \t\t...     \/\/ register smilebrd gpio driver     if(platform_driver_register(&amp;smilebrd_gpio_drv)) {         pr_err(\"could not register smilebrd gpio driver\\n\");         return EINVAL;     }      \/\/ register smilebrd i2c driver     if(i2c_register_driver(THIS_MODULE, &amp;smilebrd_i2c_drv)) {         pr_err(\"could not register smilebrd i2c driver\\n\");         return EINVAL;     }      return 0; }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u043e\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u0447\u0442\u043e \u0438 \u0437\u0430\u0447\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f?  \u0427\u0442\u043e &#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435, \u0417\u0430\u0447\u0435\u043c &#8212; \u0447\u0442\u043e\u0431\u044b \u0448\u0438\u043d\u0430 \u043c\u043e\u0433\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u044d\u0442\u0438\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b probe\/remove, \u0442.\u0435. \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435\/\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u044f\u0434\u0440\u0430.<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 I2C <\/p>\n<pre><code class=\"cpp\">static const struct of_device_id smilebrd_i2c_dt_ids[] = {     { .compatible = \"heavyc1oud,smilebrd_i2c\", },     {} };<\/code><\/pre>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <em>smilebrd_i2c_dt_ids<\/em> \u0442\u0438\u043f\u0430 <em>of_device_id<\/em>, \u0433\u0434\u0435 <em>of<\/em> \u044d\u0442\u043e <em>Open Firmware<\/em>, \u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e <a href=\"https:\/\/www.kernel.org\/doc\/html\/latest\/devicetree\/usage-model.html\" rel=\"noopener noreferrer nofollow\">Open Firmware Device Tree<\/a> &#8212; \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043a \u043f\u043b\u0430\u0442\u0435, \u0442.\u0435. \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043a\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 PCI \u0438\u043b\u0438 USB \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. I2C \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0448\u0438\u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0438, \u0447\u0442\u043e\u0431\u044b \u044f\u0434\u0440\u043e \u0443\u0437\u043d\u0430\u043b\u043e \u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0438 I2C \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0432\u0430, \u0435\u043c\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u043e\u043d \u0436\u0435 Device Tree. \u041a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0435 \u0438\u043c\u044f \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043f\u043e\u043b\u0435 <em>.compatible, <\/em>\u0442\u0430\u043a \u044f\u0434\u0440\u043e \u0441\u043c\u043e\u0436\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437 Device Tree \u0438, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043d\u0438\u043c\u0438, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438<\/p>\n<pre><code class=\"cpp\">static const struct i2c_device_id smilebrd_i2c_i2cbus_id[] ={     {\"smilebrd_i2c\", 0},     {}, }; MODULE_DEVICE_TABLE(i2c, smilebrd_i2c_i2cbus_id);<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u044f\u0434\u0440\u0435, \u043e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <em>id<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439  \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0441\u0445\u043e\u0436\u0435\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u043e \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0443 \u043f\u0443\u043b\u044c\u0442\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0441\u043c\u0430\u0439\u043b\u043e\u0432, \u044d\u0442\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0431\u044b \u0442\u0430\u043a<\/p>\n<pre><code class=\"cpp\">static const struct i2c_device_id smilebrd_i2c_i2cbus_id[] ={     {\"smilebrd_i2c\", 0},     {\"smilebrd_2_i2c\", 1},     {},   ...<\/code><\/pre>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0432\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>.probe\/.remove<\/em> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<pre><code class=\"cpp\">static struct i2c_driver smilebrd_i2c_drv = {     .probe = smilebrd_i2c_probe,     .remove = smilebrd_i2c_remove,     .id_table = smilebrd_i2c_i2cbus_id,     .driver = {         .name = \"smilebrd_i2c\",         .of_match_table = of_match_ptr(smilebrd_i2c_dt_ids),         .owner = THIS_MODULE,     }, };<\/code><\/pre>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439, \u0432 Device Tree \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u043e \u043d\u0435\u043a\u043e\u0435\u043c \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430 <em>&#171;heavyc1oud,smilebrd_i2c&#187;<\/em>, \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0438\u0434\u0438\u0442 \u044d\u0442\u0443 \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u044c\u044e, \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0435\u0433\u043e \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <em>.probe<\/em>; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <em>.remove<\/em> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d, \u0435\u0441\u043b\u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430<\/p>\n<pre><code class=\"cpp\">static int smilebrd_i2c_probe(struct i2c_client* client, const struct i2c_device_id *id) {     \/\/ store pointer to device structure in the bus     i2c_set_clientdata(client, smilebrd);      \/\/ store pointer to I2C client into private structure     smilebrd-&gt;i2c_dev = client;      pr_info(\"smilebrd i2c probed!\\n\");      return 0; }  static int smilebrd_i2c_remove(struct i2c_client* client) {     \/\/ get device structure from device bus     smilebrd = i2c_get_clientdata(client);      pr_info(\"smilebrd i2c remove\\n\");      return 0; }<\/code><\/pre>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043f\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438, \u0432 <em>.probe<\/em>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <em>gpiod_get<\/em><strong> <\/strong>\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440, \u043f\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0443 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b, \u0432\u044b\u0445\u043e\u0434 \u0434\u043b\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430, \u0432\u0445\u043e\u0434 \u0434\u043b\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u044f, \u0442\u0430\u043a\u0436\u0435 \u0443 \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0434\u0440\u0435\u0431\u0435\u0437\u0433\u0430, \u0445\u043e\u0442\u044c \u044d\u0442\u043e \u0438 \u043d\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430, \u043d\u043e \u0438\u0437-\u0437\u0430 \u0434\u043b\u0438\u043d\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0430 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u044b, \u0438 \u043a \u043d\u0435\u043c\u0443 \u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0441\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u043c\u0443 \u0444\u0440\u043e\u043d\u0442\u0443<\/p>\n<pre><code class=\"cpp\">static int smilebrd_gpio_probe(struct platform_device* pdev) {     int retval;     smilebrd-&gt;gpio_dev = pdev;      \/\/ input GPIO, check signal from smile board     smilebrd-&gt;button = gpiod_get(&amp;smilebrd-&gt;gpio_dev-&gt;dev, \"button\", 0);     gpiod_direction_input(smilebrd-&gt;button);      \/\/ output GPIO, controls \"enable server\" LED     smilebrd-&gt;led = gpiod_get(&amp;smilebrd-&gt;gpio_dev-&gt;dev, \"led\", 0);     gpiod_direction_output(smilebrd-&gt;led, 0);      \/\/ add debounce interval to input GPIO     retval = gpiod_set_debounce(smilebrd-&gt;button, 1000 * 5);        \/\/ time unit 1 us, 1000 us * 5 = 5 ms, MAX = 7 ms     if(retval != 0) {         pr_err(\"could not set debounce interval\\n\");     }      \/\/ add interrupt to input GPIO     smilebrd-&gt;irq = gpiod_to_irq(smilebrd-&gt;button);     retval = request_threaded_irq(smilebrd-&gt;irq, NULL, smilebrd_gpio_irq_handler, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, \"smilepd_drv\", NULL);     if(retval != 0) {         pr_err(\"could not register smilebrd irq handler\\n\");         return retval;     }      pr_info(\"smilebrd gpio probed!\\n\");     return 0; }<\/code><\/pre>\n<p>\u0412 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 I2C, \u0443 \u043f\u0443\u043b\u044c\u0442\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043a\u043d\u043e\u043f\u043a\u0430\u0445, \u0437\u0430\u0442\u0435\u043c \u0432 \u0443\u0437\u0435\u043b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0442 \u043f\u0443\u043b\u044c\u0442\u0430, \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e<\/p>\n<pre><code class=\"cpp\">static irqreturn_t smilebrd_gpio_irq_handler(int irq, void* dev_id) {     \/\/ send i2c data     smilebrd-&gt;tsc_data = i2c_smbus_read_byte(smilebrd-&gt;i2c_dev);      \/\/ set irq flag     smilebrd-&gt;irq_f = 1;     wake_up_interruptible(&amp;wq);      return IRQ_HANDLED; }<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c \u044f\u0434\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <em>menuconfig<\/em> \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0441\u044f. <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0442.\u043a. \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u044f\u0432\u043d\u043e \u043a \u043a\u0430\u043a\u043e\u043c\u0443-\u043b\u0438\u0431\u043e \u0442\u0438\u043f\u0443, \u0442\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0435 <em>\/drivers\/staging\/<\/em> <\/p>\n<pre><code class=\"bash\">cd \/drivers\/staging mkdir smilebrd touch smilebrd_dev.c<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u043a\u043e\u0434\u043e\u043c, \u0432 \u043f\u0430\u043f\u043a\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0449\u0435 \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430. \u041f\u0435\u0440\u0432\u044b\u0439, <em>Kconfig<\/em>, \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430 \u0432 \u043c\u0435\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044f\u0434\u0440\u0430, \u0442\u0430\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0438\u043f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438, \u0432 \u043a\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u044f\u0434\u0440\u043e, \u0442.\u0435. <em>\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \/ \u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \/ \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043c\u043e\u0434\u0443\u043b\u044f<\/em> \u0438 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f<\/p>\n<pre><code class=\"cmake\"># SPDX-License-Identifier: GPL-2.0 config SMILEBRD \ttristate \"Smile board driver\" \thelp \tthis option adds a \"smile board\" device to manage some emoticons on the goodgame.ru site <\/code><\/pre>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0444\u0430\u0439\u043b, <em>Makefile<\/em>, \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430<\/p>\n<pre><code class=\"cmake\"># SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_SMILEBRD)\t+= smilebrd_dev.o<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0435 <em>Kconfig<\/em> \u0438 <em>Makefile<\/em> \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u043e\u0432\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435<\/p>\n<p>\u0412 \u0444\u0430\u0439\u043b <em>drivers\/staging\/Kconfig<\/em><\/p>\n<pre><code class=\"cmake\">... source \"drivers\/staging\/smilebrd\/Kconfig\" ...<\/code><\/pre>\n<p>\u0412 \u0444\u0430\u0439\u043b <em>drivers\/staging\/Makefile<\/em><\/p>\n<pre><code class=\"cmake\">... obj-$(CONFIG_SMILEBRD)      += smilebrd\/<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044f\u0434\u0440\u0430, \u0432 \u043c\u0435\u043d\u044e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 <em>Device Drivers &#8212;&gt; Staging drivers &#8212;&gt;<\/em><strong><em> <\/em><\/strong>\u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bbe\/6f8\/3ed\/bbe6f83ed2fdcdd170c747863087b9cd.png\" width=\"778\" height=\"642\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u043d\u0435\u0435, <a href=\"#1\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u044f\u0434\u0440\u0430 \u0432 Buildroot<\/a>, \u0431\u044b\u043b \u0443\u043a\u0430\u0437\u0430\u043d \u043a\u043e\u043d\u0444\u0438\u0433 <em>kernel_smilebrd_defconfig<\/em>, \u043e\u043d \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 <em>omap2plus_defconfig<\/em>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u0432 \u0432\u0438\u0434\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043f\u0443\u043d\u043a\u0442\u043e\u0432 <em>Device Drivers &#8212;&gt; Staging drivers &#8212;&gt; Realtek RTL8188EU Wireless LAN NIC driver<\/em> \u0438 <em>Device Drivers &#8212;&gt; Staging drivers &#8212;&gt; Smile board driver<\/em>. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0437\u0434\u0435\u0441\u044c \u0436\u0435 <em>.config<\/em>, \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432 \u0444\u0430\u0439\u043b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 Buildroot \u0438 <em>kernel_smilebrd_defconfig<\/em> \u0433\u043e\u0442\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e\u0431\u044b \u044f\u0434\u0440\u043e \u0440\u0435\u0448\u0438\u043b\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c, \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0435\u0449\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435.<\/p>\n<h3>Device Tree<\/h3>\n<p>\u0423\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u043e \u0434\u0435\u0440\u0435\u0432\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0435\u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c, \u0435\u0449\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043d\u0443\u0436\u0434. <\/p>\n<p>\u0414\u0430\u0432\u043d\u044b\u043c \u0434\u0430\u0432\u043d\u043e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u044f\u0434\u0440\u0430, \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0441\u044c \u0432 \u043f\u0430\u043f\u043a\u0430\u0445 <em>\/arch\/arm\/plat-xxx<\/em> \u0438 <em>\/arch\/arm\/mach-xxx<\/em>, \u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u044f\u0434\u0440\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0447\u0435\u0440\u0435\u0437, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0410-\u0442\u044d\u0433\u0438, <em>ATAGS<\/em>, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043a\u0430\u0436\u0434\u044b\u0439, \u0443\u0432\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u0441\u0435\u0431\u044f, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0441\u0432\u043e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c, \u043f\u043e\u043a\u0430, \u043e\u0434\u043d\u0430\u0436\u0434\u044b, \u043d\u0435\u0431\u0435\u0437\u044b\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u041b\u0438\u043d\u0443\u0441 \u0422\u043e\u0440\u0432\u0430\u043b\u044c\u0434\u0441 \u043d\u0435 \u0432\u044b\u0440\u0430\u0437\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0437\u0430\u0431\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u0430 <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d39\/3fc\/8e7\/d393fc8e74b49b7ca7a66175e8c0a259.png\" width=\"948\" height=\"203\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c Device Tree, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 SPARK \u0438 PowerPC. <\/p>\n<p>\u0414\u0435\u0440\u0435\u0432\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u0443\u0437\u043b\u043e\u0432, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0434\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043a \u0448\u0438\u043d\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d1e\/d3d\/6e4\/d1ed3d6e42db2c1bfcf3ea351768c426.png\" alt=\"Device Tree for Dummies\" title=\"Device Tree for Dummies\" width=\"1047\" height=\"788\"><figcaption>Device Tree for Dummies<\/figcaption><\/figure>\n<p>\u0412\u0441\u0435 ARM&#8217;\u043e\u0432\u044b\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u043f\u0430\u043f\u043a\u0435 <em>\/arch\/arm\/boot\/dts\/<\/em>, \u0442\u043e \u0434\u0435\u0440\u0435\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>am335x-boneblack.dts<\/em>. \u0422\u0430\u043a\u043e\u0439 \u0436\u0435 \u0444\u0430\u0439\u043b, \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c <em>.dtb<\/em>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u0435\u0449\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b \u0435\u0433\u043e \u044f\u0434\u0440\u0443 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435. DTB \u044d\u0442\u043e Device Tree Binary \u0438\u043b\u0438 Device Tree Blob, \u0442.\u0435. \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 DTS &#8212; Device Tree Source, \u0435\u0449\u0435 \u0435\u0441\u0442\u044c DTSI &#8212; Device Tree Source Include, \u044d\u0442\u043e \u0444\u0430\u0439\u043b\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0435 \u0432 <em>.dts<\/em>, \u0438, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438. <\/p>\n<p>\u0412 \u0434\u0435\u0440\u0435\u0432\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u0441\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0436\u0435\u043b\u0435\u0437\u0430. <\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 am335x-boneblack.dts<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/\/ SPDX-License-Identifier: GPL-2.0-only \/*  * Copyright (C) 2012 Texas Instruments Incorporated - http:\/\/www.ti.com\/  *\/ \/dts-v1\/;  #include \"am33xx.dtsi\" #include \"am335x-bone-common.dtsi\" #include \"am335x-boneblack-common.dtsi\"  \/ { \tmodel = \"TI AM335x BeagleBone Black\"; \tcompatible = \"ti,am335x-bone-black\", \"ti,am335x-bone\", \"ti,am33xx\"; };  &amp;cpu0_opp_table { \t\/* \t * All PG 2.0 silicon may not support 1GHz but some of the early \t * BeagleBone Blacks have PG 2.0 silicon which is guaranteed \t * to support 1GHz OPP so enable it for PG 2.0 on this board. \t *\/ \toppnitro-1000000000 { \t\topp-supported-hw = &lt;0x06 0x0100&gt;; \t}; };  &amp;am33xx_pinmux { \tsmilebrd_pins: pinmux_smilebrd_pins { \t\tpinctrl-single,pins = &lt; \t\t\tAM33XX_PADCONF(AM335X_PIN_GPMC_A0, PIN_INPUT_PULLUP, MUX_MODE7)\t\t\/* (R13) gpio1_16 button pin*\/ \t\t\tAM33XX_PADCONF(AM335X_PIN_GPMC_A1, PIN_OUTPUT, MUX_MODE7)\t\t \t\/* (V14) gpio1_17 led pin*\/ \t\t&gt;; \t}; };  &amp;i2c2 { \tsmilebrd_i2c: smilebrd_i2c@48 { \t\tcompatible = \"heavyc1oud,smilebrd_i2c\"; \t\treg = &lt;0x48&gt;; \t}; };  \/ { \tsmilebrd_gpio: smilebrd_gpio { \t\tcompatible = \"heavyc1oud,smilebrd_gpio\"; \t\tpinctrl-names = \"default\"; \t\tpinctrl-0 = &lt;&amp;smilebrd_pins&gt;; \t\tbutton-gpios = &lt;&amp;gpio1 16 GPIO_ACTIVE_LOW&gt;; \t\tled-gpios = &lt;&amp;gpio1 17 GPIO_ACTIVE_HIGH&gt;; \t\tinterrupt-parent = &lt;&amp;gpio1&gt;; \t\tinterrupts = &lt;16 IRQ_TYPE_EDGE_FALLING&gt;; \t\tstatus = \"okay\"; \t}; }; <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0443\u0437\u0435\u043b <em>&amp;am33xx_pinmux<\/em>, \u0437\u0434\u0435\u0441\u044c, \u0430\u043c\u043f\u0435\u0440\u0441\u0430\u043d\u0434 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b <em>am33xx_pinmux<\/em>, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043d \u0432\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 <em>am335x-bone-common.dtsi<\/em>, \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043e\u0431\u044b\u0447\u043d\u043e, \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438, \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442.\u0435. \u0432 \u044d\u0442\u043e\u043c \u0443\u0437\u043b\u0435 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u0443\u044e \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c. <\/p>\n<p>\u0412 \u0443\u0437\u0435\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u044b R13 \u0438 V14 \u043c\u0438\u043a\u0440\u043e\u0441\u0445\u0435\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a \u0432\u044b\u0432\u043e\u0434\u044b \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b, R13 \u043a\u0430\u043a \u0432\u0445\u043e\u0434 \u0441 \u043f\u043e\u0434\u0442\u044f\u0436\u043a\u043e\u0439 \u043a \u043f\u0438\u0442\u0430\u043d\u0438\u044e, V14 \u043a\u0430\u043a \u0432\u044b\u0445\u043e\u0434, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0445\u043e\u0434 push-pull<\/p>\n<pre><code class=\"cpp\">&amp;am33xx_pinmux { \tsmilebrd_pins: pinmux_smilebrd_pins { \t\tpinctrl-single,pins = &lt; \t\t\tAM33XX_PADCONF(AM335X_PIN_GPMC_A0, PIN_INPUT_PULLUP, MUX_MODE7)\t\/* (R13) gpio1_16 button pin*\/ \t\t\tAM33XX_PADCONF(AM335X_PIN_GPMC_A1, PIN_OUTPUT, MUX_MODE7)\t\t \t  \/* (V14) gpio1_17 led pin*\/ \t\t&gt;; \t}; };<\/code><\/pre>\n<p>\u041f\u043e \u0442\u0430\u043a\u043e\u043c\u0443 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043a \u0443\u0437\u043b\u0443 <em>&amp;i2c2<\/em>, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438\u043c\u0435\u0435\u0442 \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0441\u043e\u0432 I2C, \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. \u0421\u0430\u043c \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c I2C, \u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443, \u0442\u0430\u043a, \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <em>compatible<\/em> \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <em>reg<\/em> \u044d\u0442\u043e \u043d\u043e\u043c\u0435\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0448\u0438\u043d\u0435 I2C, \u0442.\u0435. \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0431\u0430\u0439\u0442\u0435 \u043f\u0440\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 I2C<\/p>\n<pre><code class=\"cpp\">&amp;i2c2 { \tsmilebrd_i2c: smilebrd_i2c@48 { \t\tcompatible = \"heavyc1oud,smilebrd_i2c\"; \t\treg = &lt;0x48&gt;; \t}; };<\/code><\/pre>\n<p>\u0423\u0437\u0435\u043b <em>smilebrd_gpio<\/em><strong><em> <\/em><\/strong>\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043c\u043f\u0435\u0440\u0441\u0430\u043d\u0434\u0430, \u0437\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <em>compatible<\/em> \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0443\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u044e\u0432\u0430\u044e\u0449\u0438\u0435 \u0441\u0432\u044f\u0437\u044c \u0441 \u0443\u0437\u043b\u043e\u043c \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u0442.\u0435. \u043d\u0438\u0437\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0430 ACTIVE_HIGH \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a \u043d\u0435\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u0430\u043d\u043e\u0434 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430 \u0438 \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0442 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u0437\u0430\u0436\u0435\u0447\u044c, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f. \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e <em>interrupts<\/em> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u044b\u0432\u043e\u0434, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0441\u043f\u0430\u0434 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0435\u0433\u043e \u0442\u0440\u0438\u0433\u0435\u0440\u0430. \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e <em>status<\/em> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <em>okay<\/em> \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<pre><code class=\"cpp\">smilebrd_gpio: smilebrd_gpio { \tcompatible = \"heavyc1oud,smilebrd_gpio\"; \tpinctrl-names = \"default\"; \tpinctrl-0 = &lt;&amp;smilebrd_pins&gt;; \tbutton-gpios = &lt;&amp;gpio1 16 GPIO_ACTIVE_LOW&gt;; \tled-gpios = &lt;&amp;gpio1 17 GPIO_ACTIVE_HIGH&gt;; \tinterrupt-parent = &lt;&amp;gpio1&gt;; \tinterrupts = &lt;16 IRQ_TYPE_EDGE_FALLING&gt;; \tstatus = \"okay\"; };<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u044f\u0434\u0440\u0430, \u043d\u0443\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0430\u0440\u0431\u043e\u043b\u0430 \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432 Buildroot <a href=\"#1\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f<\/a> \u043f\u0443\u0442\u044c \u043a \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u044f\u0434\u0440\u0443.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0442 \u043f\u0443\u043b\u044c\u0442\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u043d\u0443\u0436\u043d\u044b\u0439 \u0441\u043c\u0430\u0439\u043b \u0432 \u0447\u0430\u0442.<\/p>\n<h3>\u0422\u043e\u043f\u043e\u0432\u044b\u0439 \u0447\u0430\u0442<\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0443\u043f\u043e\u0440 <a href=\"https:\/\/goodgame.ru\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0440\u0442\u0430\u043b\u0430<\/a>, \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u043c\u0430\u0439\u043b\u044b, \u0441\u0434\u0435\u043b\u0430\u043d \u043d\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/github.com\/GoodGame\/API\/blob\/master\/Chat\/protocol.md\" rel=\"noopener noreferrer nofollow\">API<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c websocket-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 JSON-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0443 \u043d\u0435\u0435 \u0442\u0430\u043a\u043e\u0439, \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b <em>wscat<\/em> \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u0441 \u0432\u0435\u0431\u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438, \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0447\u0430\u0442\u0430 \u0438 \u0436\u0434\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b, pipes. \u0417\u0430\u0442\u0435\u043c, \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439, \u0442.\u0435. \u043f\u0435\u0440\u0432\u044b\u0439 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441 \u0441\u0430\u043c\u044b\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c, \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u043d\u0430\u043b\u0443 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.  \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0436\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u043d\u0430 \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0435, \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c <em>ioctl<\/em>, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e,<strong><em> <\/em><\/strong>\u0443\u0437\u043b\u0430 <em>dev\/smilebrd<\/em>. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e read \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e \u043a\u0430\u0441\u0430\u043d\u0438\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 \u043e\u0442 \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0430, \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u0441\u043b\u0443\u0436\u0438\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u043e\u0433\u043e \u0441\u0435\u043d\u0441\u043e\u0440\u0430 \u043a\u043e\u0441\u043d\u0443\u043b\u0438\u0441\u044c, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0441\u043c\u0430\u0439\u043b\u0430, \u0438 \u044d\u0442\u043e\u0442 \u0441\u043c\u0430\u0439\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0447\u0430\u0442. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0439\u0442\u0438 \u043a\u043e\u0434 <a href=\"https:\/\/github.com\/heavyC1oud\/smilebrd_serv\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0446\u0435\u043b\u0438, \u0442.\u0435. \u0447\u0442\u043e\u0431\u044b \u0441\u0431\u043e\u0440\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u043d\u0443\u0436\u043d\u043e \u0432 Buildroot \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0441 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439, \u043f\u0440\u0438\u0447\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043c \u0436\u0435, \u0433\u0434\u0435 \u0438 \u0432\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c\u0441\u044f.<\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 Buildroot, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u044f\u0434\u0440\u0430, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 <em>package\/<\/em><\/p>\n<pre><code class=\"bash\">mkdir buildroot\/package\/smilebrd_serv<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432 \u044d\u0442\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430, Config.in \u0438 smilebrd_serv.mk, \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430 \u043c\u0435\u043d\u044e \u0432 Buildroot, \u0432\u0442\u043e\u0440\u043e\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043a\u0430\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443<\/p>\n<p>Config.in<\/p>\n<pre><code>config BR2_PACKAGE_SMILEBRD_SERV         bool \"smilebrd_serv\"         help           Utility to work with smile board device and send some smiles           to goodgame.ru chat.<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043d\u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 <em>package\/Config.in<\/em>, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b, \u0433\u0434\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0440\u0430\u0437\u0434\u0435\u043b menu &#171;Miscellaneous&#187;<\/p>\n<pre><code>... source \"package\/smilebrd_serv\/Config.in\" ...<\/code><\/pre>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0432 \u0440\u043e\u043b\u0438 \u0442\u0435\u0433\u0430 \u043f\u0440\u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0441 <em>github<\/em>. <em>Makefile<\/em>, \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0442\u0443\u0434\u0430 \u0436\u0435, \u0432 SMILEBRD_SERV_INSTALL_TARGET_CMDS \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0443\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430, \u043f\u0443\u043d\u043a\u0442 <em>$(eval $(generic-package))<\/em> \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0441\u0431\u043e\u0440\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c <em>Makefile<\/em><\/p>\n<p>smilebrd_serv.mk<\/p>\n<pre><code class=\"cmake\">################################################################################ # # smilebrd_serv # ################################################################################  SMILEBRD_SERV_VERSION = v2.0 SMILEBRD_SERV_SITE = $(call github,heavyC1oud,smilebrd_serv,$(SMILEBRD_SERV_VERSION))  define SMILEBRD_SERV_BUILD_CMDS \t$(MAKE) CC=\"$(TARGET_CC)\" LD=\"$(TARGET_LD)\" -C $(@D) endef  define SMILEBRD_SERV_INSTALL_TARGET_CMDS \t$(INSTALL) -D -m 0755 $(@D)\/smilebrd_serv $(TARGET_DIR)\/usr\/bin endef  $(eval $(generic-package))<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043c\u0435\u043d\u044e Buildroot \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442<\/p>\n<pre><code>Target packages ---&gt; \t\tMiscellaneous ---&gt;     \t[*] smilebrd_serv<\/code><\/pre>\n<p>\u0412\u0441\u0451, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <\/p>\n<pre><code class=\"cmake\">make savedefconfig<\/code><\/pre>\n<p>\u0418 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435<\/p>\n<pre><code class=\"cmake\">make<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0443 <em>\/output\/images\/<\/em>, \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0443\u0442 \u0444\u0430\u0439\u043b\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>am335x-boneblack.dtb &#8212;&gt; \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 <\/p>\n<\/li>\n<li>\n<p>MLO &#8212;&gt; \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a<\/p>\n<\/li>\n<li>\n<p>u-boot.img &#8212;&gt; \u0442\u0440\u0435\u0442\u0438\u0447\u043d\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a<\/p>\n<\/li>\n<li>\n<p>u-Env.txt &#8212;&gt; \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b u-boot<\/p>\n<\/li>\n<li>\n<p>zImage &#8212;&gt; \u044f\u0434\u0440\u043e Linux<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u043a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430:<\/p>\n<ul>\n<li>\n<p>rootfs.tar<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0430 SD \u043a\u0430\u0440\u0442\u0435, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/551972\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>, \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <em>connman<\/em><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a8\/104\/488\/7a8104488708f41086aec8e36da5a712.png\" width=\"532\" height=\"251\"><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438, \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <em>top<\/em><strong><em>,<\/em><\/strong> \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 <em>smilebrd_serv<\/em>, \u043e\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 <a href=\"#2\" rel=\"noopener noreferrer nofollow\"><em>post-build.sh<\/em><\/a>, \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <em>lsmod<\/em> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 \u043d\u0435\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c <em>smilebrd_dev<\/em>. \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435, BeagleBone Black \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u0442.\u0435. \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0433\u043e\u0440\u0438\u0442\u0441\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u043d\u0430 \u043f\u0443\u043b\u044c\u0442\u0435 \u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0430\u0442\u044c \u0441\u043c\u0430\u0439\u043b\u044b, \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u044c<\/p>\n<p><iframe id=\"60993130d0e17eb5ff4723c2\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/60993130d0e17eb5ff4723c2\" class=\"embed_video embed__content\" allowfullscreen=\"true\"><\/iframe><\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e, \u043b\u0435\u0433\u043a\u043e \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u043a\u0430\u043a \u0438 \u0431\u044b\u043b\u043e \u043e\u0431\u0435\u0449\u0430\u043d\u043e. \u0422\u0435\u043c, \u043a\u0442\u043e \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u043d\u0430 Linux, \u0438, \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0441\u043c\u043e\u0433 \u043f\u0440\u043e\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0437\u0430\u0446\u0430, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e Buildroot&#8217;\u043e\u0432\u0441\u043a\u0438\u0439 \u043b\u043e\u0437\u0443\u043d\u0433 \u0437\u0432\u0443\u0447\u0438\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0446\u0438\u043d\u0438\u0447\u043d\u043e, \u043d\u043e, \u043d\u0435\u0442, \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u0431\u043e\u0440\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0435<a href=\"https:\/\/www.linuxfromscratch.org\/\" rel=\"noopener noreferrer nofollow\"> Linux From Scratch<\/a> \u043d\u0435 \u0434\u0430\u0434\u0443\u0442 \u0441\u043e\u0432\u0440\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430 Linux, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0432\u0441\u0435 \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u044f\u0434\u0440\u0430, \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0430\u0435\u0442, \u043e\u0442\u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0413\u0440\u0435\u0433 \u041a\u0440\u043e\u0430-\u0425\u0430\u0440\u0442\u043c\u0430\u043d \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u0438\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u043e Linux Device Drivers \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u0442\u043e \u0438\u0445, \u0432\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0438\u0441\u0447\u0435\u0437\u0430\u044e\u0449\u0435 \u043c\u0430\u043b\u043e.<\/p>\n<p>\u0412\u043e\u0442 \u043c\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u0441 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u043d\u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043d\u0443 \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e <a href=\"https:\/\/stackoverflow.com\/\" rel=\"noopener noreferrer nofollow\">\u0444\u043e\u0440\u0443\u043c\u044b<\/a>, \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c, \u0432\u0430\u043c \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0433\u0443\u0442.<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/www.oreilly.com\/library\/view\/linux-device-drivers\/0596005903\/\" rel=\"noopener noreferrer nofollow\">Linux Device Drivers, 3rd Edition [2005]<\/a> &#8212; \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0430\u044f, \u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u0430\u044f \u043a \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e \u043a\u043d\u0438\u0433\u0430<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/bootlin.com\/docs\/\" rel=\"noopener noreferrer nofollow\">\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0442\u0440\u0435\u043d\u0438\u043d\u0433\u043e\u0432 \u043e\u0442 Bootlin<\/a> &#8212; \u0442\u0440\u0435\u043d\u0438\u043d\u0433\u0438 \u043f\u043b\u0430\u0442\u043d\u044b\u0435, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.amazon.com\/Mastering-Embedded-Linux-Programming-Simmonds\/dp\/1784392537\" rel=\"noopener noreferrer nofollow\">Mastering Embedded Linux Programming [2015] <\/a>&#8212; \u043f\u0440\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.amazon.com\/Linux-Driver-Development-Embedded-Processors\/dp\/1729321828\" rel=\"noopener noreferrer nofollow\">Linux Driver Development for Embedded Processors [2018]<\/a> &#8212; \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435, \u0440\u0430\u0437<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.oreilly.com\/library\/view\/linux-device-drivers\/9781785280009\/\" rel=\"noopener noreferrer nofollow\">Linux Device Drivers Development [2017] <\/a>&#8212; \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435, \u0434\u0432\u0430<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.oreilly.com\/library\/view\/mastering-linux-device\/9781789342048\/\" rel=\"noopener noreferrer nofollow\">Mastering Linux Device Driver Development [2021] <\/a>&#8212; \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0435\u0439\u0448\u0438\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435, \u0442\u0440\u0438<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/elinux.org\/images\/f\/f9\/Petazzoni-device-tree-dummies_0.pdf\" rel=\"noopener noreferrer nofollow\">Device tree for dummies [2013]<\/a> &#8212; \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e \u043f\u0440\u043e \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0441\u043b\u0430\u0439\u0434\u044b \u043a <a href=\"https:\/\/www.youtube.com\/watch?v=m_NyYEBxfn8\" rel=\"noopener noreferrer nofollow\">\u043b\u0435\u043a\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/buildroot.org\/downloads\/manual\/manual.html\" rel=\"noopener noreferrer nofollow\">\u041c\u0430\u043d\u0443\u0430\u043b \u043f\u043e Buildroot<\/a><\/p>\n<\/li>\n<li>\n<p>\u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 <a href=\"https:\/\/www.kernel.org\/doc\/html\/latest\/\" rel=\"noopener noreferrer nofollow\">Datasheet <\/a>\u043f\u043e \u044f\u0434\u0440\u0443 Linux<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/552216\/\"> https:\/\/habr.com\/ru\/post\/552216\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u043f\u0440\u043e\u043b\u0438\u0442\u044c \u0441\u0432\u0435\u0442 \u043d\u0430 \u0442\u0435\u043c\u0443 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f Embedded Linux \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u0438 \u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043f\u043e\u0434 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/post\/551972\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0439 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043d\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0439, \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0442\u0430\u043a\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a <a href=\"https:\/\/buildroot.org\/\" rel=\"noopener noreferrer nofollow\">Buildroot<\/a>, \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0432\u0435\u044f\u043d\u0438\u044f\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f, \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043c\u0430\u0439\u043b\u043e\u0432 \u0432 \u0442\u043e\u043f\u043e\u0432\u044b\u0439 \u0447\u0430\u0442, \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0432 \u0443\u0437\u043a\u0438\u0445 \u043a\u0440\u0443\u0433\u0430\u0445, <a href=\"https:\/\/goodgame.ru\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0430\u0439\u0442\u0430<\/a>,&nbsp; \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u043e\u0442 \u0441\u043c\u0430\u0439\u043b-\u043f\u0443\u043b\u044c\u0442\u0430. <\/p>\n<hr>\n<p>\u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0430 \u0441 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0438 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043f\u0440\u0438\u0447\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439, \u0431\u0443\u0434\u044c \u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u044f\u0434\u0440\u0430 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u043b\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u0436\u0435, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439. \u0422\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <a href=\"https:\/\/www.yoctoproject.org\/\" rel=\"noopener noreferrer nofollow\">Yocto Project<\/a>, <a href=\"https:\/\/openwrt.org\/\" rel=\"noopener noreferrer nofollow\">OpenWrt<\/a>, <a href=\"https:\/\/buildroot.org\/\" rel=\"noopener noreferrer nofollow\">Buildroot<\/a>, \u0432\u0441\u0435 <a href=\"https:\/\/opensource.com\/article\/18\/6\/embedded-linux-build-tools\" rel=\"noopener noreferrer nofollow\">\u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438<\/a>, \u0438, \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445, \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f.<\/p>\n<h3>Buildroot<\/h3>\n<p>\u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435, Buildroot \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439, \u043b\u0435\u0433\u043a\u0438\u0439 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043a\u0440\u043e\u0441\u0441\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, Buildroot \u0434\u043b\u044f \u0412\u0441\u0435\u0445 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e\u043d\u0438, \u0438, \u0434\u0430, \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0432\u0441\u0451 \u0442\u0430\u043a \u0438 \u0435\u0441\u0442\u044c.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0432 <a href=\"https:\/\/buildroot.org\/downloads\/manual\/manual.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/a> (\u0440\u0430\u0437\u0434\u0435\u043b 2), \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c<\/p>\n<pre><code class=\"bash\">git clone -b 2021.02 https:\/\/git.buildroot.net\/buildroot<\/code><\/pre>\n<p>\u0418, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f BeagleBone Black, \u0430 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439, \u0438 \u043d\u0435 \u043e\u0434\u0438\u043d, \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u043b\u0430\u0442\u044b, \u043d\u0443\u0436\u043d\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443<\/p>\n<pre><code class=\"bash\">cd buidlroot make beaglebone_defconfig make<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, Buildroot \u0441\u0430\u043c \u0441\u043a\u0430\u0447\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u0441\u043e\u0431\u0435\u0440\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a, \u044f\u0434\u0440\u043e Linux, \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0432\u043e\u0431\u0449\u0435\u043c \u0432\u0441\u0435 \u0442\u043e, \u0447\u0442\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u0435\u0449\u0435 \u0441\u0432\u0435\u0440\u0445\u0443. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 <em>beaglebone_defconfig<\/em>&#8216;\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439: <\/p>\n<pre><code class=\"bash\">make menuconfig<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439:<\/p>\n<pre><code class=\"bash\">make list-defconfigs<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u043e \u0432\u0441\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c:<\/p>\n<pre><code class=\"bash\">make help<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435, \u0430 \u0441\u043e\u0437\u0434\u0430\u043c \u0441 \u043d\u0443\u043b\u044f \u0441\u0432\u043e\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u043a\u0443\u0434\u0430, \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430, \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043b\u0430\u0442\u044b.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443, \u0433\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b, Buildroot \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u043f\u043a\u0443 <em>\/board. <\/em>\u041f\u0443\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043b\u0430\u0442\u044b \u0431\u0443\u0434\u0435\u0442 &#171;smilebrd&#187; \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <em>\/board\/smilebrd\/<\/em><\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Buildroot \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u044b, \u0432\u0441\u0435, \u043e \u0447\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. <\/p>\n<pre><code class=\"bash\">make defconfig make menuconfig<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u043b\u044e\u0441 Buildroot \u0441\u0430\u043c \u043e\u0442\u043c\u0435\u0442\u0438\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0442\u0443\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, ARM, Cortex-A8<\/p>\n<pre><code>Target options ---&gt;  \tTarget Architecture (ARM (little endian)) \tTarget Architecture Variant (cortex-A8)<\/code><\/pre>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430, \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043a \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0441\u044f, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <em>savedefconfig<\/em><\/p>\n<pre><code>Build options ---&gt; \t($(CONFIG_DIR)\/configs\/smilebrd_defconfig) Location to save buildroot config <\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/551972\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>, <a href=\"https:\/\/developer.arm.com\/-\/media\/Files\/downloads\/gnu-a\/10.2-2020.11\/binrel\/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz?revision=d0b90559-3960-4e4b-9297-7ddbc3e52783&amp;la=en&amp;hash=985078B758BC782BC338DB947347107FBCF8EF6B\" rel=\"noopener noreferrer nofollow\"><em>gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabih<\/em><\/a><em>f<\/em>, \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f glibc &#8212; \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 C++<\/p>\n<pre><code>Toolchain ---&gt;    Toolchain type (External toolchain)   Toolchain (Custom toolchain)   Toolchain origin (Pre-installed toolchain)   ($(HOME)\/toolchain\/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf) Toolchain path   ($(ARCH)-none-linux-gnueabihf) Toolchain prefix    External toolchain gcc version (10.x)   External toolchain kernel headers series (4.20.x)   External toolchain C library (glibc\/eglibc)   [*]Toolchain has C++ support?<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0432\u044b\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u043c, \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 <em>systemd<\/em>, \u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u043d\u0430 <em>bash.<\/em> \u0422\u0430\u043a\u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0417\u0434\u0435\u0441\u044c \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441\u0431\u043e\u0440\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 uEnv.txt, \u043e \u043d\u0435\u043c \u0440\u0435\u0447\u044c \u0448\u043b\u0430 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043f\u043e\u0437\u0436\u0435  <\/p>\n<pre><code>System configuration ---&gt;    (smile_board) System hostname   (Welcome to smile board) System banner   Init system (systemd)   \/bin\/sh (bash)   (board\/smilebrd\/post-build.sh) Custom scripts to run before creating filesystem images<\/code><\/pre>\n<p>post-build.sh:<\/p>\n<p><a class=\"anchor\" name=\"2\" id=\"2\"><\/a><\/p>\n<pre><code class=\"bash\">#!\/bin\/sh BOARD_DIR=\"$(dirname $0)\"  cp $BOARD_DIR\/uEnv.txt $BINARIES_DIR\/uEnv.txt  cp $BOARD_DIR\/smilebrd_serv.service $TARGET_DIR\/etc\/systemd\/system\/smilebrd_serv.service<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0443\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044f\u0434\u0440\u0430 Linux. \u041a\u0430\u043a \u0438 \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u044f\u0434\u0440\u043e, \u0442.\u0435. Buildroot \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u0430\u0447\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u0443\u0435\u0442 \u0438 \u0441\u043e\u0431\u0435\u0440\u0435\u0442 \u0432\u0441\u0451 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0442\u0430\u0440\u0431\u043e\u043b\u0435. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u044f\u0434\u0440\u0430, \u0442.\u043a. \u0432 \u043d\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u0441\u0432\u0435\u0436\u0435\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0441\u0432\u0435\u0436\u0435\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0430, \u0435\u0449\u0435 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 OpenSSL<\/p>\n<p><a class=\"anchor\" name=\"1\" id=\"1\"><\/a><\/p>\n<pre><code>Kernel ---&gt;   [*] Linux Kernel   Kernel version (Custom tarball) ---&gt; Custom tarball   (file:\/\/$(HOME)\/kernel\/linux-5.4.92.tar.xz) URL of custom kernel tarball    Kernel configuration (Using a custom (def)config file)   (board\/smilebrd\/kernel_smilebrd_defconfig) Configuration file path    [*] Build a Device Tree Blob (DTB)   (am335x-boneblack) In-tree Device Tree Source file names   [*] Needs host OpenSSL<\/code><\/pre>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f <em>firmware<\/em> \u0434\u043b\u044f wifi \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 TP-LINK           TL-WN725N, \u043e\u043d \u043c\u0430\u043b, \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043f\u0440\u043e\u0434\u0430\u0436\u0435, \u043d\u0435\u0434\u043e\u0440\u043e\u0433, \u0441 \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0447\u0438\u043f Realtek 8188EU \u043e \u0447\u0435\u043c \u0438 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <em>connman<\/em> \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a wifi. \u0422\u0430\u043a\u0436\u0435, \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0447\u0430\u0442\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c websocket \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u0442\u0438\u043b\u0438\u0442\u0443 wscat, \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 nodejs, \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 nodejs \u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c<\/p>\n<pre><code>Target packages ---&gt; \tHardware handling ---&gt; \t\tFirmware ---&gt;      \t[*] linux firmware \t\t\t\t\t\tWifi firmware ---&gt;              \t[*] Realtek 81xx \tInterpreter languages and scripting ---&gt;   \t[*] nodejs \t\t[*] NPM for the target \t\t\t\t\t(wscat) Additional modules \tNetworking applications ---&gt; \t\t[*] connman \t\t[*] \tenable WiFi support \t\t[*] \tenable command line client<\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 ext4, \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 500 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442, \u0440\u0430\u0437\u043c\u0435\u0440 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043b\u0430\u043d\u043a\u0438, \u0442.\u043a. \u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u043e\u0431\u044b\u0447\u043d\u043e, \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0432\u0441\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0442\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434 \u043a\u043e\u0440\u043d\u0435\u0432\u0443\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/p>\n<pre><code>Filesystem images ---&gt; \t[*] ext2\/3\/4 root filesystem \text2\/3\/4 variant (ext4) ---&gt; ext4 \t(500M) exact size<\/code><\/pre>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a U-Boot, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u043d\u0435\u0433\u043e, \u0433\u0434\u0435 \u0431\u0440\u0430\u0442\u044c \u0438 \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/551972\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e U-Boot, \u0433\u0434\u0435 \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u043f\u0443\u0442\u044c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c U-Boot. \u041f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f AM3358, \u043d\u043e \u044f, \u0432 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445, \u0432\u043d\u0435\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0443\u0431\u0440\u0430\u0432 2-\u0445 \u0441\u0435\u043a\u0443\u043d\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435, \u044d\u0442\u043e \u0432\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f <em>uboot_smilebrd_defconfig<\/em> \u043e\u0442 <em>am335x_evm_defconfig<\/em>. \u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430<\/p>\n<pre><code>Bootloaders ---&gt;   [*] U-Boot       Uboot Version (Custom tarball) ---&gt; Custom tarball       (file:\/\/$(HOME)\/u-boot\/u-boot-2021.01.tar.xz) URL of custom U-Boot tarball       U-Boot configuration (Using a custom board (def)config file)---&gt;       (board\/smilebrd\/uboot_smilebrd_defconfig) Configuration file path    [*] U-Boot needs dtc   U-Boot binary format ---&gt;    \t[*] u-boot.img   [*] Install U-Boot SPL binary image   \t(MLO) U-Boot SPL\/TPL binary image name(s)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e<\/p>\n<pre><code class=\"bash\">make savedefconfig<\/code><\/pre>\n<p>\u0418, \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u043e\u043c. \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 Buildroot, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u044f\u0434\u0440\u0430 Linux &#8212; <em>kernel_smilebrd_defconfig<\/em>. \u041e\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0433\u043e <em>omap2plus_defconfig<\/em>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 wifi \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0438 \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0430. \u0415\u0441\u043b\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 wifi \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0432 \u044f\u0434\u0440\u0435 \u0435\u0441\u0442\u044c, \u0442\u043e \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0430, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u0442, \u0438 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u0438\u043c \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f.<\/p>\n<h3>Linux Device Drivers<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0441 \u0447\u0435\u043c \u0435\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043e \u0441\u043c\u0430\u0439\u043b \u043f\u0443\u043b\u044c\u0442\u0435. <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0437\u0434\u0435\u043b\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u043b\u0430\u0442\u0443 \u0441 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c <a href=\"https:\/\/www.st.com\/content\/st_com\/en\/products\/microcontrollers-microprocessors\/stm32-32-bit-arm-cortex-mcus\/stm32-ultra-low-power-mcus\/stm32l4-series\/stm32l4x5\/stm32l475rc.html\" rel=\"noopener noreferrer nofollow\">STM32L475<\/a>. \u041a\u0430\u043c\u0435\u043d\u044c \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u043d\u043e \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 \u043d\u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437-\u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u044b\u043b\u044f\u0449\u0438\u0445\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u043e\u043a <a href=\"https:\/\/www.st.com\/en\/evaluation-tools\/nucleo-l476rg.html\" rel=\"noopener noreferrer nofollow\">NUCLEO<\/a>, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u0431\u043e\u0440\u0442\u0443. \u0421\u043c\u0430\u0439\u043b\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043c\u0438 TSC-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u0442.\u0435. \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u044b\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438, \u0432 \u043f\u0440\u043e\u0440\u0435\u0437\u044f\u0445 \u043f\u043b\u0430\u0442\u044b \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u044b, \u043a\u0443\u0434\u0430 \u0436 \u0431\u0435\u0437 \u043d\u0438\u0445, \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044f \u0441 BeagleBone Black \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c I2C, \u0433\u0434\u0435 STM \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0440\u043e\u043b\u0438 \u0432\u0435\u0434\u043e\u043c\u043e\u0433\u043e. \u0415\u0449\u0435 \u0435\u0441\u0442\u044c UART \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0432\u0434\u0440\u0443\u0433 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0441\u0451. \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0431\u0430\u0448\u0435\u043d\u043a\u0438 \u043a\u0432\u0430\u0440\u0446\u0435\u0432\u043e\u0433\u043e \u0440\u0435\u0437\u043e\u043d\u0430\u0442\u043e\u0440\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e RC \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u043e \u043f\u0438\u0442\u0430\u043d\u0438\u0438 \u043e\u0442 \u043f\u043b\u0430\u0442\u044b BeagleBone Black. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0431\u0435\u0437HAL&#8217;\u044c\u043d\u043e\u0435 \u044f\u0434\u0440\u043e \u043d\u0430 <a href=\"https:\/\/github.com\/scmrtos\/scmrtos\" rel=\"noopener noreferrer nofollow\">Scm-RTOS<\/a>, \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445\u0441\u044f, \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/github.com\/heavyC1oud\/smilebrd\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443, \u043e\u0431\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0443 \u043d\u0435\u0433\u043e \u0442\u0430\u043a\u043e\u0439: \u043f\u0440\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u0443\u043b\u044c\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u043d\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0435, \u0434\u0430\u0432\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0435\u043c\u0443 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c, \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u043e\u0446\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u043c GPIO \u0432 BeagleBone Black, \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0443 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/hr>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-323023","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/323023","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=323023"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/323023\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=323023"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=323023"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=323023"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}