{"id":3187,"date":"2017-06-28T10:09:27","date_gmt":"2017-06-28T09:09:27","guid":{"rendered":"https:\/\/www.inovex.de\/blog\/?p=3187"},"modified":"2026-03-17T08:32:48","modified_gmt":"2026-03-17T07:32:48","slug":"migrating-an-embedded-android-setup-kernel-driver","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/","title":{"rendered":"Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)"},"content":{"rendered":"<p>After <a href=\"https:\/\/www.inovex.de\/blog\/migrating-an-embedded-android-setup-part-1\/\" target=\"_blank\" rel=\"noopener\">getting the display up and running<\/a>, we&#8217;ll have a look at the kernel drivers. It would be way too much work describing each kernel driver in detail, so I will concentrate on the changes needed to port them to the newer kernel version, 3.14 to be exact. A more thorough introduction to the sensor driver and the whole sensor integration can be found <a href=\"https:\/\/www.inovex.de\/blog\/android-sensor-integration-part-1-sensor-stack-and-kernel-module\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>. Of course I learned a lot since I wrote my previous series of articles so I improved the driver quite a bit. Both devices are connected to the Wandboard via the I2C-bus, so they are working really similar at this level. Just controlling it, reading data and sleep management differs for each device.<\/p>\n<p><!--more--><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-3214\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/lcd-1024x768.jpg\" alt=\"The LCD in question\" width=\"800\" height=\"600\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/lcd-1024x768.jpg 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/lcd-300x225.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/lcd-768x576.jpg 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/lcd-1536x1153.jpg 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/lcd-400x300.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/lcd-360x270.jpg 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/lcd.jpg 1675w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>Let&#8217;s continue with the changes we needed to apply to port each driver to the newer kernel version 3.14. In total, there are three drivers, one for the ultrasonic sensor, one for the Grove LCD RGB backlight and one for its text. As an example, we&#8217;ll use the RGB backlight driver.<\/p>\n<p>The first issue is ARM-related. Almost every single board has another layout, other interfaces available and nothing has defined addresses as compared to x86. Older Linux Kernels used so-called board description files, hard coded to the specific board kernel to handle this situation. But because that method is quite inflexible and each board needs a unique, non-reusable kernel, the device tree has now replaced it.<\/p>\n<p>The idea behind the device tree is to be able to use one Linux Kernel compiled for ARM (e.g. v7) on each board with dynamically loadable files describing the board\u2019s hardware interfaces, connected devices and so on. It is a very interesting and powerful system that enables you, amongst others, to expand or change a development board&#8217;s connections at run-time with so called device tree overlays. In short, that means it is e.g. possible to enable or disable an UART port <a href=\"https:\/\/www.inovex.de\/blog\/enhancing-a-device-tree-for-arm-cpus\/\" target=\"_blank\" rel=\"noopener noreferrer\">without rebooting the board<\/a>.<\/p>\n<p>This also influences the way we match our I2C devices with the right drivers. Luckily, the changes are small and easy to understand.<\/p>\n<pre class=\"lang:c decode:true \">static struct i2c_board_info mxc_i2c2_board_info[] __initdata = {\r\n\r\n\t{\r\n\r\n\t\tI2C_BOARD_INFO(\"rgb1313M1\", 0x62),\r\n\r\n\t},\r\n\r\n};<\/pre>\n<p>This is a snippet from an old board description file, describing a fixed allocation between I2C bus no. 2, the I2C device with the address 0x62 and a driver with the name &#8222;rgb1313M1&#8220;.<\/p>\n<p>In the device tree system, this structure moved into the driver file, while driver\u2019s init function get extended by this parts:<\/p>\n<pre class=\"lang:c decode:true \"> \/\/ static int __init rgb1313M1_init(void)\r\n\r\nadapter = i2c_get_adapter(1);\r\n\r\nif (adapter == NULL) {\r\n\r\n\tPRINT (\"- i2c_get_adapter failed\");\r\n\r\n\tgoto exit_i2c_get_adapter;\r\n\r\n}\r\n\r\nrgb1313M1_client = i2c_new_device (adapter, &amp;info_62);\r\n\r\nif (rgb1313M1_client == NULL) {\r\n\r\n\tgoto exit_i2c_get_adapter;\r\n\r\n}<\/pre>\n<p>The first one indicates the I2C bus we hope to find in the device, the second one matches the information about the device\u2019s address, the right driver and the right I2C bus. This bus information was previously coded in the board description file at the board info structure. You see, to change something at this point, less files than before need to be touched. In my opinion, the device tree is a significant improvement as long as you do not have to modify it.<\/p>\n<h2>Sleep, where did you go?<\/h2>\n<p>The second, really big change in kernel space depends on sleep management. As you may know, there were significant modifications in Android 5 and 6 regarding this issue, but especially in the kernel everything depending on sleep changed.<\/p>\n<p>If you missed this development, you may ask yourself what happened to the old android power management system. It seems everything sleep related vanished.<\/p>\n<p>Previously, we had earlysuspend as a exclusive power management system in the Android kernel patch set. After the power management was completely rewritten, we now use runtime_pm infrastructure for all kernel related power management. With this, we got a consistent power management for both, Linux and Android, which is more flexible than earlysuspend. Because runtime_pm is not able to handle power management while a device is in use, there is a setInteractive hook in the HAL (Hardware Abstraction Layer) power module that could be used. Our use case however only requires runtime_pm, so I will just write about the kernel space changes. If you are more interested in the power management changes, just look at these sources:<\/p>\n<ul>\n<li><a href=\"https:\/\/plus.google.com\/111524780435806926688\/posts\/RCV8EP3hFEm\" target=\"_blank\" rel=\"noopener noreferrer\">Post by John Stultz<\/a><\/li>\n<li><a href=\"http:\/\/git.kernel.org\/cgit\/linux\/kernel\/git\/torvalds\/linux.git\/plain\/Documentation\/power\/devices.txt\" target=\"_blank\" rel=\"noopener noreferrer\">Devices documentation<\/a><\/li>\n<li><a href=\"http:\/\/git.kernel.org\/cgit\/linux\/kernel\/git\/torvalds\/linux.git\/plain\/Documentation\/power\/runtime_pm.txt\" target=\"_blank\" rel=\"noopener noreferrer\">runtime_pm documentation<\/a><\/li>\n<\/ul>\n<p>The old system needed a lot of preprocessor directives due to being a patch set exclusively for Android. Instead of this, runtime_pm is used in both, Linux and Android, and we do not have to implement a complete fallback system.<\/p>\n<p>With a structure, we specify pointers to the implemented suspend\/resume functions. The whole power management for our driver is activated in its probe function. While it is not very impressive, at least it is clearer than earlysuspend. The tricky part is that runtime_pm works like a queue. Any instance that operates on the driver is registered in the queue. As long as this queue is not empty, the driver stays awake. Once an instance releases the driver, it tests if the queue is empty. If that is the case, the suspend function is called and the driver goes to sleep. You can take a look at this below.<\/p>\n<pre class=\"lang:c decode:true \" title=\"Power management\">static const struct dev_pm_ops rgb1313M1_pm_ops = {\r\n\r\n\t.suspend           = rgb1313M1_suspend,\r\n\r\n\t.resume            = rgb1313M1_resume,\r\n\r\n\t.runtime_suspend   = rgb1313M1_runtime_suspend,\r\n\r\n\t.runtime_resume    = rgb1313M1_runtime_resume,\r\n\r\n};<\/pre>\n<pre class=\"lang:c decode:true \" title=\"Probe Function\"> \/* enable runtime powermanagement *\/\r\n\r\npm_runtime_enable (&amp;client-&gt;dev);\r\n\r\n\/* Remove Function: *\/\r\n\r\n    pm_runtime_disable (&amp;client-&gt;dev);\r\n\r\nstatic int rgb1313M1_runtime_suspend (struct device *dev) {\r\n\r\n    struct i2c_client *client;\r\n\r\n\tclient = to_i2c_client (dev);\r\n\r\n\tdisplay_off (client);\r\n\r\n\treturn 0;\r\n\r\n}<\/pre>\n<pre class=\"lang:c decode:true \" title=\"Waking up\/increase queue (in open):\">pm_runtime_get_sync (&amp;rgb1313M1_client-&gt;dev);\r\n\r\n\/* Going to sleep if queue is empty (last device released driver (in release)): *\/\r\n\r\npm_runtime_put_sync_suspend (&amp;rgb1313M1_client-&gt;dev);\r\n\r\nstatic int rgb1313M1_runtime_resume (struct device *dev) {\r\n\r\n    struct i2c_client *client;\r\n\r\n\tclient = to_i2c_client (dev);\r\n\r\n\tdisplay_on (client);\r\n\r\n\treturn 0;\r\n\r\n}<\/pre>\n<h2>Read on<\/h2>\n<p>In the next article we&#8217;ll have a look at HAL and Android itself. In the meantime, have a look at our <a href=\"https:\/\/www.inovex.de\/en\/our-services\/smart-devices-robotics\/\" target=\"_blank\" rel=\"noopener noreferrer\">Smart Devices division<\/a> and learn how you can join us as a software developer.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>After getting the display up and running, we&#8217;ll have a look at the kernel drivers. It would be way too much work describing each kernel driver in detail, so I will concentrate on the changes needed to port them to the newer kernel version, 3.14 to be exact. A more thorough introduction to the sensor [&hellip;]<\/p>\n","protected":false},"author":35,"featured_media":13054,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[74],"service":[420],"coauthors":[{"id":35,"display_name":"Anna-Lena Marx","user_nicename":"amarx"}],"class_list":["post-3187","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-iot","service-apps"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)\" \/>\n<meta property=\"og:description\" content=\"After getting the display up and running, we&#8217;ll have a look at the kernel drivers. It would be way too much work describing each kernel driver in detail, so I will concentrate on the changes needed to port them to the newer kernel version, 3.14 to be exact. A more thorough introduction to the sensor [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2017-06-28T09:09:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-17T07:32:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2300\" \/>\n\t<meta property=\"og:image:height\" content=\"876\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Anna-Lena Marx\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting-1024x390.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Anna-Lena Marx\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"5\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Anna-Lena Marx\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/\"},\"author\":{\"name\":\"Anna-Lena Marx\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/b7d6fd8c3ec8972f3b14f0205e25d022\"},\"headline\":\"Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)\",\"datePublished\":\"2017-06-28T09:09:27+00:00\",\"dateModified\":\"2026-03-17T07:32:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/\"},\"wordCount\":886,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg\",\"keywords\":[\"IoT\"],\"articleSection\":[\"Applications\",\"English Content\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/\",\"url\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/\",\"name\":\"Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg\",\"datePublished\":\"2017-06-28T09:09:27+00:00\",\"dateModified\":\"2026-03-17T07:32:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#primaryimage\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg\",\"width\":2300,\"height\":876,\"caption\":\"Porting an Android Embedded Setup\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.inovex.de\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.inovex.de\/de\/#website\",\"url\":\"https:\/\/www.inovex.de\/de\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.inovex.de\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\/\/www.inovex.de\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/inovexde\",\"https:\/\/x.com\/inovexgmbh\",\"https:\/\/www.instagram.com\/inovexlife\/\",\"https:\/\/www.linkedin.com\/company\/inovex\",\"https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/b7d6fd8c3ec8972f3b14f0205e25d022\",\"name\":\"Anna-Lena Marx\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/a8cfb531252ec2ef604ef3033c45111b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/44ab0d3916e62a17054b8e4cea92702db304b9dcb6dd28fb9915484c1830409b?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/44ab0d3916e62a17054b8e4cea92702db304b9dcb6dd28fb9915484c1830409b?s=96&d=retro&r=g\",\"caption\":\"Anna-Lena Marx\"},\"url\":\"https:\/\/www.inovex.de\/de\/blog\/author\/amarx\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/","og_locale":"de_DE","og_type":"article","og_title":"Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)","og_description":"After getting the display up and running, we&#8217;ll have a look at the kernel drivers. It would be way too much work describing each kernel driver in detail, so I will concentrate on the changes needed to port them to the newer kernel version, 3.14 to be exact. A more thorough introduction to the sensor [&hellip;]","og_url":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2017-06-28T09:09:27+00:00","article_modified_time":"2026-03-17T07:32:48+00:00","og_image":[{"width":2300,"height":876,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg","type":"image\/jpeg"}],"author":"Anna-Lena Marx","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting-1024x390.jpg","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Anna-Lena Marx","Gesch\u00e4tzte Lesezeit":"5\u00a0Minuten","Written by":"Anna-Lena Marx"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/"},"author":{"name":"Anna-Lena Marx","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/b7d6fd8c3ec8972f3b14f0205e25d022"},"headline":"Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)","datePublished":"2017-06-28T09:09:27+00:00","dateModified":"2026-03-17T07:32:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/"},"wordCount":886,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg","keywords":["IoT"],"articleSection":["Applications","English Content","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/","url":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/","name":"Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg","datePublished":"2017-06-28T09:09:27+00:00","dateModified":"2026-03-17T07:32:48+00:00","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg","width":2300,"height":876,"caption":"Porting an Android Embedded Setup"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-kernel-driver\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Migrating an embedded Android setup: Porting the Kernel Driver (Part 2)"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/b7d6fd8c3ec8972f3b14f0205e25d022","name":"Anna-Lena Marx","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/a8cfb531252ec2ef604ef3033c45111b","url":"https:\/\/secure.gravatar.com\/avatar\/44ab0d3916e62a17054b8e4cea92702db304b9dcb6dd28fb9915484c1830409b?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/44ab0d3916e62a17054b8e4cea92702db304b9dcb6dd28fb9915484c1830409b?s=96&d=retro&r=g","caption":"Anna-Lena Marx"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/amarx\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/3187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=3187"}],"version-history":[{"count":2,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/3187\/revisions"}],"predecessor-version":[{"id":66573,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/3187\/revisions\/66573"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/13054"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=3187"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=3187"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=3187"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=3187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}