{"id":163861,"date":"2012-12-31T05:51:03","date_gmt":"2012-12-31T01:51:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=163861"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=163861","title":{"rendered":"<span class=\"post_title\">\u041c\u0438\u043d\u0438\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0438\u0437 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0441 OpenWRT: \u043f\u0438\u0448\u0435\u043c USB class-driver \u043f\u043e\u0434 Linux<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/0ed\/e35\/601\/0ede35601e373f3619887597572f96ad.jpg\"\/><br \/>  \u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0412 <a href=\"http:\/\/habrahabr.ru\/post\/163689\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0443\u044e USB-\u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u043d\u0430 \u0431\u0430\u0437\u0435 STM32F103 \u0438 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043f\u043b\u0435\u0439\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 ILI9325.<br \/>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438 \u043c\u044b \u0435\u0433\u043e \u0438\u0437 \u044e\u0437\u0435\u0440\u0441\u043f\u0435\u0439\u0441\u0430, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 LibUSB. \u041d\u0443 \u0447\u0442\u043e \u0436, \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0438\u0437-\u043f\u043e\u0434 Linux \u0438 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u042d\u0442\u043e\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043c\u044b \u0432\u043d\u0435\u0441\u0435\u043c \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 OpenWRT \u0438 \u043e\u043d \u043f\u043e\u0441\u0435\u043b\u0438\u0442\u0441\u044f \u0442\u0430\u043c \u043d\u0430\u0440\u0430\u0432\u043d\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438.<br \/>  \u041d\u0430\u0447\u043d\u0435\u043c.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0436\u0435\u043b\u0435\u0437\u043e \u0441 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0443 \u043d\u0430\u0441 \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c, \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0447\u044c. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c, \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430, \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438: \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u044d\u0442\u043e <a href=\"http:\/\/free-electrons.com\/doc\/books\/ldd3.pdf\">\u043a\u043d\u0438\u0433\u0430 Linux Device Drivers<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043e \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u043f\u043e\u0434 \u043b\u0438\u043d\u0443\u043a\u0441. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0435\u0449\u0435 \u0440\u0430\u0437 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043c\u043e\u0435\u0439 <a href=\"http:\/\/habrahabr.ru\/post\/158127\/\">\u0441\u0442\u0430\u0442\u044c\u0435\u0439<\/a> \u043f\u0440\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0438 \u0434\u043e\u043f\u0438\u043b\u0438\u0432\u0430\u043d\u0438\u0435 OpenWRT \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u043e\u0443\u0442\u0435\u0440\u0430, \u0442.\u043a. \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438. \u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u2013 <a href=\"http:\/\/free-electrons.com\/\">\u043e\u0447\u0435\u043d\u044c, \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441<\/a>, \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u0432\u044b\u043b\u043e\u0436\u0435\u043d\u044b \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441 \u0438\u0445 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u0441\u0435\u043c\u0438\u043d\u0430\u0440\u043e\u0432.<br \/>  \u0414\u0430, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u0435\u0441\u0442\u0438, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0438\u0437-\u043f\u043e\u0434 Linux, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435\u043c \u043a\u0430\u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u043f\u043e\u0434 Linux Mint, \u043d\u043e \u043e\u0442 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430 \u043c\u0430\u043b\u043e \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c, \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u2013 \u044d\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u043a, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443. \u041b\u044e\u0431\u043e\u043c\u0443, \u043a\u0442\u043e \u0445\u043e\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0432 \u041b\u0438\u043d\u0443\u043a\u0441 \u043d\u0430 \u0443\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0434\u0432\u0430 \u043e\u0431\u0449\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u2013 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0438 \u0431\u043b\u043e\u0447\u043d\u044b\u0435. \u042d\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b. \u041e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0435\u0449\u0435 \u0438\u0434\u0435\u0442 \u0444\u0440\u0430\u0437\u0430, \u0447\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u044f\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<br \/>  \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0438\u0437\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0435\u0437\u0434\u0435. \u041c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u043d\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a\u0430\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0438\u043b\u0438 \u0431\u043b\u043e\u0447\u043d\u044b\u0435, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0432\u044b\u043c\u0438. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e, \u043e\u043d\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <i>\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/i> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0438\u043f\u0430 \u2013 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, framebuffer, input, tty \u0438 \u0442.\u043f. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/02f\/13c\/593\/02f13c593ca121dac8c49eab0328af25.jpg\"\/><br \/>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0432 \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u043e\u0440\u043a \u0442\u043e\u0433\u043e \u0436\u0435 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440\u0430, \u043d\u0430\u043c \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u00ab\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0438\u0441\u043f\u043b\u0435\u0439\u00bb \u2014 \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0438 \u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0443\u0432\u0438\u0434\u044f\u0442 \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u041a \u0442\u0430\u043a\u0438\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430\u043c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440 fbcon, \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0439 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438 \u0446\u0432\u0435\u0442\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442.<br \/>  \u041d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0442\u043e\u0440\u043e\u043f\u0438\u0442\u044c\u0441\u044f \u0438 \u043d\u044b\u0440\u044f\u0442\u044c \u0432 \u044d\u0442\u0438 \u0434\u0435\u0431\u0440\u0438, \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0436\u0435 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043d\u0435\u0433\u043e \u0438\u0437 \u044e\u0437\u0435\u0440-\u0441\u043f\u0435\u0439\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b (\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435) \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043f\u043e USB.<\/p>\n<h4>\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e<\/h4>\n<p>  \u0421\u0430\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043d\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0430\u0436\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0435\u0433\u043e \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0445\u0435\u043b\u043b\u043e\u0443\u0432\u043e\u0440\u043b\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0440\u043a\u0430\u0441\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0425\u0435\u043b\u043b\u043e\u0443\u0432\u043e\u0440\u043b\u0434\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &lt;linux\/module.h&gt;\t\/* Needed by all modules *\/ #include &lt;linux\/kernel.h&gt;\t\/* Needed for KERN_INFO *\/ #include &lt;linux\/init.h&gt;\t\t\/* Needed for the macros *\/ #define DRIVER_AUTHOR &quot;Amon-Ra&quot; #define DRIVER_DESC   &quot;USB STM32-based LCD module driver&quot;  static int __init lcddriver_init(void) { \tprintk(KERN_INFO &quot;Hello, world!\\n&quot;); \treturn 0; }  static void __exit lcddriver_exit(void) { \tprintk(KERN_INFO &quot;Goodbye, world!\\n&quot;); }  module_init(lcddriver_init); module_exit(lcddriver_exit);  MODULE_LICENSE(&quot;GPL&quot;);  MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u0445 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f, \u043e\u043d \u0441\u0430\u043c\u044b\u0439 \u0447\u0442\u043e \u043d\u0438 \u0435\u0441\u0442\u044c \u0445\u0435\u043b\u043b\u043e\u0443\u0432\u043e\u0440\u043b\u0434\u043d\u044b\u0439 \u2013 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0432\u0430 \u043a\u043e\u043b\u0431\u044d\u043a\u0430 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f \u0438 \u043f\u0440\u0438 \u0435\u0433\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0435. \u0412 \u043d\u0438\u0445 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. <br \/>  \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c usblcd.c. <br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443. \u042d\u0442\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f BuildRoot, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043f\u043e \u0441\u0443\u0442\u0438, \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u0441\u0435 \u0437\u0430\u0431\u043e\u0442\u044b: \u043e\u043d \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0442\u0443\u043b\u0447\u0435\u0439\u043d \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441-\u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u043e\u0434\u0430, \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438 \u043f\u0430\u0442\u0447\u0438 \u0434\u043b\u044f \u044f\u0434\u0440\u0430 \u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0443\u0442\u0438\u043b\u0438\u0442, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432 \u043f\u0430\u043a\u0435\u0434\u0436\u0438, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0438 \u043f\u0430\u043a\u0443\u0435\u0442 \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437.<br \/>  \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u044f\u0434\u0440\u0430 (\u0430 \u0432\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u2013 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e), \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438, \u0438 \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043c\u0435\u0439\u043a\u0444\u0430\u0439\u043b \u0441\u043c\u044b\u0441\u043b\u0430 \u043d\u0435\u0442, \u043e\u043d\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b.<br \/>  \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0437\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c make menuconfig, \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u044f\u0434\u0440\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u0436\u0435 \u0431\u044b\u0442\u044c?<br \/>  \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f \u044f\u0434\u0440\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <b>make kernel_menuconfig<\/b>. \u0412\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u0434\u043e \u0431\u044b\u0442\u044c \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b\u043c, \u044d\u0442\u043e \u0431\u0430\u0437\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u0440\u0433\u0435\u0442-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u0438 \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 make clean \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u043a\u0430\u0447\u0430\u0432 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0437\u0430\u043d\u043e\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438, \u0430 \u0447\u0442\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u043b\u0438!<br \/>  \u041f\u0440\u0430\u0432\u0434\u0430, \u044d\u0442\u043e \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0443\u0436\u043d\u043e, \u0432\u0435\u0434\u044c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u043d\u0435\u0441\u0442\u0438 \u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433, \u043d\u043e \u0438 \u0432 \u0444\u0430\u0439\u043b\u044b Makefile (\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439, \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u044b) \u0438 Kconfig (\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044e \u0438\u0437 <b>make kernel_menuconfig<\/b> \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0446\u0438\u0438 \u0434\u043b\u044f Makefile) \u2013 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0432 \u043c\u0435\u043d\u044e \u043c\u044b \u0434\u0430\u0436\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043c \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u043e \u043d\u0430\u0448\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435.<br \/>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448 usblcd.c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u043b\u0438\u043d\u0443\u043a\u0441, \u0432 \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <b>\/drivers\/video<\/b>.<br \/>  \u0418 \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u044f\u0441\u043d\u0438\u0442\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2013 <b>\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u0440\u0433\u0435\u0442-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0432 target\/linux\/&lt;\u0446\u0435\u043b\u044c&gt;\/<\/b><br \/>  Buildroot \u0431\u0435\u0440\u0435\u0442 \u0447\u0438\u0441\u0442\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u044f\u0434\u0440\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0438\u0445 \u0432 <b>build_dir\/&lt;\u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430&gt;\/&lt;\u0446\u0435\u043b\u0435\u0432\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430&gt;\/linux-&lt;\u0432\u0435\u0440\u0441\u0438\u044f \u044f\u0434\u0440\u0430&gt;<\/b><br \/>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0442\u0443\u0434\u0430 \u0436\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0438\u0437 <b>target\/linux\/&lt;\u0446\u0435\u043b\u044c&gt;\/files<\/b> \u2013 \u043e\u0431\u044b\u0447\u043d\u043e, \u0442\u0430\u043c \u043b\u0435\u0436\u0430\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043a\u043e\u0434.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0442\u0447\u0435\u0439, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u0432 <b>target\/linux\/&lt;\u0446\u0435\u043b\u044c&gt;\/patches<\/b>. \u0412 \u044d\u0442\u0438\u0445 \u043f\u0430\u0442\u0447\u0430\u0445 \u043e\u0431\u044b\u0447\u043d\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Makefile \u0438 Kconfig, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a \u043f\u0430\u0442\u0447\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0442\u0447\u0438 \u0438\u0437 <b>target\/linux\/genegic<\/b>, \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0438\u0435, \u043d\u0435 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0434\u0435\u0432\u0430\u0439\u0441.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u044f\u0434\u0440\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u0431\u043e\u0440\u043a\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 build_dir.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0439\u0434\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0430\u043c, \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0438 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f usblcd.c.  <\/p>\n<ol>\n<li>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 <b>target\/linux\/ar71xx\/files\/drivers<\/b> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0430\u043c <b>mkdir video<\/b>, \u0441\u043e\u0437\u0434\u0430\u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. Buildroot \u0440\u0430\u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 files \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u043c \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432. \u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0444\u0430\u0439\u043b usblcd.c \u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443.<\/li>\n<li>\u0412 target\/linux\/ar71xx\/modules.mk \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u0435\u0440\u043d\u0435\u043b-\u043f\u0430\u043a\u0435\u0434\u0436\u0430. <b>\u0422\u0443\u0442 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u0435\u0440\u043d\u0435\u043b-\u043f\u0430\u043a\u0435\u0434\u0436\u0438 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u043a\u0435\u0440\u043d\u0435\u043b-\u043c\u043e\u0434\u0443\u043b\u0438.<\/b> \u041a\u0435\u0440\u043d\u0435\u043b-\u043f\u0430\u043a\u0435\u0434\u0436\u0438 \u2014 \u044d\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u044b, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u044b opkg \u0432 OpenWRT, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u0431\u0438\u043b\u0434\u0438\u0442\u044c \u0432 \u043e\u0431\u0440\u0430\u0437, \u043b\u0438\u0431\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u043b\u0438\u0442\u044c \u043a\u0430\u043a \u043e\u0442\u0435\u0434\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442, \u043d\u043e \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430.<br \/>  \u0413\u043e\u0432\u043e\u0440\u044f \u043f\u0440\u043e\u0449\u0435 \u2014 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0438\u0431\u043e \u0435\u0433\u043e \u0437\u0430\u043f\u0438\u0445\u043d\u0443\u0442\u044c \u0432 \u043f\u0430\u043a\u0435\u0434\u0436 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c (\u0432\u0430\u0440\u0438\u0430\u043d\u0442 M \u0432 <b>make menuconfig<\/b>), \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0435\u0433\u043e \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441\u043e \u0441\u0431\u0438\u043b\u0434\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u043a\u0435\u0434\u0436\u0430\u043c\u0438, \u043b\u0438\u0431\u043e \u0432\u0431\u0438\u043b\u0434\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0442\u0440\u043e\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u043e\u0431\u0440\u0430\u0437\u0430, \u0442\u043e \u0435\u0441\u0442\u044c, \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u2014 \u043a\u0435\u0440\u043d\u0435\u043b-\u043c\u043e\u0434\u0443\u043b\u044c, \u0442\u043e, \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0435 \u044f\u0434\u0440\u0430, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u0431\u0438\u043b\u0434\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u043f\u0438\u0445\u0430\u0442\u044c \u0432 \u043f\u0430\u043a\u0435\u0434\u0436. \u0412\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430 \u0432 \u0441\u0430\u043c\u043e \u044f\u0434\u0440\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 <b>make kernel_menuconfig<\/b> (\u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0442\u0447 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u043a\u0435\u0440\u043d\u0435\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432).<br \/>  \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e \u043d\u0430\u0447\u0430\u043b\u0443 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u0443 \u0438 \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u0438\u044f, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0430\u043a\u0435\u0434\u0436, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d \u043a\u0430\u043a \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u0435\u0440\u043d\u0435\u043b-\u043c\u043e\u0434\u0443\u043b\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u043e\u0441\u043c\u044b\u0441\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438 \u043b\u043e\u0433\u0438\u0447\u043d\u043e.<br \/>  \u0411\u0443\u0434\u0435\u043c \u0431\u0438\u043b\u0434\u0438\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0430 \u0432\u0431\u0438\u043b\u0434\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0424\u0421 \u0438\u043b\u0438 \u043d\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e, \u043f\u0435\u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u044f \u0441\u0431\u043e\u0440\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 make menuconfig.\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0417\u0430\u043f\u0438\u0441\u044c \u0432 modules.mk<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"perl\">define KernelPackage\/usb-lcd   SUBMENU:=$(USB_MENU)   TITLE:=USB STM32-based LCD module   DEPENDS:=@TARGET_ar71xx   KCONFIG:=CONFIG_STM32_USB_LCD   FILES:=$(LINUX_DIR)\/drivers\/video\/usblcd.ko endef  define KernelPackage\/usb-lcd\/description   Kernel module for USB STM32-based LCD module. endef  $(eval $(call KernelPackage,usb-lcd)) <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0437\u0430\u0434\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 make menuconfig \u2013 \u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0434\u0436 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u043e\u0434\u043c\u0435\u043d\u044e USB, \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u043c\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0439\u0441\u044f \u043a \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u043d\u0430 \u0431\u0430\u0437\u0435 AR71xx.<br \/>  \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c, \u043a\u0430\u043a\u0443\u044e \u043e\u043f\u0446\u0438\u044e \u044f\u0434\u0440\u0430 \u043e\u043d \u0430\u043a\u0442\u0438\u0432\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u2013 \u043e\u0431\u0437\u043e\u0432\u0435\u043c \u0435\u0435 CONFIG_STM32_USB_LCD.<br \/>  \u041f\u043e\u0442\u043e\u043c \u0438\u0434\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u0438\u0445\u0438\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u043a\u0435\u0434\u0436 \u2013 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0430\u0448 \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u0442\u0430\u043d\u0435\u0442 usblcd.ko, \u0435\u0433\u043e \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c. \u041f\u043e\u0442\u043e\u043c \u0437\u0430\u0434\u0430\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u0434\u0435\u0440\u0433\u0430\u044e\u0449\u0443\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e.  <\/li>\n<li>\u0418\u0437 \u043a\u043e\u0440\u043d\u044f OpenWRT \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c make menuconfig \u0438\u0449\u0435\u043c \u0432 Kernel modules\/USB \u043d\u0430\u0448 \u043f\u0430\u043a\u0435\u0434\u0436, \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c \u0435\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0431\u0440\u0430\u0437.  <\/li>\n<li>\u042d\u0442\u043e\u0433\u043e \u043f\u043e\u043a\u0430 \u043c\u0430\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0434\u0443\u043b\u044c \u0431\u044b\u043b \u0441\u043e\u0431\u0440\u0430\u043d, \u0432\u044b\u0431\u043e\u0440 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0434\u0436\u0430 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442 \u043e\u043f\u0446\u0438\u044e <b>CONFIG_STM32_USB_LCD<\/b> \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u044f\u0434\u0440\u0430. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u043d\u0430\u0447\u0438\u043b\u0430, \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b Kconfig \u0438 Makefile \u0438\u0437 <b>&lt;\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u044f\u0434\u0440\u0430&gt;\/drivers\/video<\/b>. \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0435\u0437\u0435\u043c \u0432 build_dir \u0437\u0430 \u044d\u0442\u0438\u043c, \u043d\u0438\u0447\u0435\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c, \u043c\u044b \u0443\u0436\u0435 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u0447\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u0430\u0440\u0434-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a \u043f\u0430\u0442\u0447 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u044f\u0434\u0440\u0430 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 <b>\/target\/linux\/ar71xx\/patches<\/b>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f quilt \u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u0442\u0447\u0430\u043c\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 <a href=\"http:\/\/wiki.openwrt.org\/doc\/devel\/patches\">\u0441\u0442\u0430\u0442\u044c\u0435 \u0441 Wiki.OpenWRT<\/a>.<br \/>  \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c quilt (sudo apt-get install quilt) \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e \u0441\u0442\u0430\u0442\u044c\u0435 \u0438\u0437 \u0432\u0438\u043a\u0438:\n<pre><code class=\"bash\">cat &gt; ~\/.quiltrc &lt;&lt;EOF QUILT_DIFF_ARGS=&quot;--no-timestamps --no-index -pab --color=auto&quot; QUILT_REFRESH_ARGS=&quot;--no-timestamps --no-index -pab&quot; QUILT_PATCH_OPTS=&quot;--unified&quot; QUILT_DIFF_OPTS=&quot;-p&quot; EDITOR=&quot;nano&quot; EOF <\/code><\/pre>\n<p>  <\/li>\n<li>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 make target\/linux\/{clean,prepare} V=s QUILT=1<br \/>  \u041e\u043d\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u043d\u0430\u043c \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0432 build_dir \u043a \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e.  <\/li>\n<li>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u044f\u0434\u0440\u0430 \u0432 build_dir. \u0412\u0435\u0440\u0441\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0432\u0435\u0440\u0441\u0438\u0438 \u044f\u0434\u0440\u0430. <br \/>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0441\u0435 \u043f\u0430\u0442\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0431\u043e\u0440\u043a\u0438.\n<pre><code class=\"bash\">cd build_dir\/target-mips_r2_uClibc-0.9.33.2\/linux-ar71xx_generic\/linux-3.6.9\/ quilt push \u2013a <\/code><\/pre>\n<p>  <\/li>\n<li>\u0414\u0430\u043b\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u0442\u0447 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u2014 \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0446\u0438\u0444\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u0442\u0447\u0435\u0439 \u2014 \u044d\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0442\u0447\u0435\u0439 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432. \u0427\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u0442\u0447\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b \u043a \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044f\u0434\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <b>quilt serries<\/b> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439-\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043e\u0431\u0449\u0438\u0435 (generic) \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b (platform) \u043f\u0430\u0442\u0447\u0438. \u0422.\u043a. \u043f\u0430\u0442\u0447 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 <b>Platform\/xxx-&lt;\u0438\u043c\u044f&gt;.patch<\/b>. \u0414\u043b\u044f \u0442\u043e\u0439 \u0440\u0435\u0432\u0438\u0437\u0438\u0438, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f<b> platform\/a06-rb750_nand-add-buffer-verification.patch<\/b> \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u043e\u043c\u0435\u0440 \u0432\u043e\u0437\u044c\u043c\u0435\u043c b00. <br \/>  \u0418\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\n<pre><code class=\"bash\">quilt new platform\/b00-usb-lcd.patch <\/code><\/pre>\n<p>  <\/li>\n<li>\u0421\u043e\u043e\u0431\u0449\u0430\u0435\u043c \u043a\u0438\u043b\u044c\u0442\u0443 \u043a\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0430\u0442\u0447\u0438\u0442\u044c:\n<pre><code class=\"bash\">quilt add drivers\/video\/Kconfig  quilt add drivers\/video\/Makefile <\/code><\/pre>\n<p>  <\/li>\n<li>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0447\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 Kconfig, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044f\u0434\u0440\u0430. \u041d\u0430\u0448 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u00ab\u0447\u0435\u0441\u0442\u043d\u044b\u043c\u00bb \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0432 \u043a\u043e\u0440\u0435\u043d\u044c, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e \u0441\u0442\u0440\u043e\u043a<br \/>  <i>menuconfig FB<br \/>   tristate \u00abSupport for frame buffer devices\u00bb<br \/>  <\/i><br \/>  \u041f\u0438\u0448\u0435\u043c:\n<pre><code class=\"bash\">config STM32_USB_LCD \ttristate &quot;USB STM32-based LCD module support&quot; \thelp \t  Simple USB STM32-based LCD module driver <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0432\u043d\u0435\u0441\u0435\u0442 \u0432 \u043c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044f\u0434\u0440\u0430 \u043d\u043e\u0432\u044b\u0439 \u043f\u0443\u043d\u043a\u0442, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u0432 \u043c\u0435\u043d\u044e Drivers \u2013 Graphics Support.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c Makefile, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0432 \u043d\u0435\u0433\u043e \u043a\u0443\u0434\u0430 \u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0441\u043b\u0435 <i># Hardware specific drivers go first<\/i> \u0441\u0442\u0440\u043e\u043a\u0443<\/p>\n<pre><code class=\"bash\">obj-$(CONFIG_STM32_USB_LCD)             += usblcd.o <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u043d\u0430\u0448 \u043c\u043e\u0434\u0443\u043b\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445, \u0435\u0441\u043b\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435.  <\/li>\n<li>\u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u043e\u0442\u0434\u0430\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <b>quilt diff<\/b>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0444\u0430\u0439\u043b \u043f\u0430\u0442\u0447\u0430. <br \/>  \u041f\u043e\u0441\u043b\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043c <b>quilt refresh<\/b>, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u0442\u0447.  <\/li>\n<li>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u0431\u0438\u043b\u0434\u0440\u0443\u0442\u0430 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043c <b>make target\/linux\/update V=s<\/b><br \/>   \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435<br \/>  <i>`\/home\/ra\/openwrt\/trunk\/build_dir\/target-mips_r2_uClibc-0.9.33.2\/linux-ar71xx_generic\/linux-3.6.9\/patches\/platform\/b00-usb-lcd&#8217; -&gt; `.\/patches-3.6\/b00-usb-lcd&#8217;<\/i>  <\/li>\n<li>\u041e\u0442\u0434\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <b>make clean &#038;&#038; make<\/b>, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044f \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438, \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u0440\u043e\u0443\u0442\u0435\u0440 (\u0432 \/tmp, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u0438 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c\u0441\u044f. \u041c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 mtd, \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 sysupgrade \u2014 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \/etc, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e (\u043a\u043b\u044e\u0447 -\u0441):\n<pre><code class=\"bash\">scp bin\/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-sy supgrade.bin root@192.168.0.48:\/tmp sysupgrade -c openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-sy supgrade.bin  <\/code><\/pre>\n<p>  <\/li>\n<li>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0440\u043e\u0443\u0442\u0435\u0440 \u043f\u043e SSH, \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043b\u0435\u0436\u0438\u0442 \u0432 <b>\/lib\/modules<\/b> \u2014 \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u044f\u0434\u0440\u0430 \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0448 usblcd.ko<br \/>  \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c <b>insmod usblcd &#038;&#038; rmmod usblcd<\/b><br \/>  \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u043f\u0430\u0441\u0442\u044c \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u043a-\u043b\u0438\u0431\u043e \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<br \/>  \u041f\u0438\u0448\u0435\u043c dmesg \u2014 \u0438 \u0432\u043e\u0442 \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445:\n<p>  <i>[ 291.630000] Hello, world!<br \/>  [ 291.640000] Goodbye, world!<\/i><\/li>\n<\/ol>\n<p>  \u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e, \u043c\u043e\u0434\u0443\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u043d \u0438 \u0432\u043d\u0435\u0434\u0440\u0435\u043d. \u041d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043e\u0431\u0440\u0430\u0437 \u0438 \u043f\u0435\u0440\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c <b>make clean &#038;&#038; make target\/compile<\/b>, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0435\u0440\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u044f\u0434\u0440\u043e \u0441 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u0438\u043d\u0443\u0442\u044c \u043d\u0430 \u0440\u043e\u0443\u0442\u0435\u0440 \u043f\u043e SCP. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. <\/p>\n<h4>\u0414\u0440\u0430\u0439\u0432\u0435\u0440<\/h4>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c usb-skeleton, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u043d\u043b\u0430\u0439\u043d <a href=\"http:\/\/lxr.free-electrons.com\/source\/drivers\/usb\/usb-skeleton.c\">\u0432\u043e\u0442 \u0442\u0443\u0442<\/a>.<br \/>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438 \u0433\u0443\u0433\u043b\u0435\u043d\u0438\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"http:\/\/matthias.vallentin.net\/blog\/2007\/04\/writing-a-linux-kernel-driver-for-an-unknown-usb-device\/\">\u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 USB-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. <\/p>\n<ol>\n<li>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0434\u0440\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0442\u044c. \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 usb_device_id:\n<pre><code class=\"cpp\">static struct usb_device_id lcd_table[]={ \t{USB_DEVICE(DEVICE_VENDOR_ID, DEVICE_PRODUCT_ID)}, \t{ } }; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c DEVICE_VENDOR_ID \u0438 DEVICE_PRODUCT_ID \u0437\u0430\u0434\u0435\u0444\u0430\u0439\u043d\u0435\u043d\u043d\u044b\u0435 VID \u0438 PID \u0440\u0430\u0432\u043d\u044b\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, 0xDEAD \u0438 0xF00D \u2013 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435, \u043a\u0430\u043a \u0443 \u043d\u0430\u0448\u0435\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b.  <\/li>\n<li>\u0421\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441 <br \/>  <b>MODULE_DEVICE_TABLE(usb, lcd_table);<\/b><br \/>  \u0441\u043e\u043e\u0431\u0449\u0430\u044f \u044e\u0437\u0435\u0440\u0441\u043f\u0435\u0439\u0441\u0443, \u0447\u0442\u043e \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0432\u0430\u0439\u0441\u044b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.  <\/li>\n<li>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u0431\u044d\u043a\u0438 <br \/>  <b>void LCDProbe(struct usb_interface *interface, const struct usb_device_id *id)<\/b><br \/>  \u0438<br \/>  <b>void LCDDisconnect(struct usb_interface *interface)<\/b><br \/>  \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0438\u0445 \u043f\u0443\u0441\u0442\u044b\u043c\u0438.  <\/li>\n<li>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0436\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u0441\u0435 \u0432\u044b\u0448\u0435\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435:\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 usb_driver<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">struct usb_driver usblcd_driver={ \t.owner = THIS_MODULE, \t.name = &quot;usblcd&quot;, \t.probe = LCDProbe, \t.disconnect = LCDDisconnect, \t.id_table = lcd_table, }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/li>\n<li>\u041e\u0431\u044b\u0447\u043d\u043e, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e USB \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <b>module_init<\/b>, \u0430 \u0434\u0435\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u2014 \u0432 <b>module_exit<\/b>, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u043a\u043e\u043b\u0431\u044d\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432 \u043a\u043e\u0434 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u044b <b>usb_register(&#8230;)<\/b> \u0438 <b>usb_deregister(&#8230;)<\/b>, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044f\/\u0434\u0435\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044f \u043d\u0430\u0448 \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0442 \u043d\u0438\u0445 \u043d\u0438\u0447\u0435\u0433\u043e \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f:\n<pre><code class=\"cpp\">module_usb_driver(usblcd_driver); <\/code><\/pre>\n<p>  <\/li>\n<\/ol>\n<p>  \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435, \u043e\u0442\u0434\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <b>make clean &#038;&#038; make target\/compile V=s<\/b>, \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0434\u044f \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u043b\u044f\u0446\u0438\u0438 \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u0441\u043b\u0435 \u2014 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f usblcd.ko \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0437\u0430\u043c\u0435\u043d\u044f\u044f \u0441\u0442\u0430\u0440\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0435 \u0434\u0435\u043b\u0430\u0435\u043c <b>insmod usblcd.ko<\/b>, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0434\u0438\u0441\u043f\u043b\u0435\u0439, \u0436\u0434\u0435\u043c \u0441\u0435\u043a\u0443\u043d\u0434\u0443-\u0434\u0440\u0443\u0433\u0443\u044e, \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u043c <b>rmmod usblcd<\/b>. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <b>dmesg<\/b>.<br \/>  \u0414\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"bash\">[ 6002.060000] usbcore: registered new interface driver usblcd [ 6010.850000] usb 1-1: new full-speed USB device number 2 using ehci-platform [ 6011.010000] USB STM32-based LCD module connected [ 6015.140000] usb 1-1: USB disconnect, device number 2 [ 6015.140000] USB STM32-based LCD module disconnected [ 6024.240000] usbcore: deregistering interface driver usblcd <\/code><\/pre>\n<p>  \u041f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e <b>printk<\/b> \u043d\u0435 flush&#8217;\u0438\u0442, \u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \\n, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432 \u0445\u0440\u043e\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u0431\u0435\u0437 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443.<br \/>  \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043a\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440\u0430, \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041f\u0440\u0438 \u0435\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043c\u044b, \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c, \u0443\u043a\u0430\u0436\u0435\u043c \u043a\u043e\u043b\u0431\u044d\u043a\u0438 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443-\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 file_operations \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u2014 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f, \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f, \u0447\u0442\u0435\u043d\u0438\u044f, \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0442.\u043f. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043b\u0435\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0431\u043e\u043b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u0448\u043d\u0443\u0440\u0430 \u2014 \u0434\u0438\u0441\u043f\u043b\u0435\u0439, \u0437\u0432\u0443\u043a\u043e\u0432\u0430\u044f \u043a\u0440\u0430\u0442\u0430 \u0438\u043b\u0438 \u043c\u044b\u0448\u044c. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0438 \u044e\u0437\u0435\u0440\u0441\u043f\u0435\u0439\u0441\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0447\u0442\u0435\u043d\u0438\u0435\u043c-\u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 \u0444\u0430\u0439\u043b\u044b \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<br \/>  \u0421\u0442\u0430\u0440\u0442\u0430\u043d\u0443\u0442\u044c \u0438\u043a\u0441\u044b, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u0434\u0438\u0441\u043f\u043b\u0435\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u2014 \u0438\u043a\u0441\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<br \/>  \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b<\/p>\n<pre><code class=\"cpp\">static struct usb_class_driver usblcd_class = { \t.name =\t\t&quot;lcd%d&quot;, \t.fops =\t\t&LCD_fops, \t.minor_base =\tLCD_MINOR_BASE, }; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0437\u0430\u0434\u0430\u0435\u0442 \u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (%d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u043e\u043c\u0435\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u043c\u0435\u043d\u0438), \u0432\u0442\u043e\u0440\u043e\u0435 \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0442\u0440\u0435\u0442\u044c\u0435 \u2014 \u043d\u043e\u043c\u0435\u0440, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>  \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:  <\/p>\n<ol>\n<li>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u0431\u044d\u043a\u0438 (\u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0445 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0431\u0435\u0437 \u043a\u043e\u0434\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0441 return 0)\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u043b\u0431\u044d\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static int LCDOpen(struct inode *inode, struct file *filp); static int LCDrelease(struct inode *inode, struct file *file); static ssize_t LCDwrite(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos); <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/li>\n<li>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <b>file_operations<\/b>:\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 file_operations<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static struct file_operations LCD_fops = { \t.owner \t\t=\tTHIS_MODULE, \t.write \t\t=\tLCDwrite, \t.open \t\t=\tLCDOpen, \t.release \t\t=\tLCDrelease, }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043b\u0431\u044d\u043a\u0430 .read \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 (\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f write. \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 open \u0438\u043b\u0438 release \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0430, \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u0431\u0443\u0434\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0447\u0442\u043e \u044d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e).  <\/li>\n<li>\u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u043a\u043e\u043b\u0431\u044d\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0432\u043e\u0434\u044f\u0442 \u0441\u0432\u043e\u044e, \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 usb_device, \u043e\u0442\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043a\u043e\u043b\u0431\u044d\u043a\u0430 probe (\u0430 \u0442\u043e\u0447\u043d\u0435\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432 probe \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430), \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e. \u0418\u0442\u0430\u043a, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443-\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0434\u0435\u0432\u0430\u0439\u0441\u0430:\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430-\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 usblcd<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">struct usblcd { \tstruct usb_device \t\t\t*udev; \tstruct usb_interface \t\t*interface; \tunsigned char\t\t\t minor;  \tstruct usb_endpoint_descriptor\t*bulk_out_ep; \tunsigned int \t\t\tbulk_out_packet_size; \tunsigned char\t\t\t*videobuffer; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/li>\n<li>\u041e\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u043b\u0431\u044d\u043a Probe. \u0412 \u043d\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0435\u0432\u0430\u0439\u0441\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0441\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0443\u0444\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0444\u0430\u0439\u043b\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0442\u043e \u0438\u043d\u0438\u0442\u0438\u0442\u044c \u0438\u0445 \u043d\u0430\u0434\u043e \u0432 <b>LCD_fops.open<\/b>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u043e\u043b\u0431\u044d\u043a\u0430 Probe<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static int LCDProbe(struct usb_interface *interface, const struct usb_device_id *id) { \tstruct usblcd \t\t\t\t\t\t*dev; \tstruct usb_host_interface \t\t\t*iface_desc; \tstruct usb_endpoint_descriptor\t\t*endpoint;  \tint retval = -ENODEV; \tint i;  \tdev = kzalloc(sizeof(*dev), GFP_KERNEL); \tif (!dev)  \t{ \t\tdev_err(&interface-&gt;dev, &quot;Out of memory\\n&quot;); \t\tretval = -ENOMEM; \t\tgoto exit; \t}  \tdev-&gt;udev=interface_to_usbdev(interface); \tmutex_init(&dev-&gt;io_mutex);  \tdev-&gt;interface = interface;   \tiface_desc = interface-&gt;cur_altsetting;\t \tfor (i = 0; i &lt; iface_desc-&gt;desc.bNumEndpoints; ++i)  \t{ \t\tendpoint = &iface_desc-&gt;endpoint[i].desc; \t\tif(usb_endpoint_is_bulk_out(endpoint)) \t\t{ \t\t\tdev-&gt;bulk_out_ep=endpoint; \t\t\tdev-&gt;bulk_out_packet_size = le16_to_cpu(endpoint-&gt;wMaxPacketSize); \t\t\tbreak; \t\t} \t}  \tif(!dev-&gt;bulk_out_ep) \t{ \t\tdev_err(&interface-&gt;dev, &quot;Can not find bulk-out endpoint!\\n&quot;); \t\tretval = -EIO; \t\tgoto error_dev; \t}  \tdev-&gt;videobuffer=kmalloc(TOTAL_BUFFER_SIZE,\tGFP_KERNEL);  \tif (!dev-&gt;videobuffer)  \t{ \t\tdev_err(&interface-&gt;dev, &quot;Out of memory\\n&quot;); \t\tretval = -ENOMEM; \t\tgoto error_dev; \t}  \tusb_set_intfdata(interface, dev);  \tretval = usb_register_dev(interface, &usblcd_class); \tif (retval) { \t\tdev_err(&interface-&gt;dev, &quot;Not able to get a minor for this device.&quot;); \t\tusb_set_intfdata(interface, NULL); \t\tgoto error_buff; \t}  \tdev-&gt;minor = interface-&gt;minor; \tdev_info(&interface-&gt;dev, &quot;USB STM32-based LCD module connected as lcd%d\\n&quot;,dev-&gt;minor-LCD_MINOR_BASE); \treturn 0;  \terror_buff: \tkfree(dev-&gt;videobuffer);  \terror_dev: \tkfree(dev);\t  \texit: \treturn retval; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <b>usb_device *udev<\/b> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u043e\u043c \u0432 \u043a\u043e\u043b\u0431\u044d\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f <b>*usb_interface<\/b> \u0447\u0435\u0440\u0435\u0437 <b>interface_to_usbdev(interface)<\/b>. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (<b>usb_host_interface<\/b>) \u0438\u0437 \u043f\u043e\u043b\u044f \u0442\u043e\u0439 \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (<b>interface-&gt;cur_altsetting();<\/b> )<br \/>  \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f, \u0435\u0441\u0442\u044c \u043b\u0438 \u0442\u0430\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c, c\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u043d\u0438\u0445 \u0438 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 \u043d\u0430\u0448\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443-\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0414\u043b\u044f bulk-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u0440\u0438 \u043f\u043e\u0441\u044b\u043b\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u044f\u0434\u0440\u043e \u0441\u0430\u043c\u043e \u0440\u0430\u0437\u043e\u0431\u044c\u0435\u0442 \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0442\u0430\u043a \u0447\u0442\u043e, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u043a\u043e\u0434\u0435 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u0441\u0442\u0432\u0438\u044f, \u0443\u0431\u0435\u0434\u0438\u0432\u0448\u0438\u0441\u044c, \u0447\u0442\u043e \u0442\u0430\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0435 0\u044540 \u0431\u0430\u0439\u0442, \u0447\u0442\u043e \u044f \u0443\u043a\u0430\u0437\u0430\u043b \u0432 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u043a \u0442\u043e\u043c\u0443 \u0438\u043b\u0438 \u0438\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u0432\u0438\u0434\u0430 <b>usb_endpoint_is_bulk_out(endpoint)<\/b>. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0439, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u0430\u0439\u0442 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u0440\u043e\u0434\u0435 <b>le16_to_cpu<\/b> (little endian 16-\u0431\u0438\u0442 \u0432 \u043f\u043e\u0440\u044f\u0434\u043e\u043a cpu). \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u044f\u0434\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0432 \u043a\u043e\u043b\u0431\u044d\u043a\u0438, \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 <b>usb_set_intfdata(interface, dev);<\/b> \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0432 \u0444\u0443\u043d\u043a\u0438\u0438 Probe \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 USB. \u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432 \/dev \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0444\u0430\u0439\u043b \/dev\/lcd[n], \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043a\u043e\u043b\u0431\u044d\u043a\u0438 \u0438\u0437 LCD_fops \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f(\u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0444\u0430\u0439\u043b\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430). \u0423\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043d\u0435\u0441\u0435\u0442 \u0432 <b>interface-&gt;minor<\/b> \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c \u043c\u0438\u043d\u043e\u0440. \u0412\u044b\u0447\u0442\u044f \u0438\u0437 \u043d\u0435\u0433\u043e LCD_MINOR_BASE \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u043e\u043c\u0435\u0440, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e \u0432 \/dev\/ \u2014 \u0442.\u043a. \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0443 \u043d\u0430\u0441 \u043e\u0434\u0438\u043d, \u0442\u043e \u043c\u0438\u043d\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d LCD_MINOR_BASE, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \/dev \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \/dev\/lcd0.<\/li>\n<li>\u0421\u0440\u0430\u0437\u0443 \u0436\u0435 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e \u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u043a\u043e\u043b\u0431\u044d\u043a\u0430 Disconnect, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u0430\u0448 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 usblcd \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 <b>dev = usb_get_intfdata(interface);<\/b>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u043e\u043b\u0431\u044d\u043a\u0430 Disconnect<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void LCDDisconnect(struct usb_interface *interface) { \tstruct \tusblcd \t\t\t*dev; \tint \t\t\t\t\tminor; \t \tdev = usb_get_intfdata(interface); \tminor=dev-&gt;minor; \tusb_set_intfdata(interface, NULL); \tusb_deregister_dev(interface, &usblcd_class);  \tdev-&gt;interface = NULL;  \tkfree(dev-&gt;videobuffer); \tkfree(dev); \tdev_info(&interface-&gt;dev,&quot;USB STM32-based LCD module lcd%d disconnected\\n&quot;,minor-LCD_MINOR_BASE); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0432 NULL \u0438 \u0434\u0435\u0440\u0435\u0433\u0435\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441-\u0434\u0440\u0430\u0439\u0432\u0435\u0440. \u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u0441 \u0443\u0436\u0435 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0434\u0435\u0440\u043d\u0435\u0442 \u0438\u0437 \u044e\u0437\u0435\u0440-\u0441\u043f\u0435\u0439\u0441\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0447\u0438\u0441\u0442\u0438\u043c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u0438\u0437-\u043f\u043e\u0434 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b dev. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043b\u0431\u044d\u043a \u0438\u0437 LCD_fops, \u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0432\u044b\u0434\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0441\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f, \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u0415\u0441\u043b\u0438 \u043a\u043e\u0434 \u044d\u0442\u0438\u0445 \u043a\u043e\u043b\u0431\u044d\u043a\u043e\u0432 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u0430\u0434\u0435\u043d\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0434\u0440\u0430, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u00ab\u0430 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 Disconnect \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f Open? \u0430 \u0435\u0441\u043b\u0438 Write?\u00bb<br \/>  \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043c\u044e\u0442\u0435\u043a\u0441, \u043d\u043e \u0435\u0433\u043e \u043c\u044b \u0434\u043e\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u0437\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c write.<\/li>\n<li>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0434\u043d\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432\u0438\u0434\u0435\u043e\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438.<br \/>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0444\u0435\u0440\u043e\u043c \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0438 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0443\u0442\u0438, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<br \/>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0443\u044e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e, \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438\u043b\u0438 \u043d\u0435\u0442. \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0435 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0434\u0435\u0432\u0430\u0439\u0441\u0430, \u043d\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0435\u0435 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0435\u043b \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0435 \u0441\u043d\u0430\u0440\u0443\u0436\u0438: <b>static atomic_t DeviceFree=ATOMIC_INIT(1); <\/b><br \/>  \u0410 \u0432 \u043a\u043e\u043b\u0431\u044d\u043a\u0435 Open \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 Linux Device Drivers:\n<pre><code class=\"cpp\">if(!atomic_dec_and_test(&DeviceFree))\t\t \t{ \t\tatomic_inc(&DeviceFree); \t\treturn -EBUSY; \t} \treturn 0;  <\/code><\/pre>\n<p>  <b>atomic_dec_and_test<\/b> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u044b\u043b\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e (DeviceFree = 1), \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442 (DeviceFree = 0), \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0435\u0440\u043d\u0435\u0442 true, \u0442.\u043a. \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u043b\u0430 \u043d\u0443\u043b\u0435\u043c.<br \/>  \u0415\u0441\u043b\u0438 \u0436\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043d\u044f\u0442\u043e (DeviceFree = 0), \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 DeviceFree = 1 \u0438 \u0432\u0435\u0440\u043d\u0435\u0442 false. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u0435\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0442.\u043a. \u043c\u044b \u0443\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442) \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0439 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0448\u0438\u0431\u043a\u0438 (EBUSY, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0437\u0430\u043d\u044f\u0442\u043e). \u041d\u0430\u0434\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0438 \u0432\u043e\u0448\u0435\u043b \u0432 \u0431\u043b\u043e\u043a \u0438\u0444\u0430, \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0434\u0435\u0432\u0430\u0439\u0441\u0430 \u2014 \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u0435\u0442, \u0442.\u043a. \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 DeviceFree \u0440\u0430\u0432\u043d\u044b\u043c -2 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u043f\u044f\u0442\u044c \u0432\u0435\u0440\u043d\u0435\u0442 false.<\/li>\n<li>\u0421\u0440\u0430\u0437\u0443 \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438 \u0432 \u043a\u043e\u043b\u0431\u044d\u043a\u0435 Release <br \/>  <b>atomic_inc(&#038;DeviceFree);<\/b><br \/>  \u0441\u043e\u043e\u0431\u0449\u0430\u044f, \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e.<\/li>\n<\/ol>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430, \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0432 \u0435\u0433\u043e \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u044f \u043d\u0430 \u0440\u043e\u0443\u0442\u0435\u0440.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f insmod usblcd.ko \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, <b>dmesg<\/b> \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code class=\"bash\">[ 9323.880000] usbcore: registered new interface driver usblcd [ 9334.640000] usb 1-1: new full-speed USB device number 4 using ehci-platform [ 9334.800000] usblcd 1-1:1.0: USB STM32-based LCD module connected as lcd0 <\/code><\/pre>\n<p>  \u0412 \/dev\/ \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \/dev\/lcd0, \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e<\/p>\n<pre><code class=\"bash\">root@OpenWrt:~# cat \/dev\/lcd0  cat: read error: Invalid argument <\/code><\/pre>\n<p>  \u0410 \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 \u043a\u0442\u043e-\u0442\u043e \u0435\u0449\u0435 (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 \u0434\u0432\u0443\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u044f\u0445 ssh):<\/p>\n<pre><code>root@OpenWrt:~# cat \/dev\/urandom &gt; \/dev\/lcd0  -ash: cannot create \/dev\/lcd0: Device or resource busy <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<ol>\n<li>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <b>&lt;linux\/mutex.h&gt;<\/b>, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443-\u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043f\u043e\u043b\u0435 <br \/>  <b>struct mutex io_mutex;<\/b><br \/>  \u0432 \u043a\u043e\u043b\u0431\u044d\u043a Probe \u2014 \u0435\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u044b\u0437\u043e\u0432\u043e\u043c <b>mutex_init(&#038;dev-&gt;io_mutex);<\/b><\/li>\n<li>\u0414\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u0434 \u043a\u043e\u043b\u0431\u044d\u043a\u0430 Disconnect, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043b\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430:\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043b\u0431\u044d\u043a Disconnect<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static void LCDDisconnect(struct usb_interface *interface) { \tstruct \tusblcd \t\t\t*dev; \tint \t\t\t\t\tminor; \t \tdev = usb_get_intfdata(interface); \tminor=dev-&gt;minor; \tusb_set_intfdata(interface, NULL); \tusb_deregister_dev(interface, &usblcd_class);  \tmutex_lock(&dev-&gt;io_mutex); \tdev-&gt;interface = NULL; \tmutex_unlock(&dev-&gt;io_mutex);  \tkfree(dev-&gt;videobuffer); \tkfree(dev); \tdev_info(&interface-&gt;dev,&quot;USB STM32-based LCD module lcd%d disconnected\\n&quot;,minor-LCD_MINOR_BASE); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0432\u043e\u0434\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043b\u043e\u043a \u043c\u044e\u0442\u0435\u043a\u0441\u0430 \u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c dev-&gt;interface \u043d\u0430 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u043d\u0443\u043b\u044e. \u0422\u043e \u0435\u0441\u0442\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043b\u0431\u044d\u043a\u0430\u0445 \u043a\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u043b\u043e\u043a\u0430 io_mutex, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u0434\u0435\u0432\u0430\u0439\u0441 \u043b\u0438\u0431\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u044b\u0434\u0435\u0440\u043d\u0443\u043b\u0438 (\u0442\u043e\u0433\u0434\u0430 dev-&gt;interface \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043d\u0435\u043c\u0443 \u043d\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043f\u0430\u0434\u0435\u043d\u0438\u044e), \u043b\u0438\u0431\u043e \u0434\u0438\u0441\u043a\u043e\u043d\u043d\u0435\u043a\u0442 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f (\u0442\u043e\u0433\u0434\u0430 \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 NULL).  <\/li>\n<li>\u0414\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u0434 \u043a\u043e\u043b\u0431\u044d\u043a\u0430 Open:<br \/>  \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043e\u0442\u043a\u0440\u044b\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u043f\u0435\u0440\u0432\u044b\u0435, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0438\u043d\u043e\u0440 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0435\u0440\u0435\u0437 <br \/>  <b>subminor = iminor(inode);<\/b><br \/>  \u0438 \u0435\u0433\u043e usb_interface \u0447\u0435\u0440\u0435\u0437 <b>interface = usb_find_interface(&#038;usblcd_driver, subminor);<\/b><br \/>  \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u043d\u0430\u0448 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0435\u0440\u0435\u0437 <b>dev = usb_get_intfdata(interface);<\/b> \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448 \u043b\u043e\u043a,<b> mutex_lock(&#038;dev-&gt;io_mutex);<\/b> \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u0442 \u043e\u0447\u0438\u0441\u0442\u043a\u0443, \u0432\u044b\u0434\u0435\u0440\u043d\u0443\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f.<br \/>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f \u0438\u0437 \u043a\u043e\u043b\u0431\u044d\u043a\u043e\u0432 LCD_fops:<br \/>  <b>filp-&gt;private_data = dev;<\/b>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043b\u0431\u044d\u043a Open<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static int LCDOpen(struct inode *inode, struct file *filp) { \tstruct usblcd \t\t\t\t*dev; \tstruct usb_interface \t\t*interface; \tint retval\t\t=\t\t\t0; \tint subminor; \tfilp-&gt;private_data=NULL; \tif(!atomic_dec_and_test(&DeviceFree))\t\t \t{ \t\tatomic_inc(&DeviceFree); \t\tretval = -EBUSY; \t\tgoto exit; \t}  \tsubminor = iminor(inode); \tinterface = usb_find_interface(&usblcd_driver, subminor); \tif (!interface) { \t\tprintk(KERN_ERR &quot;usblcd driver error, can't find device for minor %d\\n&quot;, subminor); \t\tretval = -ENODEV; \t\tgoto exit; \t} \tdev = usb_get_intfdata(interface); \tif (!dev)  \t{ \t\tretval = -ENODEV; \t\tgoto exit; \t} \t \tmutex_lock(&dev-&gt;io_mutex); \t \tif(!dev-&gt;interface) \t{ \t\tretval = -ENODEV; \t\tgoto unlock_exit; \t} \t \tfilp-&gt;private_data = dev; \tdev_info(&interface-&gt;dev, &quot;usblcd: opened successfuly&quot;);  \tunlock_exit: \tmutex_unlock(&dev-&gt;io_mutex); \texit: \treturn retval; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/li>\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u043e\u043c\u043d\u044f, \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u0442 \u043d\u0430\u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438\u0437 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 (\u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445) \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 X (unsigned short), Y (unsigned short), \u0438 \u0434\u043b\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (unsgned long). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u043e\u043d\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432 Little Endian.\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u043b\u0431\u044d\u043a Write<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static ssize_t LCDwrite(struct file *filp, const char __user *user_buf, size_t count, loff_t *ppos) { \tstruct usblcd \t\t\t\t*dev; \tstruct usb_interface \t\t*interface; \tint retval = -ENODEV;  \tint usbSent; \tint writtenCount=count;  \tint x,y;  \tif(*ppos&gt;=VB_SIZE*2) \t{ \t\tretval = -ENOSPC; \t\tgoto exit; \t} \tif(*ppos+count&gt;VB_SIZE*2) \t\twrittenCount=VB_SIZE*2-*ppos;  \tdev = filp-&gt;private_data; \tif (!dev)  \t{ \t\tprintk(KERN_ERR &quot;usblcd driver error, no device found\\n&quot;); \t\tretval = -ENODEV; \t\tgoto exit; \t} \tmutex_lock(&dev-&gt;io_mutex); \tinterface = dev-&gt;interface; \tif (!interface)  \t{ \t\tprintk(KERN_ERR &quot;usblcd driver error, no device found\\n&quot;); \t\tretval = -ENODEV; \t\tgoto exit; \t} \tif (copy_from_user(dev-&gt;videobuffer+8, user_buf, writtenCount)) \t{ \t        retval = -EFAULT; \t        goto unlock_exit; \t} \t \ty=((int)((*ppos)&gt;&gt;1)\/(int)WIDTH); \tx=((int)((*ppos)&gt;&gt;1))-y*WIDTH;  \t*(unsigned short*)(dev-&gt;videobuffer)=cpu_to_le16(x); \t*(unsigned short*)(dev-&gt;videobuffer+2)=cpu_to_le16(y); \t*(unsigned long*)(dev-&gt;videobuffer+4)=cpu_to_le32(writtenCount&gt;&gt;1);  \tretval = usb_bulk_msg(dev-&gt;udev,               usb_sndbulkpipe(dev-&gt;udev, 1),dev-&gt;videobuffer,               8+writtenCount,               &usbSent, HZ*5);  \tif (!retval) { \t    retval = writtenCount; \t    *ppos+=writtenCount; \t} \telse \t{ \t\tretval=-EIO; \t\tgoto unlock_exit; \t}  \tunlock_exit: \tmutex_unlock(&dev-&gt;io_mutex); \texit: \treturn retval; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u2014 \u0438\u0441\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0435\u0432\u0430\u0439\u0441\u0430 \u0444\u0430\u0439\u043b\u043e\u043c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432 320*240*2 \u0431\u0430\u0439\u0442. \u0415\u0441\u043b\u0438 \u0432\u044b\u043b\u0435\u0437\u0430\u0435\u043c \u0437\u0430 \u044d\u0442\u043e\u0442 \u043f\u0440\u0435\u0434\u0435\u043b \u2014 \u043a\u0440\u0438\u0447\u0438\u043c \u0447\u0442\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u0430. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e *ppos, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0431\u0430\u0439\u0442. \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0434\u0435\u0432\u0430\u0439\u0441 \u0435\u0449\u0435 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u043b\u043e\u043a\u043d\u0443\u0432 \u043c\u044e\u0442\u0435\u043a\u0441 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0432, \u0447\u0442\u043e \u0442\u0430\u043c \u043b\u0435\u0436\u0438\u0442 \u0432 dev-&gt;interface \u2014 \u043d\u0435 NULL \u043b\u0438. \u041f\u043e\u0442\u043e\u043c \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0437 \u044e\u0437\u0435\u0440\u0441\u043f\u0435\u0439\u0441\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u0431\u0443\u0444\u0435\u0440\u0435 \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0434 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u044d\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a (\u043f\u043e\u043c\u043d\u044f \u043f\u0440\u043e Endian \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u0435\u0432\u0430\u0439\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0435\u0433\u043e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c) \u0438 \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>usb_bulk_msg<\/b>.<br \/>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044d\u0442\u043e \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u043d\u0435\u043c, \u043a\u0430\u043a \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c.<br \/>  \u0412\u0441\u0435, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 \u0438 \u0437\u0430\u043d\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0436\u0435 \u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0442.\u043a. \u043f\u043e \u043d\u0435\u043c\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0439\u043c\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u0442 \u043f\u0440\u043e\u0448\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u044c. \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u043b\u043e\u0447\u0438\u0432\u0430\u0435\u043c \u043c\u044e\u0442\u0435\u043a\u0441 \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u043c.  <\/li>\n<\/ol>\n<p>  \u041d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c: \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 (\u044d\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u043c, \u043d\u0430\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u0445\u0435\u043b\u043b\u043e\u0443\u0432\u043e\u0440\u043b\u0434\u043d\u044b\u0445), \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u0440\u043e\u0443\u0442\u0435\u0440, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c <b>insmod usblcd.ko<\/b>.<br \/>  \u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0435 \u043f\u0430\u0434\u0430\u0435\u0442, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f <b>\/dev\/lcd0<\/b>.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u0440\u043e\u0448\u043b\u043e!<\/p>\n<p>  \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0440\u0430\u043d\u0434\u043e\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d:<\/p>\n<pre><code class=\"bash\">cat \/dev\/urandom &gt; \/dev\/lcd0 <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/412\/635\/72b\/41263572bfb1d29918d150fe2023bedf.jpg\"\/><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u2014 busybox:<\/p>\n<pre><code class=\"bash\">cat \/bin\/busybox &gt; \/dev\/lcd0 <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/bd3\/cf6\/5e2\/bd3cf65e25b256369d5943740495a4e5.jpg\"\/><\/p>\n<p>  \u041d\u0435 \u043f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438, \u0432\u0438\u0434\u043d\u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u0438 \u0447\u0438\u0441\u0442\u044b\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u043e\u043c?<br \/>  \u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443:<\/p>\n<pre><code class=\"bash\">cat hobgoblin.raw &gt; \/dev\/lcd0 <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/6b1\/f96\/ead\/6b1f96eade51c754cf12e38811363bd7.jpg\"\/><\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0418\u0442\u0430\u043a, \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043e\u0442 \u044e\u0437\u0435\u0440\u0441\u043f\u0435\u0439\u0441\u0430 \u043a \u043a\u0435\u0440\u043d\u0435\u043b\u0443, \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e\u0434 linux \u0438 \u0432\u0431\u0438\u043b\u0434\u0438\u043b\u0438 \u0435\u0433\u043e \u0432 \u043d\u0430\u0448 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 OpenWRT.<br \/>  \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u044f\u0434\u0440\u0443, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0430 \u0441\u0430\u043c\u044b\u0439 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0434\u0438\u0441\u043f\u043b\u0435\u0439, \u0438 \u0447\u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0438\u043b\u0438 \u0435\u0449\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435. \u0414\u0435\u043b\u0430\u0442\u044c \u043c\u044b \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440\u0430.<br \/>  \u0414\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435!<\/p>\n<p>  <i>Hail to the speaker, <br \/>  Hail to the knower, <br \/>  Joy to him who has understood, <br \/>  Delight to those who have listened.<\/i>    \t \t\t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/163861\/\"> http:\/\/habrahabr.ru\/post\/163861\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/0ed\/e35\/601\/0ede35601e373f3619887597572f96ad.jpg\"\/><br \/>  \u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0412 <a href=\"http:\/\/habrahabr.ru\/post\/163689\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0443\u044e USB-\u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u043d\u0430 \u0431\u0430\u0437\u0435 STM32F103 \u0438 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043f\u043b\u0435\u0439\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 ILI9325.<br \/>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438 \u043c\u044b \u0435\u0433\u043e \u0438\u0437 \u044e\u0437\u0435\u0440\u0441\u043f\u0435\u0439\u0441\u0430, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 LibUSB. \u041d\u0443 \u0447\u0442\u043e \u0436, \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0438\u0437-\u043f\u043e\u0434 Linux \u0438 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u042d\u0442\u043e\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043c\u044b \u0432\u043d\u0435\u0441\u0435\u043c \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 OpenWRT \u0438 \u043e\u043d \u043f\u043e\u0441\u0435\u043b\u0438\u0442\u0441\u044f \u0442\u0430\u043c \u043d\u0430\u0440\u0430\u0432\u043d\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438.<br \/>  \u041d\u0430\u0447\u043d\u0435\u043c.  <\/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-163861","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/163861","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=163861"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/163861\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=163861"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=163861"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=163861"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}