{"id":281754,"date":"2016-11-30T06:15:04","date_gmt":"2016-11-30T03:15:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=281754"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=281754","title":{"rendered":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0416\u041a\u0418 \u043a \u043f\u043b\u0430\u0442\u0435 \u043e\u0442 WD MyBook Live \u043d\u0430 AppliedMicro APM82181. \u041e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435"},"content":{"rendered":"<p>\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c!<br \/>  \u041f\u0440\u043e\u0434\u043e\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u043b\u0430\u0442\u043e\u0439 \u043e\u0442 NAS WesternDigital MyBook Live \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u043a \u043d\u0435\u0439 \u0416\u041a \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c.<br \/>  \u0418\u0442\u0430\u043a, \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0448\u0438\u043d\u0435 I2C, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u0440\u0442\u043e\u0432 \u0441 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c, \u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.  <\/p>\n<table>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3d6\/41a\/718\/3d641a718dd04cd8bf2569f25726499d.gif\" alt=\"image\"\/>  <\/td>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3e9\/ae6\/4fc\/3e9ae64fcb1f429aaec4bbca9d9728dd.jpg\" alt=\"image\"\/>  <\/td>\n<\/tr>\n<\/table>\n<p>  <a name=\"habracut\"><\/a><br \/>  \u041d\u0430\u0447\u0430\u043b\u043e \u0431\u044b\u043b\u043e \u0442\u0443\u0442: <a href=\"https:\/\/habrahabr.ru\/post\/315912\/\">\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0416\u041a\u0418 \u043a \u043f\u043b\u0430\u0442\u0435 \u043e\u0442 WD MyBook Live \u043d\u0430 AppliedMicro APM82181<\/a><\/p>\n<p>  \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<p>  1. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u0438<br \/>  2. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0435\u0437 \u0434\u0438\u0441\u043a\u0430<br \/>  3. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432 LEDE<br \/>  4. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430\u043c\u0438 (\u0447\u0435\u0440\u0435\u0437 LuCI \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u044c)<br \/>  5. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0448\u0438\u043d\u0435 I2C<br \/>  6. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u044f \u043f\u043e\u0440\u0442\u043e\u0432 PCF8574<\/p>\n<p>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c:<\/p>\n<p>  7. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f HD44780 \u0447\u0435\u0440\u0435\u0437 i2cset<br \/>  8. \u0421\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0448\u0438\u043d\u0443 I2C<br \/>  9. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 HD44780 \u0432 \u044f\u0434\u0440\u043e<br \/>  10. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 VT100 \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 HD44780 <br \/>  11. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 VT100 \u0432 LCD4Linux<br \/>  12. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u043a\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 HD44780<br \/>  13. \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0448\u0438\u043d\u0435 I2C<\/p>\n<p>  \u041a\u0430\u043a \u0438 \u043f\u0440\u0435\u0436\u0434\u0435, \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u0440\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u041a \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u044e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0416\u041a \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0430 \u043a\u043b\u043e\u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 HD44780. \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c, \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0432\u0441\u0435 \u043f\u043e\u0440\u0442\u044b \u043d\u0430 \u0432\u044b\u0432\u043e\u0434 \u0438 \u0437\u043d\u0430\u044f \u0438\u0445 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u043e\u0439 \u043f\u043e\u043c\u0438\u0433\u0430\u0442\u044c \u0443\u0436\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u0434\u0435\u0440\u0433\u0430\u044f \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0440\u0442. <\/p>\n<h4>7. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f HD44780 \u0447\u0435\u0440\u0435\u0437 i2cset<\/h4>\n<p>  \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c HD44780 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u0435\u043c \u043f\u043e\u0440\u0442\u043e\u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0442\u0430\u043a:<br \/>  RS \u2014 P0<br \/>  R\/W \u2014 P1<br \/>  E \u2014 P2<br \/>  BL \u2014 P3<br \/>  D4 \u2014 P4<br \/>  D5 \u2014 P5<br \/>  D6 \u2014 P6<br \/>  D7 \u2014 P7<br \/>  \u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 4-\u0431\u0438\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0430 \u0431\u0430\u0439\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c.<br \/>  \u0418\u043c\u0435\u044f \u0432 \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0432\u0441\u0435 \u043f\u043e\u0440\u0442\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u044f, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0431\u0438\u0442\u043d\u043e \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u043c. \u0414\u0443\u043c\u0430\u044e \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e.<br \/>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0448\u0438\u043d\u0443 I2C. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0443\u0442\u0438\u043b\u0438\u0442 I2C-tools. \u0412 LEDE \u043e\u043d\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 Utilites. \u0412 \u043d\u0430\u0431\u043e\u0440 \u0432\u0445\u043e\u0434\u0438\u0442 i2cdetect, i2cdump, i2cget, i2cset. \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0432\u0430\u044f (\u0434\u043b\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438).<br \/>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e i2cdetect \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u0448\u0438\u043d\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0445 \u0430\u0434\u0440\u0435\u0441.   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043d\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0434\u0440\u0435\u0441 0x27:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">root@lede: i2cdetect 0 WARNING! This program can confuse your I2C bus, cause data loss and worse! I will probe file \/dev\/i2c-0. I will probe address range 0x03-0x77. Continue? [Y\/n] y      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0423\u0442\u0438\u043b\u0438\u0442\u0430 i2cset \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u043d\u0430 \u0448\u0438\u043d\u0435 I2C.<br \/>  \u0417\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0416\u041a\u0418, \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d.<br \/>  \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043e\u0442\u0441\u044e\u0434\u0430: <a href=\"http:\/\/cyber-place.ru\/showthread.php?t=2164\">I2C hd44780 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u0435 PCF8574<\/a> \u00ab\u0442\u0435\u0441\u0442\u0438\u043b\u043a\u0443 i2c lcd\u00bb. \u0412\u043e\u0442 <a href=\"http:\/\/cyber-place.ru\/showpost.php?p=30991&amp;postcount=13\">\u043f\u0440\u044f\u043c\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430<\/a>. \u0412\u043d\u0443\u0442\u0440\u0438 \u0430\u0440\u0445\u0438\u0432\u0430 shell \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 i2cset \u0438 \u0432\u044b\u0434\u0430\u0435\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0430\u0439\u043b\u0430:  <\/p>\n<pre><code class=\"bash\">insmod i2c-dev insmod i2c-gpio-custom bus0=0,$sda_gpio,$scl_gpio <\/code><\/pre>\n<p> \u041e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 I2C \u043d\u0430 \u043b\u044e\u0431\u044b\u0445 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u0430\u0445 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430, \u0430 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439. \u041d\u0443 \u0438 \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043e\u043d\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e 4*40, \u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u044b i2cset \u044d\u0442\u043e \u043d\u0438 \u0447\u0443\u0442\u044c \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u0435\u0442.<br \/>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7c4\/f1d\/96a\/7c4f1d96a344490993aa54b0112cfa39.jpg\" alt=\"image\"\/><br \/>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0439 \u043f\u043e \u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<br \/>  \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b write_CMD \u0438 print_LCD \u0432\u044b\u0432\u043e\u0434\u044f\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435. \u042d\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 RS, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u043d\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0431\u0438\u0442\u0435. <br \/>  \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 init_LCD \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0435\u0433\u043e datasheet&#8217;\u0443, \u0448\u0438\u0440\u043e\u043a\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"http:\/\/datasheet-pdf.com\/datasheet-download.php?id=507176\">\u0432\u043e\u0442<\/a>.<br \/>  \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d.<\/p>\n<p>  8. \u0421\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0448\u0438\u043d\u0443 I2C<br \/>  \u0412\u0441\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0443\u0439\u0442\u0438 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0442\u0438\u043b\u0438\u0442, \u0438 \u0438\u043c\u0435\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0432\u044b\u0432\u043e\u0434\u044f \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0430\u0439\u0442\u044b, \u043e\u043d\u0438 \u0431\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0438 \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0448\u0438\u043d\u0443 I2C, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u043e\u043c. <br \/>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043a\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f \u0448\u0438\u043d\u044b I2C \u0432 LEDE. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0446\u0435\u043b\u044f\u043c\u0438 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445. \u041f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0430\u043b\u0435\u0435, \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c, \u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u043e\u0432\u044b\u0439.<br \/>  \u041f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043e\u0432 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440 EEPROM \u043f\u043e\u0434 \u0448\u0438\u043d\u0443 I2C. \u0412 \u044f\u0434\u0440\u0435 LEDE \u0431\u044b\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u0434\u0440\u0430\u0439\u0432\u0435\u0440 kmod-eeprom-at24, \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430:  <\/p>\n<pre><code class=\"bash\">root@lede: echo 24c00 0x27 &gt; \/sys\/bus\/i2c\/devices\/i2c-0\/new_device root@lede: echo 24c00 0x27 &gt;  [   33.335472] at24 0-0027: 16 byte 24c00 EEPROM, writable, 1 bytes\/write [   33.342102] i2c i2c-0: new_device: Instantiated device 24c00 at 0x27 <\/code><\/pre>\n<p>  \u0423\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u043e\u0441\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u043b\u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e,  <\/p>\n<pre><code class=\"bash\">root@lede: echo &quot;1111&quot; &gt; \/sys\/bus\/i2c\/devices\/i2c-0\/0-0027\/eeprom<\/code><\/pre>\n<p>  \u0442\u043e \u043d\u0430 \u0448\u0438\u043d\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0439\u0442:<br \/>  0x4e-0x00-0x31 0x4e-0x01-0x31 0x4e-0x02-0x31 0x4e-0x03-0x31 0x4e-0x04-0x0a.<br \/>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0431\u0430\u0439\u0442 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0440\u043e\u0439\u043a\u0435 \u2014 \u044d\u0442\u043e \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 2 (0x27 x 2). \u0412\u0442\u043e\u0440\u043e\u0439 \u2014 \u0430\u0434\u0440\u0435\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 EEPROM, \u0442\u0440\u0435\u0442\u0438\u0439 \u2014 \u0434\u0430\u043d\u043d\u044b\u0435. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0416\u041a\u0418, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0434\u0430\u0447\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u044f\u0447\u0435\u0439\u043a\u0438.<br \/>  \u0427\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u0444\u0430\u0439\u043b \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 build_dir\/target-powerpc_464fp_musl-1.1.15\/linux-apm821xx_sata\/linux-4.4.21\/drivers\/misc\/eeprom\/at24.c. \u0417\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 at24_eeprom_write (335-337):  <\/p>\n<pre><code class=\"cpp\">\/\/if (at24-&gt;chip.flags & AT24_FLAG_ADDR16) \/\/  msg.buf[i++] = offset &gt;&gt; 8; \/\/msg.buf[i++] = offset;<\/code><\/pre>\n<p>  \u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c-\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u044b\u0432\u043e\u0434  <\/p>\n<pre><code class=\"bash\">root@lede: echo 24c00 0x27 &gt; \/sys\/bus\/i2c\/devices\/i2c-0\/new_device [ 2708.782356] at24 0-0027: 16 byte 24c00 EEPROM, writable, 1 bytes\/write [ 2708.788891] i2c i2c-0: new_device: Instantiated device 24c00 at 0x27 root@lede: echo &quot;1111&quot; &gt; \/sys\/bus\/i2c\/devices\/i2c-0\/0-0027\/eeprom <\/code><\/pre>\n<p>\u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0432\u044b\u0432\u043e\u0434 \u0431\u0435\u0437 \u0430\u0434\u0440\u0435\u0441\u0430 \u044f\u0447\u0435\u0439\u043a\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/8ab\/156\/bf7\/8ab156bf7ef742ca994c56719bdacd48.jpg\" alt=\"image\"\/>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0443\u0431\u0440\u0430\u0432 \u043e\u0442\u0442\u0443\u0434\u0430 \u0432\u044b\u0437\u043e\u0432 \u0443\u0442\u0438\u043b\u0438\u0442\u044b i2cset:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">#!\/bin\/sh  i2c_adres=0x27 i2c_dev=\/sys\/bus\/i2c\/devices\/i2c-0\/0-0027\/eeprom  led=8 ansi=0  to_octal () { \thh3=$(($hh \/ 64)) \thh1=$(($hh - $hh3 * 64)) \thh2=$(($hh1 \/ 8)) \thh1=$(($hh1 - $hh2 * 8)) }  write_CMD () { : $((hb = $c & 240)) : $((lb = ($c &lt;&lt; 4)  & 240 ))  \thh=$((4 + $hb + $led)) \tto_octal  \techo -e -n \\\\$hh3$hh2$hh1 &gt;&gt; $i2c_dev \thh=$((0 + $hb + $led)) \tto_octal  \techo -e -n \\\\$hh3$hh2$hh1 &gt;&gt; $i2c_dev \thh=$((4 + $lb + $led)) \tto_octal  \techo -e -n \\\\$hh3$hh2$hh1 &gt;&gt; $i2c_dev \thh=$((0 + $lb + $led)) \tto_octal  \techo -e -n \\\\$hh3$hh2$hh1 &gt;&gt; $i2c_dev }  print_LCD () { : $((hb = $c & 240)) : $((lb = ($c &lt;&lt; 4)  & 240 ))  \thh=$((5 + $hb + $led)) \tto_octal  \techo -e -n \\\\$hh3$hh2$hh1 &gt;&gt; $i2c_dev \thh=$((1 + $hb + $led)) \tto_octal  \techo -e -n \\\\$hh3$hh2$hh1 &gt;&gt; $i2c_dev \thh=$((5 + $lb + $led)) \tto_octal  \techo -e -n \\\\$hh3$hh2$hh1 &gt;&gt; $i2c_dev \thh=$((1 + $lb + $led)) \tto_octal  \techo -e -n \\\\$hh3$hh2$hh1 &gt;&gt; $i2c_dev }  ##########  init LCD  ##################### init_LCD () { if [[ ! -w $i2c_dev ]] then  \techo 24c00 0x27 &gt; \/sys\/bus\/i2c\/devices\/i2c-0\/new_device \tsleep 0.5 fi sleep 0.5 c=3 write_CMD c=3 write_CMD c=2 write_CMD c=40 #28 write_CMD c=44 #2C write_CMD c=44 #2C write_CMD c=12 #0C write_CMD c=1 write_CMD sleep 0.2 c=6 write_CMD c=2 write_CMD } ###############################  init_LCD  \tc=0x80 # stroka - 1 \twrite_CMD \tfor i in `seq 32 63`; do \t\tif [ &quot;$i&quot; == 48 ]; then \t\t\tc=0xC0 # stroka - 2 \t\t\twrite_CMD \t\tfi \tc=$(($i + $ansi)) \tprint_LCD \tdone         sleep 3  \tc=0x80 # stroka - 1 \twrite_CMD \tfor i in `seq 64 95`; do \t\tif [ &quot;$i&quot; == 80 ]; then \t\t\tc=0xC0 # stroka - 2 \t\t\twrite_CMD \t\tfi \tc=$(($i + $ansi)) \tprint_LCD \tdone         sleep 3  \tc=0x80 # stroka - 1 \twrite_CMD \tfor i in `seq 96 127`; do \t\tif [ &quot;$i&quot; == 112 ]; then \t\t\tc=0xC0 # stroka - 2 \t\t\twrite_CMD \t\tfi \tc=$(($i + $ansi)) \tprint_LCD \tdone <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0430\u043e\u0434\u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043d\u0430\u0448\u0443 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u044d\u043a\u0440\u0430\u043d\u0430 \u2014 2\u044516 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<br \/>  \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 build_dir, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0447\u0442\u043e \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0438\u0437 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0442\u0447\u0435\u0439 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438. <\/p>\n<p>  9. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 HD44780 \u0432 \u044f\u0434\u0440\u043e<br \/>  \u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0416\u041a\u0418 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<br \/>  \u0422\u0430\u043a\u043e\u0439 \u043f\u0430\u043a\u0435\u0442 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0434\u0430\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 LEDE. \u042d\u0442\u043e <a href=\"https:\/\/lcd4linux.bulix.org\/wiki\">LCD4Linux<\/a>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445 \u041e\u0421 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u0435\u0435 \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0435 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<br \/>  \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0435\u0433\u043e \u0441 \u043d\u0430\u0448\u0438\u043c \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u0430 \u0448\u0438\u043d\u0435 I2C \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0438\u044f. <br \/>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u043d\u0430 HD44780-I2C \u0438\u0437 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0430 LCD4Linux  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0432 \u0444\u0430\u0439\u043b\u0435 \\etc\\lcd4linux.conf<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">Display HD44780-I2C {     Driver 'HD44780'     Model 'generic'     Bus 'i2c'     Port '\/dev\/i2c-0'     Device '0x27'     Bits '4'     Size '16x2'     asc255bug 0     Icons 1     Wire {         RW     'DB1'         RS     'DB0'         ENABLE 'DB2'         GPO    'GND'     } } <\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043e\u0448\u0438\u0431\u043a\u0443:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">root@lede: \/usr\/bin\/lcd4linux -v -F  LCD4Linux 0.11.0-SVN-1193 starting HD44780: $Rev: 1202 $ HD44780: using model 'generic' HD44780: using I2C bus HD44780: using 1 Controller(s) HD44780: using 4 bit mode udelay: using gettimeofday() delay loop Segmentation fault<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0411\u044b\u043b\u043e \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043d\u044b \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u0432 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 EEPROM, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435. \u041d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e.<br \/>  \u0422\u043e\u0433\u0434\u0430 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0438\u0434\u0442\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0435\u043c. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0434\u0438\u0441\u043f\u043b\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u043e\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u0432 LCD4Linux, \u0431\u043b\u0430\u0433\u043e \u0432 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e.<br \/>  \u0418\u0442\u0430\u043a, \u0431\u0435\u0440\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f HD44780 \u043d\u0430 I2C \u043e\u0442\u0441\u044e\u0434\u0430: <a href=\"https:\/\/github.com\/gorskima\/hd44780-i2c\">Linux driver for Hitachi HD44780 LCD attached to I2C bus via PCF8574 I\/O expander<\/a>. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u0441\u043f\u044b\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u043d\u0430 Raspberry Pi, \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u0440\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 VT100, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u0443\u044e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430, \u0443\u043c\u0435\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c, \u0433\u0430\u0441\u0438\u0442\u044c \u0438 \u043c\u0438\u0433\u0430\u0442\u044c \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 LEDE \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<br \/>  \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c, \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 package\/hd44780\/src.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u0435\u0440\u0435\u0432\u043e<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">ls -l -rw-r--r-- 1 root root 18092 Feb 21  2016 LICENSE -rw-r--r-- 1 root root    60 Nov  9 06:17 Makefile -rw-r--r-- 1 root root  1945 Feb 21  2016 README.md -rw-r--r-- 1 root root 10316 Nov 16 04:33 hd44780-dev.c -rw-r--r-- 1 root root  7756 Feb 21  2016 hd44780-i2c.c -rw-r--r-- 1 root root  1122 Nov 16 03:28 hd44780.h -rw-r--r-- 1 root root   235 Feb 21  2016 make.sh<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 Makefile \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e:  <\/p>\n<pre><code>obj-m := hd44780.o hd44780-y := hd44780-i2c.o hd44780-dev.o<\/code><\/pre>\n<p>  \u0418 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 Makefile, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043f\u043a\u043e\u0439 \u0432\u044b\u0448\u0435, \u0432 package\/hd44780, \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 LEDE:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">package\/hd44780\/Makefile<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>include $(TOPDIR)\/rules.mk include $(INCLUDE_DIR)\/kernel.mk  PKG_NAME:=hd44780 PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)\/$(PKG_NAME)  include $(INCLUDE_DIR)\/package.mk  define KernelPackage\/hd44780 SUBMENU:=Other modules TITLE:=I2C HD44780 driver FILES:=$(PKG_BUILD_DIR)\/hd44780.ko AUTOLOAD:=$(call AutoLoad,70,hd44780) KCONFIG:= endef  define Package\/hd44780\/description Big comments.... ... endef  MAKE_OPTS:= \\ \tARCH=&quot;$(LINUX_KARCH)&quot; \\ \tCROSS_COMPILE=&quot;$(TARGET_CROSS)&quot; \\ \tSUBDIRS=&quot;$(PKG_BUILD_DIR)&quot; \\ \tEXTRA_CFLAGS=&quot;$(EXTRA_CFLAGS)&quot;  define Build\/Prepare \tmkdir -p $(PKG_BUILD_DIR) \t$(CP) .\/src\/* $(PKG_BUILD_DIR)\/ endef  define Build\/Compile \t$(MAKE) -C &quot;$(LINUX_DIR)&quot; \\ \t\t$(MAKE_OPTS) \\ \t\tmodules endef  $(eval $(call KernelPackage,hd44780))<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0421\u0442\u0440\u043e\u043a\u0443 \u0441 \u0430\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 (AUTOLOAD:=$(call AutoLoad,70,hd44780)) \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0442\u043e\u0440\u0430 LEDE  <\/p>\n<pre><code class=\"bash\">make menuconfig<\/code><\/pre>\n<p>  \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u044f\u0434\u0440\u0430 (kmod-hd44780), \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">LEDE Configuration<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/182\/5b8\/9fb\/1825b89fbb3b403faa4e9c1f45f4f20b.jpg\" alt=\"image\"\/>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0430\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f, \u0442\u043e \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:  <\/p>\n<pre><code class=\"bash\">root@lede: insmod hd44780 root@lede: lsmod |grep 44780 hd44780                 5450  0 <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e:  <\/p>\n<pre><code class=\"bash\">root@lede: echo hd44780 0x27 &gt; \/sys\/bus\/i2c\/devices\/i2c-0\/new_device [ 9463.913178] i2c i2c-0: new_device: Instantiated device hd44780 at 0x27<\/code><\/pre>\n<p>  \u041d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0435, \u043a\u0430\u043a \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043e \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435, \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0434\u0430\u0435\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430: &quot;\/dev\/lcd0&quot;, \u0441 \u043c\u0438\u0433\u0430\u044e\u0449\u0438\u043c \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0432 \u043a\u043e\u043d\u0446\u0435.<br \/>  \u041d\u0430 \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0435:  <\/p>\n<pre><code class=\"bash\">root@lede: echo -n 123 &gt; \/dev\/lcd0<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0447\u0435\u0440\u0435\u0437 sysfs (\/sys\/class\/hd44780\/lcd0). \u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0442\u0438 \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432: backlight, cursor_display, geometry, cursor_blink. \u0427\u0435\u0440\u0435\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u044d\u043a\u0440\u0430\u043d\u0430, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0438 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u043e\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0438\u0433\u0430\u043d\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:  <\/p>\n<pre><code class=\"bash\">root@lede: echo -n 0 &gt; \/sys\/class\/hd44780\/lcd0\/cursor_blink<\/code><\/pre>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 VT100, \u044d\u0442\u043e \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e. \u041f\u043e\u0434\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"bash\">root@lede: echo -n -e '\\x1b'[2J &gt; \/dev\/lcd0 root@lede: echo -n -e '\\x1b'[H &gt; \/dev\/lcd0<\/code><\/pre>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u041e\u0421. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0430\u0439\u043b target\/linux\/apm821xx\/base-files\/etc\/board.d\/03_lcd \u0432 LEDE \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:  <\/p>\n<pre><code class=\"bash\">#!\/bin\/sh echo hd44780 0x27 &gt; \/sys\/bus\/i2c\/devices\/i2c-0\/new_device echo -n 16x2 &gt; \/sys\/class\/hd44780\/lcd0\/geometry echo -n 0 &gt; \/sys\/class\/hd44780\/lcd0\/cursor_display echo -n 0 &gt; \/sys\/class\/hd44780\/lcd0\/cursor_blink echo -n -e '\\x1b'[2JHello! &gt; \/dev\/lcd0 exit 0 <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043b\u0430\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0430\u0441 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<h4>10. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 VT100 \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 HD44780 <\/h4>\n<p>  \u0418\u0442\u0430\u043a, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 LCD4Linux \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044d\u043a\u0440\u0430\u043d\u0430. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u0443\u044e:<br \/>  <i>Esc[Line;ColumnH \u2014 Move cursor to screen location v,h <\/i><br \/>  \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0444\u0430\u0439\u043b package\/hd44780\/src\/hd44780-dev.c \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041d\u0430\u0434\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 esc-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void hd44780_handle_esc_seq_char(struct hd44780 *lcd, char ch) { \tint prev_row, prev_col;  \tlcd-&gt;esc_seq_buf.buf[lcd-&gt;esc_seq_buf.length++] = ch;  \tif (!strcmp(lcd-&gt;esc_seq_buf.buf, &quot;[2J&quot;)) { \t\tprev_row = lcd-&gt;pos.row; \t\tprev_col = lcd-&gt;pos.col;  \t\thd44780_clear_display(lcd); \t\thd44780_write_instruction(lcd, HD44780_DDRAM_ADDR | (lcd-&gt;geometry-&gt;start_addrs[prev_row] + prev_col));  \t\thd44780_leave_esc_seq(lcd); \t} else if (!strcmp(lcd-&gt;esc_seq_buf.buf, &quot;[H&quot;)) { \t\thd44780_write_instruction(lcd, HD44780_RETURN_HOME); \t\tlcd-&gt;pos.row = 0; \t\tlcd-&gt;pos.col = 0;  \t\thd44780_leave_esc_seq(lcd); \t} else if (lcd-&gt;esc_seq_buf.length == ESC_SEQ_BUF_SIZE) { \t\thd44780_flush_esc_seq(lcd); \t} }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void hd44780_handle_esc_seq_char(struct hd44780 *lcd, char ch) { \tint prev_row, prev_col; \tstruct hd44780_geometry *geo = lcd-&gt;geometry;  \tlcd-&gt;esc_seq_buf.buf[lcd-&gt;esc_seq_buf.length++] = ch;  \tif (!strcmp(lcd-&gt;esc_seq_buf.buf, &quot;[2J&quot;)) { \t\tprev_row = lcd-&gt;pos.row; \t\tprev_col = lcd-&gt;pos.col;  \t\thd44780_clear_display(lcd); \t\thd44780_write_instruction(lcd, HD44780_DDRAM_ADDR | (lcd-&gt;geometry-&gt;start_addrs[prev_row] + prev_col));  \t\thd44780_leave_esc_seq(lcd); \t} else if (!strcmp(lcd-&gt;esc_seq_buf.buf, &quot;[H&quot;)) { \t\thd44780_write_instruction(lcd, HD44780_RETURN_HOME); \t\tlcd-&gt;pos.row = 0; \t\tlcd-&gt;pos.col = 0;  \t\thd44780_leave_esc_seq(lcd); \t} else if ((lcd-&gt;esc_seq_buf.buf[0]=='[') && (lcd-&gt;esc_seq_buf.buf[4]=='H') && \/\/ Esc[ Line ; Column H \t\t(lcd-&gt;esc_seq_buf.buf[2]==';' ) && (lcd-&gt;esc_seq_buf.length == 5)) { \t\tlcd-&gt;pos.row = lcd-&gt;esc_seq_buf.buf[1] % geo-&gt;rows; \t\tlcd-&gt;pos.col = lcd-&gt;esc_seq_buf.buf[3] % geo-&gt;cols; \t\thd44780_write_instruction(lcd, HD44780_DDRAM_ADDR \t\t    | (geo-&gt;start_addrs[lcd-&gt;pos.row] + lcd-&gt;pos.col)); \t\thd44780_leave_esc_seq(lcd); \t} else if (lcd-&gt;esc_seq_buf.length == ESC_SEQ_BUF_SIZE) { \t\thd44780_flush_esc_seq(lcd); \t} }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418 \u043d\u0430\u0434\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 esc-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 hd44780.h \u0441\u0442\u0440\u043e\u043a\u0443  <\/p>\n<pre><code class=\"cpp\">#define ESC_SEQ_BUF_SIZE   4<\/code><\/pre>\n<p> \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441 4 \u043d\u0430 6. \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c. \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u0430\u043a\u0435\u0442 \u0438\u0437 LEDE.  <\/p>\n<pre><code class=\"bash\">root@debian:\/apm82181-lede-master# make package\/hd44780\/compile  make[1] package\/hd44780\/compile  make[2] -C package\/hd44780 compile<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0435\u0442, \u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u0441\u044f.<br \/>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:  <\/p>\n<pre><code class=\"bash\">root@lede:\/ echo -n -e '\\x1b[1;6H' &gt; \/dev\/lcd0<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u0443\u0440\u0441\u043e\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0442\u043e\u0440\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 7-\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e (\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u043d\u0443\u043b\u044f):<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/482\/05b\/f52\/48205bf52bd34c008b9c89ef9a23a443.jpg\" alt=\"image\"\/><\/div>\n<\/div>\n<h4>11. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 VT100 \u0432 LCD4Linux<\/h4>\n<p>  \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0416\u041a\u0418 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 LCD4Linux \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u044f \u0432 \u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0434\u0438\u0441\u043f\u043b\u0435\u044f, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0441 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<br \/>  \u0417\u043d\u0430\u0447\u0438\u0442 \u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <a href=\"https:\/\/lcd4linux.bulix.org\/wiki\/driver_howto\">How to write new display drivers<\/a>. <br \/>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 build_dir\/target-powerpc_464fp_musl-1.1.15\/lcd4linux-custom\/lcd4linux-r1203, \u043b\u0438\u0431\u043e \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 dl\/lcd4linux-r1203.tar.bz2.<br \/>  \u0412\u0441\u0435 \u043a\u0430\u043a \u0432 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435:  <\/p>\n<ol>\n<li>\u0418\u0437 \u0444\u0430\u0439\u043b\u0430 drv_Sample.c drv \u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043e\u043f\u0438\u044e drv_vt100.c<\/li>\n<li>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c drv_vt100.c, \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0435\u0436\u0438\u043c\u043e\u043c, \u0441 GPIO<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432 drv.c<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 Makefile.am<\/li>\n<li>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 drivers.m4<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>if test &quot;$VT100&quot; = &quot;yes&quot;; then    TEXT=&quot;yes&quot;    I2C=&quot;yes&quot;    DRIVERS=&quot;$DRIVERS drv_vt100.o&quot;    AC_DEFINE(WITH_VT100,1,[vt100 driver]) fi<\/code><\/pre>\n<\/div>\n<\/div>\n<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 Makefile.am<\/li>\n<\/ol>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432 \u0444\u0430\u0439\u043b drv_vt100.c.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">drv_vt100_open:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static int drv_vt100_open(const char *section) {     char *s;     int f = -1;     s = cfg_get(section, &quot;Port&quot;, NULL);     if (s == NULL || *s == '\\0' || strlen(s) &gt; 80) { \terror(&quot;%s: no '%s.Port' entry from %s&quot;, Name, section, cfg_source()); \treturn -1;     }     strcpy(Port, s);     f = open(Port, O_WRONLY);     if (f == -1) { \terror(&quot;open(%s) failed: %s&quot;, Port, strerror(errno)); \treturn -1;     }     close (f);     return 0; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">drv_vt100_send:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void drv_vt100_send(const char *data, const unsigned int len) {     unsigned int i;     int f;     f = open(Port, O_WRONLY);     write (f, data, len);     close (f); }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">drv_vt100_clear:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void drv_vt100_clear(void) {     char cmd[4];     cmd[0] = 0x1B; \/\/ ESC     cmd[1] = '[';  \/\/ [     cmd[2] = '2';  \/\/ 2     cmd[3] = 'J';  \/\/ J     drv_vt100_send(cmd, 4);     cmd[2] = 'H';  \/\/ H     drv_vt100_send(cmd, 3); }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">drv_vt100_write:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void drv_vt100_write(const int row, const int col, const char *data, int len) {     char cmd[6];     cmd[0] = 0x1B; \t\t\/\/ ESC     cmd[1] = '[';  \t\t\/\/ [     cmd[2] = row & 0xff;\t\/\/ Line     cmd[3] = ';';\t\t\/\/ ;     cmd[4] = col & 0xff;\t\/\/ Column     cmd[5] = 'H';\t\t\/\/ H     drv_vt100_send(cmd, 6); }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  drv_vt100_close \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439.<br \/>  \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 LEDE \u043f\u0430\u043f\u043a\u0435. \u0417\u0430\u0442\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0444\u0430\u0439\u043b\u044b LCD4linux \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430, \u0442\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0432 \u043f\u0430\u043f\u043a\u0435 build_dir\/\u2026 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0430\u0442\u0447\u0438. \u041f\u0430\u0442\u0447\u0438 \u0434\u043b\u044f LCD4Linux \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 feeds\/packages\/utils\/lcd4linux\/patches. \u0421\u0432\u043e\u0439, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043d\u043e\u0432\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u0438\u0441\u043f\u043b\u0435\u044f VT100 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0443\u0442 \u0436\u0435. <br \/>  \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0442\u0447\u0430 \u0434\u0435\u043b\u0430\u0435\u043c \u0440\u044f\u0434\u043e\u043c \u0434\u0432\u0435 \u043f\u0430\u043f\u043a\u0438. \u0412 \u043e\u0434\u043d\u043e\u0439 (\u043f\u0443\u0441\u0442\u044c 1\/) \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 (\u043f\u0443\u0441\u0442\u044c 2\/) \u0442\u0435 \u0436\u0435, \u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435. \u0417\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 diff:  <\/p>\n<pre><code class=\"bash\">diff -Naur .\/1 .\/2 &gt; 180-vt100.patch<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0438\u043c\u0435\u0435\u043c \u0444\u0430\u0439\u043b 180-vt100.patch \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"diff\">diff -Naur .\/vt100\/Makefile.am .\/vt100-f\/Makefile.am --- .\/vt100\/Makefile.am\t2016-11-28 11:01:56.000000000 +0000 +++ .\/vt100-f\/Makefile.am\t2016-11-14 07:33:41.000000000 +0000 @@ -125,6 +125,7 @@  drv_USBHUB.c                  \\  drv_USBLCD.c                  \\  drv_vnc.c                     \\ +drv_vt100.c                   \\  drv_WincorNixdorf.c           \\  drv_X11.c                     \\                                \\ diff -Naur .\/vt100\/drivers.m4 .\/vt100-f\/drivers.m4 --- .\/vt100\/drivers.m4\t2016-11-14 11:54:41.000000000 +0000 +++ .\/vt100-f\/drivers.m4\t2016-11-14 07:37:00.000000000 +0000 @@ -39,7 +39,7 @@    [                        Newhaven, Noritake, NULL, Pertelian, PHAnderson,]    [                        PICGraphic, picoLCD, picoLCDGraphic, PNG, PPM, RouterBoard,]    [                        Sample, SamsungSPF, serdisplib, ShuttleVFD, SimpleLCD, st2205, T6963,] -  [                        TeakLCM, TEW673GRU, Trefon, ULA200, USBHUB, USBLCD, VNC, WincorNixdorf, X11], +  [                        TeakLCM, TEW673GRU, Trefon, ULA200, USBHUB, USBLCD, VNC, vt100, WincorNixdorf, X11],    drivers=$withval,    drivers=all  ) @@ -114,6 +114,7 @@  \t USBHUB=&quot;yes&quot;           USBLCD=&quot;yes&quot;           VNC=&quot;yes&quot; +         VT100=&quot;yes&quot;  \t WINCORNIXDORF=&quot;yes&quot;           X11=&quot;yes&quot;           ;; @@ -279,6 +280,9 @@        VNC)           VNC=$val           ;; +      vt100) +         VT100=$val +         ;;        WincorNixdorf)           WINCORNIXDORF=$val           ;; @@ -869,6 +873,13 @@     fi  fi   +if test &quot;$VT100&quot; = &quot;yes&quot;; then +   TEXT=&quot;yes&quot; +   I2C=&quot;yes&quot; +   DRIVERS=&quot;$DRIVERS drv_vt100.o&quot; +   AC_DEFINE(WITH_VT100,1,[vt100 driver]) +fi +  if test &quot;$WINCORNIXDORF&quot; = &quot;yes&quot;; then     TEXT=&quot;yes&quot;     SERIAL=&quot;yes&quot; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u043f\u0430\u0442\u0447 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u0430\u0442\u0447\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0435 feeds\/packages\/utils\/lcd4linux\/patches, \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u00abdiff -Naur&#8230;\u00bb. \u041f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u043d\u0430\u0448 \u043f\u0430\u0442\u0447 \u0432 \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u043f\u0430\u043f\u043a\u0443.<br \/>  \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0442\u043e\u0440 LEDE.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u0438\u0434\u0438\u043c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u0432 LCD4Linuc-custom:<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7d3\/25a\/223\/7d325a22352743a0adebc19acc57a5ed.jpg\" alt=\"image\"\/>  <\/div>\n<\/div>\n<p>  \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c.<br \/>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0448 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">lcd4linux.conf<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">Variables {    tick 500    tack 100    minute 60000 } Display VT100 {     Driver 'vt100'     Size '16x2'     Port '\/dev\/lcd0' } Widget Test {     class 'Text'     expression '1234567890123456'     width 16 } Layout Test {     Row01.Col1 'Test'     Row02.Col1 'Test' } Display 'VT100' Layout 'Test' <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">root@lede:\/# \/usr\/bin\/lcd4linux -v -F LCD4Linux 0.11.0-SVN-1193 starting vt100: $Rev: 001 $ initializing layout 'Test' Creating new timer group (1000 ms)  widget 'Test': Class 'text', Parent '&lt;root&gt;', Layer 1, Row 0, Col 0 (to 0,16)  widget 'Test': Class 'text', Parent 'Test', Layer 1, Row 1, Col 0 (to 1,16)<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u0446\u0438\u0444\u0440\u044b.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/f74\/e6c\/89e\/f74e6c89ec574df1be0753204ccc2baf.jpg\" alt=\"image\"\/><\/p>\n<h4>12. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u043a\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b HD44780 \u0438 VT100<\/h4>\n<p>  \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 HD44780 \u0438\u043c\u0435\u0435\u0442 \u0437\u0430\u0448\u0438\u0442\u044b\u0439 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442 \u0441 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u0438 \u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e 8 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u0431\u044b\u0432\u0430\u0435\u0442 \u0435\u0441\u0442\u044c \u0438 \u0440\u0443\u0441\u0441\u043a\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043d\u043e \u043d\u0435 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435). \u041c\u0435\u043d\u044f\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e. \u0415\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 LCD4Linux, \u043d\u043e \u043f\u043e\u043a\u0430 \u043d\u0430\u0448\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c.<br \/>  \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442, \u043d\u0430\u0434\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u044c 8 \u0431\u0430\u0439\u0442 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0432 \u0437\u043d\u0430\u043a\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0438\u0445 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c.<br \/>  \u0421\u043d\u043e\u0432\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 hd44780_handle_esc_seq_char \u0432 hd44780-dev.c<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void hd44780_handle_esc_seq_char(struct hd44780 *lcd, char ch) { \tint prev_row, prev_col; \tstruct hd44780_geometry *geo = lcd-&gt;geometry;  \tif (lcd-&gt;is_in_set_char == 0) { \t\tlcd-&gt;esc_seq_buf.buf[lcd-&gt;esc_seq_buf.length++] = ch; \t\tif (!strcmp(lcd-&gt;esc_seq_buf.buf, &quot;[2J&quot;)) { \t\t\tprev_row = lcd-&gt;pos.row; \t\t\tprev_col = lcd-&gt;pos.col; \t\t\thd44780_clear_display(lcd); \t\t\thd44780_write_instruction(lcd, HD44780_DDRAM_ADDR | (lcd-&gt;geometry-&gt;start_addrs[prev_row] + prev_col)); \t\t\thd44780_leave_esc_seq(lcd); \t\t} else if (!strcmp(lcd-&gt;esc_seq_buf.buf, &quot;[H&quot;)) { \t\t\thd44780_write_instruction(lcd, HD44780_RETURN_HOME); \t\t\tlcd-&gt;pos.row = 0; \t\t\tlcd-&gt;pos.col = 0; \t\t\thd44780_leave_esc_seq(lcd); \t\t} else if ((lcd-&gt;esc_seq_buf.buf[0]=='[') && (lcd-&gt;esc_seq_buf.buf[4]=='H') && \/\/ Esc[ Line ; Column H \t\t\t(lcd-&gt;esc_seq_buf.buf[2]==';' ) && (lcd-&gt;esc_seq_buf.length == 5)) { \t\t\tlcd-&gt;pos.row = lcd-&gt;esc_seq_buf.buf[1] % geo-&gt;rows; \t\t\tlcd-&gt;pos.col = lcd-&gt;esc_seq_buf.buf[3] % geo-&gt;cols; \t\t\thd44780_write_instruction(lcd, HD44780_DDRAM_ADDR \t\t\t    | (geo-&gt;start_addrs[lcd-&gt;pos.row] + lcd-&gt;pos.col)); \t\t\thd44780_leave_esc_seq(lcd); \t\t} else if (!strcmp(lcd-&gt;esc_seq_buf.buf, &quot;(S&quot;)) { \/\/ Esc(S code matrix(8) \t\t\tlcd-&gt;is_in_set_char = 1; \t\t} else if (lcd-&gt;esc_seq_buf.length == ESC_SEQ_BUF_SIZE) { \t\t\thd44780_flush_esc_seq(lcd); \t\t}  \t} else if (lcd-&gt;is_in_set_char == 1) { \/\/ start set CGRAM code \t\thd44780_write_instruction(lcd, HD44780_CGRAM_ADDR | 8 * (ch & 0x07)); \t\tlcd-&gt;is_in_set_char++; \t} else { \t\thd44780_write_data(lcd, ch & 0x1f); \/\/ set 8 bytes CGRAM code \t\tlcd-&gt;is_in_set_char++; \t\tif (lcd-&gt;is_in_set_char == 10){ \/\/ go to DDRAM mode \t\t\thd44780_write_instruction(lcd, HD44780_DDRAM_ADDR \t\t\t    | (geo-&gt;start_addrs[lcd-&gt;pos.row] + lcd-&gt;pos.col)); \t\t\thd44780_leave_esc_seq(lcd); \t    } \t} }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043d\u0435\u0435 \u0440\u0435\u0436\u0438\u043c \u043f\u0440\u0438\u0435\u043c\u0430 8-\u0438 \u0431\u0430\u0439\u0442\u043e\u0432 \u0437\u043d\u0430\u043a\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0445 \u0432 CGRAM (\u0437\u043d\u0430\u043a\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440). \u0422\u0430\u043a \u043a\u0430\u043a \u0432 VT100 \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b ESC-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c. \u041f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 Esc(S 8 \u0431\u0430\u0439\u0442, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0434 ESC, \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043a\u0440\u0443\u0433\u043b\u0430\u044f \u0441\u043a\u043e\u0431\u043a\u0430, \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0430\u044f \u0431\u0443\u043a\u0432\u0430 S \u0438 8 \u0431\u0430\u0439\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043f\u0440\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0435\u0441\u0442\u0430 8*5 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e 5 \u043c\u043b\u0430\u0434\u0448\u0438\u0445 \u0431\u0438\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430.<br \/>  \u0412 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 hd44780_write \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0431\u0440\u043e\u0441 \u0440\u0435\u0436\u0438\u043c\u0430 \u043f\u0440\u0438\u0435\u043c\u0430 \u0437\u043d\u0430\u043a\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 lcd-&gt;is_in_set_char = 0).  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">hd44780_write<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\"> void hd44780_write(struct hd44780 *lcd, const char *buf, size_t count) ...  \t\t\tcase '\\e':  \t\t\t\tlcd-&gt;is_in_esc_seq = true; \t\t\t\tlcd-&gt;is_in_set_char = 0;  \t\t\t\tbreak;  \t\t\tdefault:  \t\t\t\thd44780_write_char(lcd, ch); ... <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (is_in_set_char) \u0432 \u0444\u0430\u0439\u043b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 hd44780.h.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">struct hd44780<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">struct hd44780 { \tstruct cdev cdev; \tstruct device *device; \tstruct i2c_client *i2c_client; \tstruct hd44780_geometry *geometry; \tstruct { \t\tint row; \t\tint col; \t} pos; \tchar buf[BUF_SIZE]; \tstruct { \t\tchar buf[ESC_SEQ_BUF_SIZE]; \t\tint length; \t} esc_seq_buf; \tbool is_in_esc_seq; \tint is_in_set_char; \tbool backlight; \tbool cursor_blink; \tbool cursor_display; \tbool dirty; \tstruct mutex lock; \tstruct list_head list; };<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u0438\u0441\u043f\u043b\u0435\u044f LCD4Linux. \u0424\u0443\u043d\u043a\u0446\u0438\u044f drv_vt100_defchar \u0444\u0430\u0439\u043b\u0430 drv_vt100.c:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">drv_vt100_defchar<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void drv_vt100_defchar(const int ascii, const unsigned char *matrix) {     char cmd[12];     int i;      \/* call the 'define character' function *\/     cmd[0] = 0x1B; \t\t\/\/ ESC     cmd[1] = '(';  \t\t\/\/ (     cmd[2] = 'S';\t\t\/\/ S     cmd[3] = ascii & 0x07;\t\/\/ code      \/* send bitmap to the display *\/     for (i = 0; i &lt; 8; i++) { \tcmd[i + 4] = (*matrix++) & 0x1f;     }     drv_vt100_send(cmd, 12); } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c.<br \/>  \u041c\u0435\u043d\u044f\u0435\u043c \u0441\u043d\u043e\u0432\u0430 \u043a\u043e\u043d\u0444\u0438\u0433 LCD4linux.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">lcd4linux.conf<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">Variables {    tick 500    tack 100    minute 60000 } Display VT100 {     Driver 'vt100'     Size '16x2'     Port '\/dev\/lcd0'     Icons 1 } Widget RAM {     class  'Text'     expression meminfo('MemFree')\/1024     postfix ' MB RAM'\t     width  11     precision 0     align  'R'     update tick } Widget Busy {     class 'Text'     expression proc_stat::cpu('busy', 500)     prefix 'Busy'\t     postfix '%'\t     width 9\t     precision 1     align 'R'\t     update tick\t }\t Widget Uptime {     class 'Text'     expression uptime('%d days %H:%M:%S')     width 20     align 'R'     prefix 'Up '     update 1000 } Widget Uptime {     class 'Text'     expression 'Up '.uptime('%d %H:%M:%S')     width 16     align 'L'     update 1000 } # Icons Widget Timer {     class 'Icon'     speed 83     Bitmap { \tRow1 '.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|' \tRow2 '.***.|.*+*.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.+++.|.+*+.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|' \tRow3 '*****|**+**|**++*|**+++|**++.|**++.|**+++|**+++|**+++|**+++|**+++|+++++|+++++|++*++|++**+|++***|++**.|++**.|++***|++***|++***|++***|++***|*****|' \tRow4 '*****|**+**|**+**|**+**|**+++|**+++|**+++|**+++|**+++|**+++|+++++|+++++|+++++|++*++|++*++|++*++|++***|++***|++***|++***|++***|++***|*****|*****|' \tRow5 '*****|*****|*****|*****|*****|***++|***++|**+++|*++++|+++++|+++++|+++++|+++++|+++++|+++++|+++++|+++++|+++**|+++**|++***|+****|*****|*****|*****|' \tRow6 '.***.|.***.|.***.|.***.|.***.|.***.|.**+.|.*++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.++*.|.+**.|.***.|.***.|.***.|.***.|' \tRow7 '.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|' \tRow8 '.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|'     } } Layout L16x2 {     Row1 { \tCol1  'Uptime' \tcol16 'Timer'     }     Row2 { \tCol1  'Busy' \tCol11 'RAM'     } } Display 'VT100' Layout 'L16x2' <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:  <\/p>\n<pre><code class=\"bash\">root@lede: \/usr\/bin\/lcd4linux  -v -F LCD4Linux 0.11.0-SVN-1193 starting vt100: $Rev: 001 $ vt100: reserving 1 of 8 user-defined characters for icons initializing layout 'L16x2' Creating new timer group (1000 ms)  widget 'Uptime': Class 'text', Parent '&lt;root&gt;', Layer 1, Row 0, Col 0 (to 0,16) Creating new timer group (83 ms)  widget 'Timer': Class 'icon', Parent '&lt;root&gt;', Layer 1, Row 0, Col 15 (to 1,16) Creating new timer group (500 ms)  widget 'Busy': Class 'text', Parent '&lt;root&gt;', Layer 1, Row 1, Col 0 (to 1,9)  widget 'RAM': Class 'text', Parent '&lt;root&gt;', Layer 1, Row 1, Col 10 (to 1,21) <\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0432\u0438\u0434\u0438\u043c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043b\u0430\u0442\u044b \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0441\u0438\u043c\u0432\u043e\u043b \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0438 \u043e\u0447\u0438\u0449\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0434\u0438\u0441\u043a\u0430.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3d6\/41a\/718\/3d641a718dd04cd8bf2569f25726499d.gif\" alt=\"image\"\/><br \/>  \u0414\u043e\u0431\u0430\u0432\u0438\u0432 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 LCD4Linux \u0432 \u043f\u0430\u0442\u0447 180-vt100.patch, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0432\u0438\u0434 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">180-vt100.patch<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">--- a\/lcd4linux.conf.sample\t2016-11-15 09:47:46.000000000 +0000 +++ a-f\/lcd4linux.conf.sample\t2016-11-18 03:18:22.000000000 +0000 @@ -567,7 +567,14 @@      HttpPort\t '5800'  }   - +Display VT100 { +    Driver 'vt100' +    Size '16x2' +    Port '\/dev\/lcd0' +    Icons 1 +} +             +              Display FutabaVFD {      Driver 'FutabaVFD'      Port '\/dev\/parport0'\t @@ -674,7 +681,7 @@    Widget RAM {      class  'Text' -    expression meminfo('MemTotal')\/1024 +    expression meminfo('MemFree')\/1024      postfix ' MB RAM'\t      width  11      precision 0 @@ -828,6 +835,14 @@      update 1000  }   +Widget Uptime { +    class 'Text' +    expression 'Up '.uptime('%d %H:%M:%S') +    width 16 +    align 'L' +    update 1000 +} +  Widget mpris_TrackPosition_bar {      class 'Bar'      expression  mpris_dbus::method_PositionGet('org.kde.amarok') @@ -1015,7 +1030,7 @@    Widget Timer {      class 'Icon' -    speed 50 +    speed 83      Bitmap {  \tRow1 '.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|'  \tRow2 '.***.|.*+*.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.+++.|.+*+.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|' @@ -1225,6 +1240,17 @@      }  }   +Layout L16x2-2 { +    Row1 { +\tCol1  'Uptime' +\tcol16 'Timer' +    } +    Row2 { +\tCol1  'Busy' +\tCol11 'RAM' +    } +} +  Layout L20x2 {      Row1 {          Col1  'CPUinfo' @@ -1323,7 +1349,7 @@       -Display 'ACool' +#Display 'ACool'  #Display 'SerDispLib'  #Display 'LCD-Linux'  #Display 'LCD2041' @@ -1354,7 +1380,7 @@  #Display 'IRLCD'  #Display 'USBLCD'  #Display 'BWCT' -#Display 'Image' +Display 'Image'  #Display 'TeakLCD'  #Display 'Trefon'  #Display 'LCD2USB' @@ -1363,15 +1389,17 @@  #Display 'ctinclud'  #Display 'picoLCD'  #Display 'VNC' +Display 'VT100'  #Display 'FutabaVFD'  #Display 'GLCD2USB'   -#Layout 'Default' -Layout 'TestLayer' +Layout 'Default' +#Layout 'TestLayer'  #Layout 'TestImage'  #Layout 'L8x2'  #Layout 'L16x1'  #Layout 'L16x2' +Layout 'L16x2-2'  #Layout 'L20x2'  #Layout 'L40x2'  #Layout 'Test' <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  13. \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0448\u0438\u043d\u0435 I2C<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<br \/>  \u0425\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0430. <br \/>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e \u0448\u0438\u043d\u0435 I2C \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438, \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443. \u0410 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0431\u043b\u043e\u043a\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441 \u0432\u0435\u0434\u043e\u043c\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u0431\u043b\u043e\u043a\u043e\u043c \u0431\u041e\u043b\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0448\u0438\u043d\u044b \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0431\u0430\u0439\u0442\u0430\u043c\u0438<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/8ab\/156\/bf7\/8ab156bf7ef742ca994c56719bdacd48.jpg\" alt=\"image\"\/><br \/>  \u0412\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u0431\u0430\u0439\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 (0x4E).  <\/div>\n<\/div>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440. \u0416\u041a\u0418 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 4-\u0431\u0438\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0442.\u0435. \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430 \u0440\u0430\u0437 \u043f\u043e \u043f\u043e\u043b\u0431\u0430\u0439\u0442\u0430. \u042d\u0442\u0438 \u043f\u043e\u043b\u0431\u0430\u0439\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0434\u0430\u0447\u0435\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u00abEnable\u00bb. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0435 \u0438\u0437 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e \u0448\u0438\u043d\u0435 I2C \u0438\u0434\u0435\u0442 6 \u0431\u0430\u0439\u0442:  <\/p>\n<ol>\n<li>\u0421\u0442\u0430\u0440\u0448\u0438\u0435 \u043f\u043e\u043b\u0431\u0430\u0439\u0442\u0430 \u0431\u0435\u0437 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u00abEnable\u00bb<\/li>\n<li>\u0421\u0442\u0430\u0440\u0448\u0438\u0435 \u043f\u043e\u043b\u0431\u0430\u0439\u0442\u0430 c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u00abEnable\u00bb<\/li>\n<li>\u0421\u0442\u0430\u0440\u0448\u0438\u0435 \u043f\u043e\u043b\u0431\u0430\u0439\u0442\u0430 \u0431\u0435\u0437 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u00abEnable\u00bb<\/li>\n<li>\u041c\u043b\u0430\u0434\u0448\u0438\u0435 \u043f\u043e\u043b\u0431\u0430\u0439\u0442\u0430 \u0431\u0435\u0437 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u00abEnable\u00bb<\/li>\n<li>\u041c\u043b\u0430\u0434\u0448\u0438\u0435 \u043f\u043e\u043b\u0431\u0430\u0439\u0442\u0430 \u0441 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u00abEnable\u00bb<\/li>\n<li>\u041c\u043b\u0430\u0434\u0448\u0438\u0435 \u043f\u043e\u043b\u0431\u0430\u0439\u0442\u0430 \u0431\u0435\u0437 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u00abEnable\u00bb<\/li>\n<\/ol>\n<p>  \u0418 \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441\u043e\u043c, \u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 12 \u0431\u0430\u0439\u0442, \u043f\u0440\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0448\u0438\u043d\u044b 100 \u041a\u0413\u0446 \u044d\u0442\u043e 1.2 \u043c\u0441.<br \/>  \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0435 \u0436\u0435 6 \u0431\u0430\u0439\u0442, \u043d\u043e \u043e\u0434\u043d\u0438\u043c \u0431\u043b\u043e\u043a\u043e\u043c, \u0441 \u043e\u0434\u043d\u0438\u043c \u0431\u0430\u0439\u0442\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u0430, \u0442.\u0435. 7 \u0431\u0430\u0439\u0442 \u0432\u043c\u0435\u0441\u0442\u043e 12.<br \/>  \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 HD44780.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">hd44780_write_data, hd44780_write_nibble, pcf8574_raw_write \u0438\u0437 hd44780-dev.c<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void pcf8574_raw_write(struct hd44780 *lcd, u8 data) { \ti2c_smbus_write_byte(lcd-&gt;i2c_client, data); }  static void hd44780_write_nibble(struct hd44780 *lcd, dest_reg reg, u8 data) { \tdata = (data &lt;&lt; 4) & 0xF0; \tif (reg == DR) \t\tdata |= RS; \tdata = data | (RW & 0x00); \tif (lcd-&gt;backlight) \t\tdata |= BL; \tpcf8574_raw_write(lcd, data); \tpcf8574_raw_write(lcd, data | E); \tpcf8574_raw_write(lcd, data); }  static void hd44780_write_data(struct hd44780 *lcd, u8 data) { \tu8 h = (data &gt;&gt; 4) & 0x0F; \tu8 l = data & 0x0F; \thd44780_write_nibble(lcd, DR, h); \thd44780_write_nibble(lcd, DR, l); \tudelay(37 + 4); }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0438\u0437 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 HD44780, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">hd44780_write_data \u0438\u0437 hd44780-dev.c<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void hd44780_write_data(struct hd44780 *lcd, u8 data) { \tu8 h = (data &gt;&gt; 4) & 0x0F; \tu8 l = data & 0x0F; \tu8 buf[5]; \th = (h &lt;&lt; 4) & 0xF0; \tl = (l &lt;&lt; 4) & 0xF0; \th |= RS; \tl |= RS; \th = h | (RW & 0x00); \tl = l | (RW & 0x00); \tif (lcd-&gt;backlight){ \t\th |= BL; \t\tl |= BL; \t} \tbuf[0] = h | E; \tbuf[1] = h; \tbuf[2] = l; \tbuf[3] = l | E; \tbuf[4] = l; \ti2c_smbus_write_i2c_block_data(lcd-&gt;i2c_client, h, 5, (const u8 *)(&buf[0])); \tudelay(37 + 4); }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0431\u0430\u0439\u0442\u0430 0x1F<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/b74\/3c6\/053\/b743c6053f5948d8b06bf09107ba4fea.jpg\" alt=\"image\"\/>  <\/div>\n<\/div>\n<p>  \u0418 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 0,67 \u043c\u0441.<br \/>  \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0448\u0438\u043d\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 100 \u041a\u0413\u0446, \u0430 \u044d\u0442\u043e \u043d\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u044f \u043f\u043e\u0440\u0442\u043e\u0432 \u043d\u0430 \u0416\u041a\u0418. \u041d\u043e \u0432 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u0431\u0435\u0441\u043f\u0435\u0440\u0435\u0431\u043e\u0439\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438 \u043d\u0430 400 \u041a\u0413\u0446. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0431\u043e\u0435\u0432, \u0430 \u044f \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f.<br \/>  \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0440\u0435\u0436\u0438\u043c\u0430 \u043d\u0430\u0439\u0442\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 LEDE. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 fast, \u0442.\u0435. 400 \u041a\u0413\u0446.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439, \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u043e\u0434\u0443\u043b\u044e \u044f\u0434\u0440\u0430. \u041c\u043e\u0434\u0443\u043b\u044c \u044d\u0442\u043e i2c-ibm_iic. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u2014 iic_force_fast.<br \/>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u0434\u043e \u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u044f\u0434\u0440\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c i2c-ibm_iic.iic_force_fast=1.<br \/>  \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0435 U-boot \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"bash\">setenv addmisc 'setenv bootargs ${bootargs} i2c-ibm_iic.iic_force_fast=1'<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u044b \u0438\u043c\u0435\u0435\u043c:  <\/p>\n<pre><code class=\"bash\"> root@lede: dmesg | grep i2c [    0.000000] Kernel command line: root=\/dev_nfs rw nfsroot=192.168.1.10:\/nfs\/debian_ppc\/rootfs ip=dhcp console=ttyS0,115200 i2c-ibm_iic.iic_force_fast=1 [    4.770923] i2c \/dev entries driver [    4.774742] ibm-iic 4ef600700.i2c: using fast (400 kHz) mode [   10.456041] i2c i2c-0: new_device: Instantiated device hd44780 at 0x27 <\/code><\/pre>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0448\u0438\u043d\u044b \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 (apollo3g.dtsi, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 fast-mode):  <\/p>\n<pre><code>IIC0: i2c@ef600700 { \tcompatible = &quot;ibm,iic&quot;; \treg = &lt;0xef600700 0x00000014&gt;; \tinterrupt-parent = &lt;&UIC0&gt;; \tinterrupts = &lt;0x2 0x4&gt;; \tfast-mode; \t#address-cells = &lt;1&gt;; \t#size-cells = &lt;0&gt;; };<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 TFTP \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<br \/>  \u0418 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:  <\/p>\n<pre><code class=\"bash\">root@lede: dmesg | grep i2c [    4.774585] i2c \/dev entries driver [    4.778396] ibm-iic 4ef600700.i2c: using fast (400 kHz) mode [   10.464396] i2c i2c-0: new_device: Instantiated device hd44780 at 0x27 root@lede: ls -al \/proc\/device-tree\/plb\/opb\/i2c@ef600700 -r--r--r--    1 root     root             4 Nov 18 04:13 #address-cells -r--r--r--    1 root     root             4 Nov 18 04:13 #size-cells drwxr-xr-x    2 root     root             0 Nov 18 04:13 . drwxr-xr-x   12 root     root             0 Nov 18 04:13 .. -r--r--r--    1 root     root             8 Nov 18 04:13 compatible -r--r--r--    1 root     root             0 Nov 18 04:13 fast-mode -r--r--r--    1 root     root             4 Nov 18 04:13 interrupt-parent -r--r--r--    1 root     root             8 Nov 18 04:13 interrupts -r--r--r--    1 root     root             4 Nov 18 04:13 name -r--r--r--    1 root     root             8 Nov 18 04:13 reg <\/code><\/pre>\n<p>  \u0418 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0431\u0430\u0439\u0442\u0430 0,19 \u043c\u0441:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d8e\/64d\/f10\/d8e64df108a442b09c15397f34965ef0.jpg\" alt=\"image\"\/><br \/>  \u0427\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439.<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0443 \u0441\u043e \u0441\u043b\u0430\u0431\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u0433\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c Linux (LEDE). \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Ethernet, \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 SATA, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 I2C \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0440\u0442\u043e\u0432 \u0434\u0430\u044e\u0442 \u0448\u0438\u0440\u043e\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<br \/>  \u041d\u0443 \u0438 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a, \u0434\u043b\u044f \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0448\u0435\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e, \u0444\u0430\u0439\u043b\u044b \u0438\u0437 LEDE, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 (\u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b) \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b <a href=\"https:\/\/yadi.sk\/d\/McvSlL8mzoFnA\">\u0442\u0443\u0442<\/a>.<br \/> \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:\/\/habrahabr.ru\/post\/316100\/\"> https:\/\/habrahabr.ru\/post\/316100\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c!<br \/>  \u041f\u0440\u043e\u0434\u043e\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u043b\u0430\u0442\u043e\u0439 \u043e\u0442 NAS WesternDigital MyBook Live \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u043a \u043d\u0435\u0439 \u0416\u041a \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c.<br \/>  \u0418\u0442\u0430\u043a, \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0448\u0438\u043d\u0435 I2C, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u0440\u0442\u043e\u0432 \u0441 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c, \u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.  <\/p>\n<table>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3d6\/41a\/718\/3d641a718dd04cd8bf2569f25726499d.gif\" alt=\"image\"\/>  <\/td>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3e9\/ae6\/4fc\/3e9ae64fcb1f429aaec4bbca9d9728dd.jpg\" alt=\"image\"\/>  <\/td>\n<\/tr>\n<\/table>\n<p>  <\/p>\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-281754","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/281754","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=281754"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/281754\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=281754"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=281754"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=281754"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}