{"id":467424,"date":"2025-07-18T21:11:12","date_gmt":"2025-07-18T21:11:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=467424"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=467424","title":{"rendered":"<span>\u041c\u043e\u0439 \u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0443\u0442\u044c \u0434\u043e GPIO \u0432 QEMU<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0422\u0435\u043c\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043c\u0435\u043d\u044f, \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u0443\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0440\u0430 \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0441\u043a\u0430\u0437\u043a\u0438. \u041f\u043e\u0447\u0442\u0438 \u0434\u0435\u0441\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 GPIO \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b QEMU. GPIO \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0432\u0437\u0432\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 (Weigh In Motion, WIM). \u0421 \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439, \u0430 \u044f \u2014 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0441\u0435\u043c. \u0418 \u0432\u043e\u0442 \u043a \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u043d\u0435\u043c\u0443 \u044e\u0431\u0438\u043b\u0435\u044e \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041d\u0438\u043a\u0438\u0442\u0430 \u0428\u0443\u0431\u0438\u043d, \u044f \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0421\u043d\u041a \u0432 <a href=\"https:\/\/www.yadro.com\/?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=GPIO_QEMU_P1_100725\" rel=\"noopener noreferrer nofollow\">YADRO<\/a>. \u041c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f GPIO \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0430 QEMU <abbr class=\"habraabbr\" title=\"Inter-VM Shared Memory\" data-title=\"&lt;p&gt;Inter-VM Shared Memory&lt;\/p&gt;\" data-abbr=\"ivshmem\">ivshmem<\/abbr> \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0430 \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0439 \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u0448\u0438\u043d\u043e\u0439 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c. \u042d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/303060\/\" rel=\"noopener noreferrer nofollow\">\u00ab\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 GPIO \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u0431\u0430\u0437\u0435 QEMU ivshmem \u0434\u043b\u044f Linux\u00bb<\/a>. \u0415\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0431\u044b\u043b\u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430:<\/p>\n<ul>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ivshmem \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u044b \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f,<\/p>\n<\/li>\n<li>\n<p>\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 GPIO \u0432\u043d\u0443\u0442\u0440\u0438 QEMU \u043d\u043e\u0441\u0438\u043b \u0441\u043a\u043e\u0440\u0435\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439, \u0447\u0435\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440,<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0441 PCI-\u0448\u0438\u043d\u043e\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u044f\u0434\u0440\u0430 Linux \u0438 QEMU. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u044f \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0434\u043e\u043b\u0433\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e, \u043e \u0447\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<h2>\u041d\u043e\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 QEMU<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 ivshmem, \u0432\u0435\u0434\u044c \u043e\u043d \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438. \u0412 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u043f\u043e\u0448\u0435\u043b \u043f\u043e \u043f\u0443\u0442\u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043d\u0435 \u0441\u0442\u0430\u043b \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c QEMU \u2014 \u0434\u0435\u0441\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u043e \u0435\u0433\u043e \u0437\u043d\u0430\u043b. ivshmem \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u00ab\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u00bb, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 QEMU,<\/p>\n<\/li>\n<li>\n<p>\u0448\u0438\u043d\u044b PCI \u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 ivshmem \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u0430\u044f \u043c\u0435\u0436\u0434\u0443 QEMU \u0438 \u0445\u043e\u0441\u0442\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u044c, \u0442\u043e \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 GPIO \u043c\u044b \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043f\u0440\u0438\u0447\u0435\u043c \u0432 \u0434\u0432\u0443\u0445 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u0445: MMIO \u0438 PCI. \u0427\u0442\u043e\u0431\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u0430\u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0442\u0430\u043a \u0438 \u043c\u043e\u0434\u0435\u043b\u0438, \u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0418\u043c\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">DATA<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x00<\/p>\n<\/td>\n<td>\n<p align=\"left\">RO<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043e\u0432\/\u0432\u044b\u0445\u043e\u0434\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SET<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x04<\/p>\n<\/td>\n<td>\n<p align=\"left\">W1S<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0434\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u043a\u0430\u043a 1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CLEAR<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x08<\/p>\n<\/td>\n<td>\n<p align=\"left\">W1C<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u043a 0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">DIR_OUT<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x0c<\/p>\n<\/td>\n<td>\n<p align=\"left\">RW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043b\u0438\u043d\u0438\u044e \u043a\u0430\u043a \u0432\u044b\u0445\u043e\u0434<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ISTATUS<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x10<\/p>\n<\/td>\n<td>\n<p align=\"left\">RW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">EOI<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x14<\/p>\n<\/td>\n<td>\n<p align=\"left\">W1C<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">IEN<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x18<\/p>\n<\/td>\n<td>\n<p align=\"left\">RW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">RISEN<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x1c<\/p>\n<\/td>\n<td>\n<p align=\"left\">RW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u043c\u0443 \u0444\u0440\u043e\u043d\u0442\u0443<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">FALLEN<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x20<\/p>\n<\/td>\n<td>\n<p align=\"left\">RW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0437\u0430\u0434\u043d\u0435\u043c\u0443 \u0444\u0440\u043e\u043d\u0442\u0443<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u043e\u0434 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 Linux \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0441\u0434\u0435\u043b\u0430\u0432 \u0442\u0438\u043f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0431\u0438\u0442\u043e\u0432\u043e\u043c \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430, \u0430 \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f. \u041d\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u0431\u044b \u043a \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044e \u0441\u0430\u043c\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 QEMU.<\/p>\n<blockquote>\n<p><strong>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/strong><\/p>\n<ul>\n<li>\n<p>qemu v10.0.0 c \u043c\u043e\u0434\u0435\u043b\u044c\u044e MMIO GPIO \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439 RISC-V virt,<\/p>\n<\/li>\n<li>\n<p>linux v6.12 c \u043f\u0430\u0442\u0447\u0430\u043c\u0438 \u0434\u043b\u044f dtb-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0439 \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c \u0434\u043b\u044f QEMU MMIO GPIO,<\/p>\n<\/li>\n<li>\n<p>\u0432\u0430\u043d\u0438\u043b\u044c\u043d\u044b\u0439 buildroot 2025.02.2.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/gitflic.ru\/project\/maquefel\/qemu-gpio-playground\" rel=\"noopener noreferrer nofollow\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442-\u043e\u0431\u0435\u0440\u0442\u043a\u0443<\/a>.<\/p>\n<\/blockquote>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b, \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u0430\u043c\u0438 \u0432 QEMU \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 WIM. \u041d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435 \u0447\u0435\u0440\u0435\u0437 \u0431\u043b\u043e\u043a \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f NAMUR \u043a \u0432\u0445\u043e\u0434\u0430\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u043a\u043e\u043b\u0435\u0441\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043e\u043c\/\u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043b\u0438\u043d\u0438\u0438 \u0432\u0445\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u043e\u0448\u0438\u0432\u043e\u043a \u0434\u043b\u044f:<\/p>\n<ul>\n<li>\n<p>\u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432,<\/p>\n<\/li>\n<li>\n<p>\u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u043b\u0430\u043c\u043f\u043e\u0447\u0435\u043a,<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0434\u0430\u0436\u0435 \u0442\u0430\u043a\u043e\u0439 \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u0438, \u043a\u0430\u043a \u0448\u0438\u043d\u0430 <abbr class=\"habraabbr\" title=\"Serial General-Purpose Input\/Output\" data-title=\"&lt;p&gt;Serial General-Purpose Input\/Output&lt;\/p&gt;\" data-abbr=\"SGPIO\">SGPIO<\/abbr>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0434\u043b\u044f \u044f\u0434\u0440\u0430 \u0438 rootfs \u044f \u0434\u0430\u043c, \u0430 \u0434\u043b\u044f QEMU \u2014\u00a0\u043d\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c QEMU \u0438 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b:<\/p>\n<pre><code>$ git clone https:\/\/gitflic.ru\/project\/maquefel\/qemu-gpio-playground $ git submodule update --init --depth 1 -- qemu $ make .build-qemu $ wget https:\/\/gitflic.ru\/project\/maquefel\/qemu-gpio-playground\/release\/037789b9-f059-409b-9087-df5fe92d6c5a\/be46609c-7755-4086-a92d-6d20a4fa3889\/download -O initramfs.cpio.xz $ wget https:\/\/gitflic.ru\/project\/maquefel\/qemu-gpio-playground\/release\/037789b9-f059-409b-9087-df5fe92d6c5a\/ad6d8ae3-6301-404d-9681-c263658d9da2\/download -O Image<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439 RISC-V virt \u0441 GPIO SYSBUS:<\/p>\n<pre><code>$ build-qemu\/qemu-system-riscv64 -machine virt -m 1G -kernel Image -initrd initramfs.cpio.xz -append \"root=\/dev\/ram\" -qmp unix:.\/qmp-sock,server,wait=off -nographic -serial mon:stdio   qemu-system-riscv64 # modprobe gpio-qemu qemu-system-riscv64 # gpioinfo gpiochip0 - 32 lines:         line   0:       unnamed                 input         line   1:       unnamed                 input         line   2:       unnamed                 input         line   3:       unnamed                 input         line   4:       unnamed                 input         line   5:       unnamed                 input         line   6:       unnamed                 input         line   7:       unnamed                 input         line   8:       unnamed                 input         line   9:       unnamed                 input         line  10:       unnamed                 input         line  11:       unnamed                 input         line  12:       unnamed                 input         line  13:       unnamed                 input         line  14:       unnamed                 input         line  15:       unnamed                 input         line  16:       unnamed                 input         line  17:       unnamed                 input         line  18:       unnamed                 input         line  19:       unnamed                 input         line  20:       unnamed                 input         line  21:       unnamed                 input         line  22:       unnamed                 input         line  23:       unnamed                 input         line  24:       unnamed                 input         line  25:       unnamed                 input         line  26:       unnamed                 input         line  27:       unnamed                 input         line  28:       unnamed                 input         line  29:       unnamed                 input         line  30:       unnamed                 input         line  31:       unnamed                 input<\/code><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0437\u0430\u0434\u0430\u0442\u044c \u0438\u043b\u0438 \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <strong>QMP<\/strong>. \u0422\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u0430\/\u0432\u044b\u0445\u043e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>host $ tools\/gpio-mmio-toggle.sh .\/qmp-sock 0 1 {\"QMP\": {\"version\": {\"qemu\": {\"micro\": 91, \"minor\": 2, \"major\": 9}, \"package\": \"v10.0.0-rc1-9-gc25d917239-dirty\"}, \"capabilities\": [\"oob\"]}} {\"return\": {}} {\"return\": {}}<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0443\u044e \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u00ab\u0433\u043e\u0441\u0442\u044f\u00bb:<\/p>\n<pre><code>qemu-system-riscv64 # gpiomon -c 0 0 5112.382098300  rising  gpiochip0 0 5115.131181200  falling gpiochip0 0<\/code><\/pre>\n<p>\u0421\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u0430\/\u0432\u044b\u0445\u043e\u0434\u0430:<\/p>\n<pre><code>qemu-system-riscv64 #  gpioset -c 0 0=1 host $ tools\/gpio-mmio-toggle.sh .\/qmp-sock 0 {\"QMP\": {\"version\": {\"qemu\": {\"micro\": 91, \"minor\": 2, \"major\": 9}, \"package\": \"v10.0.0-rc1-9-gc25d917239-dirty\"}, \"capabilities\": [\"oob\"]}} {\"return\": {}} {\"return\": 1}<\/code><\/pre>\n<h2>\u041c\u043e\u0434\u0435\u043b\u044c GPIO \u0434\u043b\u044f QEMU<\/h2>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c QEMU \u0432 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u0442\u044c MMIO \u0438 PCI. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u2014 \u0442\u043e\u0436\u0435 MMIO, \u043d\u043e \u0432 QEMU \u043e\u043d\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438.<\/p>\n<p>\u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u0435\u0440\u0434\u0446\u0430 \u043b\u044e\u0431\u043e\u0439 MMIO-\u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u0430\u043f\u0435\u0440\u0442\u0443\u0440\u044b.<\/p>\n<h3>\u0410\u043f\u0435\u0440\u0442\u0443\u0440\u0430 \u0438 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e<\/h3>\n<p>\u041a\u0430\u043a \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/877248\/\" rel=\"noopener noreferrer nofollow\">\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439<\/a>, \u043b\u044e\u0431\u043e\u0435 MMIO-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u2014 \u044d\u0442\u043e <strong>MemoryRegion<\/strong> \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0431\u044b\u043b \u0432\u0438\u0434\u0435\u043d <strong>CPU<\/strong> \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443, \u0442\u0430\u043a\u043e\u043c\u0443 \u043a\u0430\u043a <strong>DMA<\/strong>, \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u043c \u0434\u043b\u044f <strong>cpu0<\/strong>:<\/p>\n<pre><code>      0x0                                    0xffffffffffffffff       |------|------|------|------|------|------|------|------| 0:    [                    address-space: cpu-memory-0        ] 0:    [                    address-space: memory              ]                     0x102000           0x1023ff 0:                  [             gpio        ]<\/code><\/pre>\n<p>\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.qemu.org\/docs\/master\/devel\/memory.html#overlapping-regions-and-priority\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e QEMU<\/a>, \u044d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0442\u0430\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0430.<\/p>\n<p>\u0412 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435 QEMU:<\/p>\n<pre><code>(qemu) info mtree [...] address-space: cpu-memory-0 address-space: memory   0000000000000000-ffffffffffffffff (prio 0, i\/o): system     0000000000102000-00000000001023ff (prio 0, i\/o): gpio [...]<\/code><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0433\u0438\u043e\u043d \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u043c\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>static const MemoryRegionOps mmio_mmio_ops = {     .read = mmio_gpio_register_read_memory,     .write = mmio_gpio_register_write_memory,     .endianness = DEVICE_NATIVE_ENDIAN,     .valid = {         .min_access_size = 4,         .max_access_size = 4,     }, };   [...] memory_region_init_io(iomem, obj, &amp;mmio_mmio_ops, s,                       \"gpio\", APERTURE_SIZE); [...]<\/code><\/pre>\n<p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 Load\/Store \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>mmio_gpio_register_read_memory()<\/code>\/<code>mmio_gpio_register_write_memory()<\/code> \u043f\u0440\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0430 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. <\/p>\n<pre><code>static uint64_t mmio_gpio_register_read_memory(void *opaque, hwaddr addr, unsigned size); static void mmio_gpio_register_write_memory(void *opaque, hwaddr addr, uint64_t value, unsigned size);<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e <strong>hwaddr addr<\/strong> \u2014 \u044d\u0442\u043e \u0430\u0434\u0440\u0435\u0441 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430, \u0430 \u043d\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441.<\/p>\n<p>\u041d\u0430\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d \u0432 \u0444\u0430\u0439\u043b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b:<\/p>\n<pre><code>gpio = qdev_new(TYPE_MMIO_GPIO); sysbus_mmio_map(SYS_BUS_DEVICE(gpio), 0, ADDRESS);<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c <code>ADDRESS<\/code>\u2014 \u044d\u0442\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0430 <code>TYPE_MMIO_GPIO<\/code> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435: <\/p>\n<pre><code>#define TYPE_MMIO_GPIO \"mmio-gpio\"<\/code><\/pre>\n<h3>mmio_gpio_register_read_memory()\/mmio_gpio_register_write_memory() <\/h3>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u0435\u0440\u0442\u0443\u0440\u044b. \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\/\u0437\u0430\u043f\u0438\u0441\u044c \u0435\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u0412 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u0430\/\u0432\u044b\u0445\u043e\u0434\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438. \u0422\u043e\u0433\u0434\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>static void mmio_gpio_register_write_memory(void *opaque, hwaddr addr,                                             uint64_t value, unsigned size) {   uint32_t val32 = value;     switch(addr) {   case 0x04: \/\/ SET     data |= val32;     break;   case 0x08: \/\/ CLEAR     data &amp;= ~val32;     break;   case 0x00: \/\/ DATA     \/* \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f *\/   default:     \/* \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 *\/   }     [...] }<\/code><\/pre>\n<p>\u0410 \u0442\u0430\u043a\u0438\u043c \u2014 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>static uint64_t mmio_gpio_register_read_memory(void *opaque, hwaddr addr,                                                unsigned size) {   uint32_t val32 = 0;     switch(addr) {     case 0x00: \/\/ DATA       val32 = data;       break;     case 0x04: \/\/ SET     case 0x08: \/\/ CLEAR       \/* \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 *\/       break;     default:       \/* \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 *\/   }     [...]     return val32; }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u0443\u044e \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e FLASH-\u043f\u0430\u043c\u044f\u0442\u044c. \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u0448\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 1\/2\/4\/8, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>Load\/Store<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0448\u0438\u0440\u0438\u043d\u044b. \u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d Register API.<\/p>\n<h3>Register API \u0438 \u043f\u0440\u043e\u0447\u0438\u0439 \u0441\u0430\u0445\u0430\u0440<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438 \u0432 QEMU \u0431\u044b\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0441\u043b\u043e\u0439\u043a\u0430. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0435 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u043e\u043d\u0430 \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b <code>REG8\/16\/32\/64(reg, addr)<\/code>. \u0418\u0445 \u0446\u0435\u043b\u044c \u2014 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0430:<\/p>\n<pre><code>enum { A_ ## reg = (addr) }; enum { R_ ## reg = (addr) \/ (1, 2, 4, 8) };<\/code><\/pre>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445 \u2014 \u043c\u0430\u043a\u0440\u043e\u0441\u044b <code>FIELD_EX\/SEX(storage, reg, field)<\/code> \u0438 <code>FIELD_DP\/SDP(storage, reg, field, val)<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u041e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 extract\/deposit, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438.<\/p>\n<p>\u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445 \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/elixir.bootlin.com\/qemu\/v10.0.0\/source\/include\/hw\/register.h#L45\" rel=\"noopener noreferrer nofollow\"><code>struct RegisterAccessInfo<\/code><\/a> \u0438 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <a href=\"https:\/\/elixir.bootlin.com\/qemu\/v10.0.0\/source\/include\/hw\/register.h#L191\" rel=\"noopener noreferrer nofollow\"><code>register_init_block()<\/code><\/a> \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041e\u043d\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0434\u0435\u043b\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f Register API \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043c\u0430\u0441\u043e\u043a \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0431\u0438\u0442\u044b, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f (<code>-d guest_errors,unimp<\/code>):<\/p>\n<ul>\n<li>\n<p><code>ro<\/code> \u2014 read-only,<\/p>\n<\/li>\n<li>\n<p><code>w1c<\/code> \u2014 write one to clear,<\/p>\n<\/li>\n<li>\n<p><code>rsvd<\/code> \u2014 reserved bits,<\/p>\n<\/li>\n<li>\n<p><code>unimp<\/code> \u2014 unimplemented bits.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\/\u0437\u0430\u043f\u0438\u0441\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<ul>\n<li>\n<p><code>pre_write<\/code> \u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0438 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 \u044d\u0442\u043e\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440,<\/p>\n<\/li>\n<li>\n<p><code>post_write<\/code> \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043c\u0430\u0441\u043e\u043a \u0438 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f,<\/p>\n<\/li>\n<li>\n<p><code>post_read<\/code> \u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435.\u00a0<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u0412 \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u00ab\u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u044b\u0435\u00bb, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0435\u0437 \u043f\u043e\u043b\u0435\u0439:<\/p>\n<pre><code>\/* common gpio regs *\/ REG32(GPIO_QEMU_DATA,       0x00) REG32(GPIO_QEMU_SET,        0x04) REG32(GPIO_QEMU_CLEAR,      0x08) REG32(GPIO_QEMU_DIR_OUT,    0x0c)   \/* intr gpio regs *\/ REG32(GPIO_QEMU_ISTATUS,    0x10) REG32(GPIO_QEMU_EOI,        0x14) REG32(GPIO_QEMU_IEN,        0x18) REG32(GPIO_QEMU_RISEN,      0x1c) REG32(GPIO_QEMU_FALLEN,     0x20)<\/code><\/pre>\n<p>\u0425\u043e\u0442\u044f \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0438 \u0442\u0430\u043a\u0443\u044e \u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<pre><code>REG32(GPIO_QEMU_DATA,       0x00)     FIELD(GPIO_QEMU_DATA, PIN0, 0, 1)     FIELD(GPIO_QEMU_DATA, PIN1, 1, 1)     [...]     FIELD(GPIO_QEMU_DATA, PIN31, 31, 1)<\/code><\/pre>\n<p>\u041d\u043e \u044f \u0441\u0447\u0435\u043b \u044d\u0442\u043e \u043d\u0435\u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u043c.<\/p>\n<p>\u041a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0432 REG32 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 <code>RegisterAccessInfo<\/code>. \u042d\u0442\u0430 \u0444\u043e\u0440\u043c\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u0439 \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u044c\u044e:<\/p>\n<pre><code>static const RegisterAccessInfo mmio_gpio_regs_info[] = {     {         .name  = \"DATA\",         .addr  = A_GPIO_QEMU_DATA,         .reset = 0x00000000,         .ro    = 0xffffffff,     }, {         .name  = \"SET\",         .addr  = A_GPIO_QEMU_SET,         .reset = 0x00000000,         .pre_write = mmio_gpio_set,     }, {         .name  = \"CLEAR\",         .addr  = A_GPIO_QEMU_CLEAR,         .reset = 0x00000000,         .pre_write = mmio_gpio_clear,     }, {         .name  = \"DIROUT\",         .addr  = A_GPIO_QEMU_DIR_OUT,         .reset = 0x00000000,     }, {         .name = \"ISTATUS\",         .addr = A_GPIO_QEMU_ISTATUS,         .ro    = 0xffffffff,         .reset = 0x00000000,     }, {         .name = \"EOI\",         .addr = A_GPIO_QEMU_EOI,         .reset = 0x00000000,         .pre_write = mmio_gpio_intr_eoi,     }, {         .name = \"IEN\",         .addr = A_GPIO_QEMU_IEN,         .reset = 0x00000000,     }, {         .name = \"RISEN\",         .addr = A_GPIO_QEMU_RISEN,         .reset = 0x00000000,     }, {         .name = \"FALLEN\",         .addr = A_GPIO_QEMU_FALLEN,         .reset = 0x00000000,     }, };<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u043b\u043e\u043a:<\/p>\n<pre><code>static void gpio_instance_init(Object *obj) {     [...]     memory_region_init(&amp;s-&gt;mmio, obj,                        \"container.\"TYPE_GPIO, MMIO_GPIO_APERTURE_SIZE);       reg_array =         register_init_block32(DEVICE(obj), mmio_gpio_regs_info,                               ARRAY_SIZE(mmio_gpio_regs_info),                               s-&gt;regs_info, s-&gt;regs,                               &amp;mmio_mmio_ops, 0,                               MMIO_GPIO_APERTURE_SIZE);       memory_region_add_subregion(&amp;s-&gt;mmio, 0x0, &amp;reg_array-&gt;mem);     [...] }<\/code><\/pre>\n<blockquote>\n<p>\u041c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u043b\u043e\u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043a\u0430\u043a \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0440\u0435\u0433\u0438\u043e\u043d \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0430\u043f\u0435\u0440\u0442\u0443\u0440\u044b. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c &amp;reg_array-&gt;mem \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u043e\u043d \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432, \u0435\u0441\u043b\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u043c\u0438 \u0438\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0431\u043b\u043e\u043a\u0438 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><code>mmio_gpio_set()<\/code>,<\/p>\n<\/li>\n<li>\n<p><code>mmio_gpio_clear()<\/code>,<\/p>\n<\/li>\n<li>\n<p><code>mmio_gpio_intr_eoi()<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0441\u0435 \u043e\u043d\u0438 \u2014 <code>pre_write()<\/code>. \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u043b \u0432\u044b\u0448\u0435, \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 DATA \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 <code>Write To Clear (w1c)<\/code> \u0438 <code>Write To Set (w1s)<\/code>. \u0417\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u043b\u0438 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0431\u0438\u0442\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0443 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c 0, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0438 <code>SET<\/code>, \u043d\u0438 <code>CLEAR<\/code> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435 \u0445\u0440\u0430\u043d\u044f\u0442 \u2014 \u043e\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 <code>DATA<\/code>.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f <code>mmio_gpio_set()<\/code> \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>static uint64_t mmio_gpio_set(RegisterInfo *reg, uint64_t val) {     GpioState *s = GPIO(reg-&gt;opaque);     uint32_t val32 = val;     unsigned idx;       \/* for each bit in val32 set DATA *\/     idx = find_first_bit((unsigned long *)&amp;val32, s-&gt;nr_lines);     while (idx &lt; s-&gt;nr_lines) {         unsigned bit = test_and_set_bit32(idx, &amp;s-&gt;regs[R_GPIO_QEMU_DATA]);         if (!bit) {             qemu_irq_raise(s-&gt;output[idx]);         }           idx = find_next_bit((unsigned long *)&amp;val32, s-&gt;nr_lines, idx + 1);     }       return 0; }<\/code><\/pre>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e <code>mmio_gpio_clear()<\/code> \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043b\u0438\u0448\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<pre><code>static uint64_t mmio_gpio_clear(RegisterInfo *reg, uint64_t val)     [...]         unsigned bit = test_and_clear_bit32(idx, &amp;s-&gt;regs[R_GPIO_QEMU_DATA]);         if (bit) {             qemu_irq_lower(s-&gt;output[idx]);         }     [...] }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438<em> <\/em><code>qemu_irq_raise\/lower()<\/code> \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c: <code>reset<\/code> \u0434\u043b\u044f I2C-\u0434\u0430\u0442\u0447\u0438\u043a\u0430, LED, I2C Bitbang, SPGIO \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0445\u043e\u0434\/\u0432\u044b\u0445\u043e\u0434 \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0442\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 <code>mmio_gpio_intr_eoi()<\/code>:<\/p>\n<pre><code>static uint64_t mmio_gpio_intr_eoi(RegisterInfo *reg, uint64_t val) {     GpioState *s = GPIO(reg-&gt;opaque);     uint32_t val32 = val;     uint32_t changed = val32 &amp; s-&gt;regs[R_GPIO_QEMU_ISTATUS];       if (!changed) {         return 0;     }       s-&gt;regs[R_GPIO_QEMU_ISTATUS] &amp;= ~val32;     if (!s-&gt;regs[R_GPIO_QEMU_ISTATUS]) {         gpio_lower_irq(s);     }       return 0; }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 <code>GPIO_QEMU_ISTATUS<\/code> \u0440\u0430\u0432\u043d\u043e 0, \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>EOI<\/code> \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a <code>post_write()<\/code> \u043d\u0430<code> ISTATUS<\/code><em>,<\/em> \u0441\u0434\u0435\u043b\u0430\u0432 \u0435\u0433\u043e <code>.w1c = 0xffffffff<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0435 \u0441\u0432\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043a:<\/p>\n<pre><code>static void mmio_gpio_intr_eoi(RegisterInfo *reg, uint64_t val) {     GpioState *s = GPIO(reg-&gt;opaque);           if (!val) {         gpio_lower_irq(s);     } }<\/code><\/pre>\n<p>\u042f \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u044d\u0442\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0438\u0437-\u0437\u0430 \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f <code>qemu_irq_lower()<\/code> \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u0445. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 <code>qemu_irq_lower\/raise()<\/code><em> <\/em>\u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f GPIO-\u043c\u043e\u0434\u0435\u043b\u0438 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 PINMUX, \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u043d\u043e.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f MMIO \u0438 PCI \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f.<\/p>\n<h3>MMIO GPIO<\/h3>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443: \u0432 QEMU \u043d\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f MMIO-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435 \u043c\u0430\u0448\u0438\u043d\u044b:<\/p>\n<pre><code>\/\/  memmap[VIRT_MMIO_GPIO].base \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c 0x102000 \u0438 \u0430\u043f\u0435\u0440\u0442\u0443\u0440\u043e\u0439 0x1000 \/\/  GPIO_IRQ c \u043d\u043e\u043c\u0435\u0440\u043e\u043c 12 \u0432 RISC-V PLIC sysbus_create_simple(\"mmio-gpio\", memmap[VIRT_MMIO_GPIO].base,                      qdev_get_gpio_in(mmio_irqchip, GPIO_IRQ));<\/code><\/pre>\n<blockquote>\n<p>\u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0430\u0442\u0447, \u043d\u043e Xilinx \u043f\u043e\u0448\u0435\u043b \u0435\u0449\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0430\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 DTB (\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432, \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f compatible \u0438 TYPE). \u0412 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0430\u0442\u0447 \u0438 Xilinx \u044f \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u043b, \u043d\u043e \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043e\u0439\u0434\u0435\u0442 \u0438 \u0434\u043e \u043d\u0438\u0445.  <\/p>\n<\/blockquote>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u0443 \u0432\u0441\u0435\u0445 \u043c\u0430\u0448\u0438\u043d \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f DTB, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 DTB: <\/p>\n<pre><code>\/\/ mmio_gpio_add_fdt() \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435 \u0441\u0430\u043c\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \/\/ 32 - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0445\u043e\u0434\u043e\u0432 \u0432\u044b\u0445\u043e\u0434\u043e\u0432 mmio_gpio_add_fdt(&amp;virt_memmap[VIRT_MMIO_GPIO], GPIO_IRQ,                   irq_mmio_phandle, 32);<\/code><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c:<\/p>\n<pre><code>gpio@102000 {         gpio-controller;         ngpios = &lt;0x20&gt;;         interrupts = &lt;0x0c&gt;;         interrupt-parent = &lt;0x03&gt;;         compatible = \"qemu,mmio-gpio\";         reg = &lt;0x00 0x102000 0x00 0x400&gt;; };<\/code><\/pre>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 dts-\u0444\u0430\u0439\u043b, \u043b\u0438\u0431\u043e \u043a\u0430\u043a overlay \u0432 \u0443\u0436\u0435 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0432\u0448\u0435\u0435 \u044f\u0434\u0440\u043e. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u044f\u0434\u0440\u043e\u043c (\u043f\u0430\u0442\u0447 OF: DT-Overlay configfs interface (v8)):   <\/p>\n<pre><code># \/bin\/mount -t configfs none \/sys\/kernel\/config\/ # mkdir \/sys\/kernel\/config\/device-tree\/overlays\/gpio # cat gpio-mmio.dtb &gt; \/sys\/kernel\/config\/device-tree\/overlays\/gpio\/dtbo # gpiodetect gpiochip0 [102000.gpio] (32 lines)<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ACPI + ASL: \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432 QEMU \u0438\u043b\u0438 \u0438\u043d\u044a\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 \u044f\u0434\u0440\u043e. \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f.<\/p>\n<h3>PCI\/PCIe GPIO<\/h3>\n<p>\u042d\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 ivshmem, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c PCI-\u0448\u0438\u043d\u0430. \u0417\u0430\u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430:<\/p>\n<pre><code>$ build-qemu\/qemu-system-riscv64 -machine virt,aia=aplic-imsic [...] -device pcie-gpio [...]<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 QEMU (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d pcie-root-port, \u0447\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b hotplug):<\/p>\n<pre><code>$ build-qemu\/qemu-system-riscv64 -machine virt,aia=aplic-imsic [...] -device pcie-root-port,id=pcie.1 [...] (qemu) device_add pcie-gpio,bus=pcie.1<\/code><\/pre>\n<h2>\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f Linux<\/h2>\n<p>\u041d\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c QEMU, \u0430 \u043d\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f GPIO, \u043d\u043e \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435. \u0421 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u0430\u043a\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u0430\u043a <code>devm_regmap_add_irq_chip()<\/code> \u0438 <code>devm_gpio_regmap_register()<\/code>, \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u0438\u0447\u0435\u043c \u043c\u044b \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 <code>qgpio_pci_probe()<\/code>\/<code>qgpio_mmio_probe()<\/code> \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c regmap:<\/p>\n<pre><code>struct regmap *map;   map = devm_regmap_init_mmio(dev, regs, &amp;qgpio_regmap_config);<\/code><\/pre>\n<p>\u0415\u0433\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u0430\u043a \u0434\u043b\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439:<\/p>\n<pre><code>struct regmap_irq_chip_data *chip_data; struct regmap_irq_chip *chip;   chip-&gt;status_base = GPIO_QEMU_ISTATUS; chip-&gt;ack_base = GPIO_QEMU_EOI; chip-&gt;unmask_base = GPIO_QEMU_IEN; chip-&gt;num_regs = 1;   chip-&gt;irqs = qgpio_regmap_irqs; chip-&gt;num_irqs = ARRAY_SIZE(qgpio_regmap_irqs); chip-&gt;set_type_config = qgpio_mmio_set_type_config; chip-&gt;irq_drv_data = map;   err = devm_regmap_add_irq_chip(dev, map, irq, 0, 0, chip, &amp;chip_data);<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0438 \u0437\u0430\u0434\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f <code>qgpio_mmio_set_type_config()<\/code>. \u041a\u0430\u043a \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0432\u044b\u0448\u0435, \u0435\u0441\u043b\u0438 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0432\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043f\u043e 32 \u0431\u0438\u0442\u0430, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0434\u0432\u0443\u043c\u044f \u0431\u0438\u0442\u0430\u043c\u0438 (0 \u2014 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e, 1 \u2014 \u043f\u043e \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u043c\u0443 \u0444\u0440\u043e\u043d\u0442\u0443, 2 \u2014 \u043f\u043e \u0437\u0430\u0434\u043d\u0435\u043c\u0443 \u0444\u0440\u043e\u043d\u0442\u0443), \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 <code>regmap_irq_chip<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p>\u0422\u0430\u043a \u0438 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u0430\u043c\u0438\/\u0432\u044b\u0445\u043e\u0434\u0430\u043c\u0438:<\/p>\n<pre><code>struct gpio_regmap_config gpio_config = { 0 };   gpio_config.regmap = map; gpio_config.ngpio  = 32; gpio_config.reg_dat_base = GPIO_REGMAP_ADDR(GPIO_QEMU_DATA); gpio_config.reg_set_base = GPIO_REGMAP_ADDR(GPIO_QEMU_SET); gpio_config.reg_clr_base = GPIO_REGMAP_ADDR(GPIO_QEMU_CLEAR); gpio_config.reg_dir_out_base = GPIO_REGMAP_ADDR(GPIO_QEMU_DIR_OUT); gpio_config.irq_domain = regmap_irq_get_domain(chip_data);   return PTR_ERR_OR_ZERO(devm_gpio_regmap_register(dev, &amp;gpio_config));<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043c\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0438 \u043a\u043e\u0434 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043f\u043e\u0447\u0442\u0438 \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e <a href=\"https:\/\/github.com\/maquefel\/virtual_gpio_basic\/blob\/master\/virtual_gpio_basic.c\" rel=\"noopener noreferrer nofollow\">\u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 5.14<\/a>.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c GPIO \u0441 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439 QEMU, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c PCI-\u0448\u0438\u043d\u0430. \u0410 \u0435\u0441\u043b\u0438 \u0435\u0435 \u043d\u0435\u0442, \u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c GPIO \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e.<\/p>\n<p>\u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u043c\u044b \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u043e \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u043a\u0443 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p>\u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u0445\u043e\u0442\u044f\u0442 GPIO \u0432 \u0432\u0438\u0434\u0435 PCI \u0438\u043b\u0438 \u0447\u0443\u0436\u0435\u0440\u043e\u0434\u043d\u043e\u0439 \u0434\u043b\u044f SoC \u043c\u043e\u0434\u0435\u043b\u0438 MMIO \u2014 \u0438\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u043f\u043e \u0442\u0435\u043c \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0430\u043c, \u0447\u0442\u043e \u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435: aspeed, rpi, stm32, gd32 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435,<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043d\u0443\u0436\u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043e\u0442 GPIO \u0432\u043d\u0443\u0442\u0440\u0438 QEMU, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432\u0445\u043e\u0434\u043e\u0432\/\u0432\u044b\u0445\u043e\u0434\u043e\u0432,<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043d\u0443\u0436\u043d\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431 \u044d\u0442\u043e\u043c \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/925860\/\"> https:\/\/habr.com\/ru\/articles\/925860\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0422\u0435\u043c\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043c\u0435\u043d\u044f, \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u0443\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0440\u0430 \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0441\u043a\u0430\u0437\u043a\u0438. \u041f\u043e\u0447\u0442\u0438 \u0434\u0435\u0441\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 GPIO \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b QEMU. GPIO \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0432\u0437\u0432\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 (Weigh In Motion, WIM). \u0421 \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439, \u0430 \u044f \u2014 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0441\u0435\u043c. \u0418 \u0432\u043e\u0442 \u043a \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u043d\u0435\u043c\u0443 \u044e\u0431\u0438\u043b\u0435\u044e \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041d\u0438\u043a\u0438\u0442\u0430 \u0428\u0443\u0431\u0438\u043d, \u044f \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0421\u043d\u041a \u0432 <a href=\"https:\/\/www.yadro.com\/?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=GPIO_QEMU_P1_100725\" rel=\"noopener noreferrer nofollow\">YADRO<\/a>. \u041c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f GPIO \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0430 QEMU <abbr class=\"habraabbr\" title=\"Inter-VM Shared Memory\" data-title=\"&lt;p&gt;Inter-VM Shared Memory&lt;\/p&gt;\" data-abbr=\"ivshmem\">ivshmem<\/abbr> \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0430 \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0439 \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u0448\u0438\u043d\u043e\u0439 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c. \u042d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/303060\/\" rel=\"noopener noreferrer nofollow\">\u00ab\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 GPIO \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u0431\u0430\u0437\u0435 QEMU ivshmem \u0434\u043b\u044f Linux\u00bb<\/a>. \u0415\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0431\u044b\u043b\u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430:<\/p>\n<ul>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ivshmem \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u044b \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f,<\/p>\n<\/li>\n<li>\n<p>\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 GPIO \u0432\u043d\u0443\u0442\u0440\u0438 QEMU \u043d\u043e\u0441\u0438\u043b \u0441\u043a\u043e\u0440\u0435\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439, \u0447\u0435\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440,<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u044b\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0441 PCI-\u0448\u0438\u043d\u043e\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u044f\u0434\u0440\u0430 Linux \u0438 QEMU. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u044f \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0434\u043e\u043b\u0433\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e, \u043e \u0447\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<h2>\u041d\u043e\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 QEMU<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 ivshmem, \u0432\u0435\u0434\u044c \u043e\u043d \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438. \u0412 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u043f\u043e\u0448\u0435\u043b \u043f\u043e \u043f\u0443\u0442\u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043d\u0435 \u0441\u0442\u0430\u043b \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c QEMU \u2014 \u0434\u0435\u0441\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u043e \u0435\u0433\u043e \u0437\u043d\u0430\u043b. ivshmem \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u00ab\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u00bb, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 QEMU,<\/p>\n<\/li>\n<li>\n<p>\u0448\u0438\u043d\u044b PCI \u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 ivshmem \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u0430\u044f \u043c\u0435\u0436\u0434\u0443 QEMU \u0438 \u0445\u043e\u0441\u0442\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u044c, \u0442\u043e \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 GPIO \u043c\u044b \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043f\u0440\u0438\u0447\u0435\u043c \u0432 \u0434\u0432\u0443\u0445 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u0445: MMIO \u0438 PCI. \u0427\u0442\u043e\u0431\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u0430\u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0442\u0430\u043a \u0438 \u043c\u043e\u0434\u0435\u043b\u0438, \u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0418\u043c\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">DATA<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x00<\/p>\n<\/td>\n<td>\n<p align=\"left\">RO<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043e\u0432\/\u0432\u044b\u0445\u043e\u0434\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SET<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x04<\/p>\n<\/td>\n<td>\n<p align=\"left\">W1S<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0434\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u043a\u0430\u043a 1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CLEAR<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x08<\/p>\n<\/td>\n<td>\n<p align=\"left\">W1C<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u043a 0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">DIR_OUT<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x0c<\/p>\n<\/td>\n<td>\n<p align=\"left\">RW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043b\u0438\u043d\u0438\u044e \u043a\u0430\u043a \u0432\u044b\u0445\u043e\u0434<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ISTATUS<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x10<\/p>\n<\/td>\n<td>\n<p align=\"left\">RW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">EOI<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x14<\/p>\n<\/td>\n<td>\n<p align=\"left\">W1C<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">IEN<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x18<\/p>\n<\/td>\n<td>\n<p align=\"left\">RW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">RISEN<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x1c<\/p>\n<\/td>\n<td>\n<p align=\"left\">RW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u043c\u0443 \u0444\u0440\u043e\u043d\u0442\u0443<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">FALLEN<\/p>\n<\/td>\n<td>\n<p align=\"left\">0x20<\/p>\n<\/td>\n<td>\n<p align=\"left\">RW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0437\u0430\u0434\u043d\u0435\u043c\u0443 \u0444\u0440\u043e\u043d\u0442\u0443<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u043e\u0434 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 Linux \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0441\u0434\u0435\u043b\u0430\u0432 \u0442\u0438\u043f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0431\u0438\u0442\u043e\u0432\u043e\u043c \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430, \u0430 \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f. \u041d\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u0431\u044b \u043a \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044e \u0441\u0430\u043c\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 QEMU.<\/p>\n<blockquote>\n<p><strong>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/strong><\/p>\n<ul>\n<li>\n<p>qemu v10.0.0 c \u043c\u043e\u0434\u0435\u043b\u044c\u044e MMIO GPIO \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439 RISC-V virt,<\/p>\n<\/li>\n<li>\n<p>linux v6.12 c \u043f\u0430\u0442\u0447\u0430\u043c\u0438 \u0434\u043b\u044f dtb-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0439 \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c \u0434\u043b\u044f QEMU MMIO GPIO,<\/p>\n<\/li>\n<li>\n<p>\u0432\u0430\u043d\u0438\u043b\u044c\u043d\u044b\u0439 buildroot 2025.02.2.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/gitflic.ru\/project\/maquefel\/qemu-gpio-playground\" rel=\"noopener noreferrer nofollow\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442-\u043e\u0431\u0435\u0440\u0442\u043a\u0443<\/a>.<\/p>\n<\/blockquote>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b, \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u0430\u043c\u0438 \u0432 QEMU \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 WIM. \u041d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435 \u0447\u0435\u0440\u0435\u0437 \u0431\u043b\u043e\u043a \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f NAMUR \u043a \u0432\u0445\u043e\u0434\u0430\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u043a\u043e\u043b\u0435\u0441\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043e\u043c\/\u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043b\u0438\u043d\u0438\u0438 \u0432\u0445\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u043e\u0448\u0438\u0432\u043e\u043a \u0434\u043b\u044f:<\/p>\n<ul>\n<li>\n<p>\u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432,<\/p>\n<\/li>\n<li>\n<p>\u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u043b\u0430\u043c\u043f\u043e\u0447\u0435\u043a,<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0434\u0430\u0436\u0435 \u0442\u0430\u043a\u043e\u0439 \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u0438, \u043a\u0430\u043a \u0448\u0438\u043d\u0430 <abbr class=\"habraabbr\" title=\"Serial General-Purpose Input\/Output\" data-title=\"&lt;p&gt;Serial General-Purpose Input\/Output&lt;\/p&gt;\" data-abbr=\"SGPIO\">SGPIO<\/abbr>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0434\u043b\u044f \u044f\u0434\u0440\u0430 \u0438 rootfs \u044f \u0434\u0430\u043c, \u0430 \u0434\u043b\u044f QEMU \u2014\u00a0\u043d\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c QEMU \u0438 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b:<\/p>\n<pre><code>$ git clone https:\/\/gitflic.ru\/project\/maquefel\/qemu-gpio-playground $ git submodule update --init --depth 1 -- qemu $ make .build-qemu $ wget https:\/\/gitflic.ru\/project\/maquefel\/qemu-gpio-playground\/release\/037789b9-f059-409b-9087-df5fe92d6c5a\/be46609c-7755-4086-a92d-6d20a4fa3889\/download -O initramfs.cpio.xz $ wget https:\/\/gitflic.ru\/project\/maquefel\/qemu-gpio-playground\/release\/037789b9-f059-409b-9087-df5fe92d6c5a\/ad6d8ae3-6301-404d-9681-c263658d9da2\/download -O Image<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439 RISC-V virt \u0441 GPIO SYSBUS:<\/p>\n<pre><code>$ build-qemu\/qemu-system-riscv64 -machine virt -m 1G -kernel Image -initrd initramfs.cpio.xz -append \"root=\/dev\/ram\" -qmp unix:.\/qmp-sock,server,wait=off -nographic -serial mon:stdio   qemu-system-riscv64 # modprobe gpio-qemu qemu-system-riscv64 # gpioinfo gpiochip0 - 32 lines:         line   0:       unnamed                 input         line   1:       unnamed                 input         line   2:       unnamed                 input         line   3:       unnamed                 input         line   4:       unnamed                 input         line   5:       unnamed                 input         line   6:       unnamed                 input         line   7:       unnamed                 input         line   8:       unnamed                 input         line   9:       unnamed                 input         line  10:       unnamed                 input         line  11:       unnamed                 input         line  12:       unnamed                 input         line  13:       unnamed                 input         line  14:       unnamed                 input         line  15:       unnamed                 input         line  16:       unnamed                 input         line  17:       unnamed                 input         line  18:       unnamed                 input         line  19:       unnamed                 input         line  20:       unnamed                 input         line  21:       unnamed                 input         line  22:       unnamed                 input         line  23:       unnamed                 input         line  24:       unnamed                 input         line  25:       unnamed                 input         line  26:       unnamed                 input         line  27:       unnamed                 input         line  28:       unnamed                 input         line  29:       unnamed                 input         line  30:       unnamed                 input         line  31:       unnamed                 input<\/code><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0437\u0430\u0434\u0430\u0442\u044c \u0438\u043b\u0438 \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <strong>QMP<\/strong>. \u0422\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u0430\/\u0432\u044b\u0445\u043e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>host $ tools\/gpio-mmio-toggle.sh .\/qmp-sock 0 1 {\"QMP\": {\"version\": {\"qemu\": {\"micro\": 91, \"minor\": 2, \"major\": 9}, \"package\": \"v10.0.0-rc1-9-gc25d917239-dirty\"}, \"capabilities\": [\"oob\"]}} {\"return\": {}} {\"return\": {}}<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0443\u044e \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u00ab\u0433\u043e\u0441\u0442\u044f\u00bb:<\/p>\n<pre><code>qemu-system-riscv64 # gpiomon -c 0 0 5112.382098300  rising  gpiochip0 0 5115.131181200  falling gpiochip0 0<\/code><\/pre>\n<p>\u0421\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u0430\/\u0432\u044b\u0445\u043e\u0434\u0430:<\/p>\n<pre><code>qemu-system-riscv64 #  gpioset -c 0 0=1 host $ tools\/gpio-mmio-toggle.sh .\/qmp-sock 0 {\"QMP\": {\"version\": {\"qemu\": {\"micro\": 91, \"minor\": 2, \"major\": 9}, \"package\": \"v10.0.0-rc1-9-gc25d917239-dirty\"}, \"capabilities\": [\"oob\"]}} {\"return\": {}} {\"return\": 1}<\/code><\/pre>\n<h2>\u041c\u043e\u0434\u0435\u043b\u044c GPIO \u0434\u043b\u044f QEMU<\/h2>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c QEMU \u0432 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u0442\u044c MMIO \u0438 PCI. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u2014 \u0442\u043e\u0436\u0435 MMIO, \u043d\u043e \u0432 QEMU \u043e\u043d\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438.<\/p>\n<p>\u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u0435\u0440\u0434\u0446\u0430 \u043b\u044e\u0431\u043e\u0439 MMIO-\u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u0430\u043f\u0435\u0440\u0442\u0443\u0440\u044b.<\/p>\n<h3>\u0410\u043f\u0435\u0440\u0442\u0443\u0440\u0430 \u0438 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e<\/h3>\n<p>\u041a\u0430\u043a \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/877248\/\" rel=\"noopener noreferrer nofollow\">\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439<\/a>, \u043b\u044e\u0431\u043e\u0435 MMIO-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u2014 \u044d\u0442\u043e <strong>MemoryRegion<\/strong> \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0431\u044b\u043b \u0432\u0438\u0434\u0435\u043d <strong>CPU<\/strong> \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443, \u0442\u0430\u043a\u043e\u043c\u0443 \u043a\u0430\u043a <strong>DMA<\/strong>, \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u043c \u0434\u043b\u044f <strong>cpu0<\/strong>:<\/p>\n<pre><code>      0x0                                    0xffffffffffffffff       |------|------|------|------|------|------|------|------| 0:    [                    address-space: cpu-memory-0        ] 0:    [                    address-space: memory              ]                     0x102000           0x1023ff 0:                  [             gpio        ]<\/code><\/pre>\n<p>\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.qemu.org\/docs\/master\/devel\/memory.html#overlapping-regions-and-priority\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e QEMU<\/a>, \u044d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0442\u0430\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0430.<\/p>\n<p>\u0412 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435 QEMU:<\/p>\n<pre><code>(qemu) info mtree [...] address-space: cpu-memory-0 address-space: memory   0000000000000000-ffffffffffffffff (prio 0, i\/o): system     0000000000102000-00000000001023ff (prio 0, i\/o): gpio [...]<\/code><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0433\u0438\u043e\u043d \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u043c\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>static const MemoryRegionOps mmio_mmio_ops = {     .read = mmio_gpio_register_read_memory,     .write = mmio_gpio_register_write_memory,     .endianness = DEVICE_NATIVE_ENDIAN,     .valid = {         .min_access_size = 4,         .max_access_size = 4,     }, };   [...] memory_region_init_io(iomem, obj, &amp;mmio_mmio_ops, s,                       \"gpio\", APERTURE_SIZE); [...]<\/code><\/pre>\n<p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 Load\/Store \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>mmio_gpio_register_read_memory()<\/code>\/<code>mmio_gpio_register_write_memory()<\/code> \u043f\u0440\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0430 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. <\/p>\n<pre><code>static uint64_t mmio_gpio_register_read_memory(void *opaque, hwaddr addr, unsigned size); static void mmio_gpio_register_write_memory(void *opaque, hwaddr addr, uint64_t value, unsigned size);<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e <strong>hwaddr addr<\/strong> \u2014 \u044d\u0442\u043e \u0430\u0434\u0440\u0435\u0441 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430, \u0430 \u043d\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441.<\/p>\n<p>\u041d\u0430\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d \u0432 \u0444\u0430\u0439\u043b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b:<\/p>\n<pre><code>gpio = qdev_new(TYPE_MMIO_GPIO); sysbus_mmio_map(SYS_BUS_DEVICE(gpio), 0, ADDRESS);<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c <code>ADDRESS<\/code>\u2014 \u044d\u0442\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0430 <code>TYPE_MMIO_GPIO<\/code> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435: <\/p>\n<pre><code>#define TYPE_MMIO_GPIO \"mmio-gpio\"<\/code><\/pre>\n<h3>mmio_gpio_register_read_memory()\/mmio_gpio_register_write_memory() <\/h3>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u0435\u0440\u0442\u0443\u0440\u044b. \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\/\u0437\u0430\u043f\u0438\u0441\u044c \u0435\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u0412 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u0430\/\u0432\u044b\u0445\u043e\u0434\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438. \u0422\u043e\u0433\u0434\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>static void mmio_gpio_register_write_memory(void *opaque, hwaddr addr,                                             uint64_t value, unsigned size) {   uint32_t val32 =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-467424","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467424","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=467424"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467424\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467424"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467424"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467424"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}