Open Source, Open Hardware 17.3" touch screen smart display, based on the 96boards Dragonboard 410c
One last update, I haven't fully gone down this path yet, but while I started this project and delayed completing it for the past few years, there have been some very interesting boards which have come out which might make it possible to do eDP directly from a CPU instead of requiring a bridge IC to get me there. One option I am exploring is using a Nvidia Jetson Nano to directly connect to an LCD, and to take it to the next level, it is possible to connect it directly to a 4k LCD, with 16.7M color vs the 262k color of the current 1080p screen I am using. I am still planning on doing some 3d prints with the 1080p design for validation and effects, but I think a Gen2 of this design will include a much nicer 4k display, and cost lest in the long run, not needing the bridge and clock chips needed with this current design.
If anyone wanted to build the software for the Dragonboard 410c, the build instructions for AOSP master are posted here:
From this, I wasn't able to get the android source code to generate a boot.img which contained the correct ramdisk and image.gz-dtb file. In order to make this happen, I found an old boot.img here:
and from this I was able to use the mkbootimg tools to replace the kernel file and ramdisk folder within the boot.img with the one generated from the source code.
Once I did all this, I was able to boot into AOSP master (latest and greatest android) [Thanks to linaro for keeping this board going], but the HDMI output was being used instead of the on board DSI through the External High Speed connector.
With a few changes to the code, removing the HDMI related stuff, and adding the LCD panel I used and the SN65DSI86 kernel driver from the mainline linux kernel and fixing some USB handling for OTG and device changes, I was able to have the part configure itself and output directly to the Innolux LCD.
All kernel changes can be found in my github here:
Created a 3d model of the display frame, unfortunately the 3D printer I have (Ender 3) isn't big enough to print the entire thing as 1, so I sectioned it into 4 segments. There will be some cover plates that go on the back, but this should hold the prototype for now. More variants to come at a later point, but at least it won't be all over my desk in pieces.
Finally got the kernel module ported over for the SN65DSI86. Added the Innolux N173HCE-E31 panel added to the kernel as well and updated the device tree files to enable the bridge kernel driver. Need to create the pwm controller code for the bridge driver. Will probably work on the mechanical model a bit more before doing any other software stuff at this point.
So when I first started this project, the intent was to create a smart display which could be mounted to the wall, or even be propped on a kitchen counter or desk. The other thing I wanted as a feature for the project which makes this different than what has already been done is the user control aspect of it. Most smart displays as I have seen them are just an LCD and CPU. I wanted to include touch screen capabilities, so interacting with the display would be possible, for things like adding tasks for todo lists, calendar information viewing/additions, etc.
So knowing the type of product I wanted to make, the first thing that needed to be figured out was the size of the LCD to be used. The LCD is the main design component that the rest of the design will revolve around, from size, display resolution the GPU needs to support, the interface to the CPU as well as power input requirements. From my research, I can categorize LCD panels into 3 functional groups based on size, but each having unique and different characteristics. The 3 groups are Mobile (4-10"), Laptop (11-19"), Monitor/TV (>20"). The Mobile displays are cheapest purely due to size, varying in resolution up to 2k displays, typically using MIPI DSI interface, and some can come with embedded touch capabilities. The laptop displays become much more expensive, resolutions up to 4k, typically eDP (embedded display port) or LVDS interface (most new displays are eDP), and these can also come with embedded touch capabilities. Lastly, the large displays used in monitors and TVs. These are the most expensive, at some points making it not worth just buying the LCD vs buying a whole new built display, have resolutions up to 4k, typically use LVDS interface, and I did not find any with embedded touch capabilities.
From the research, and intent for the display, the Laptop display region is where I started to target, as most products in this space tend to support the design criteria I was targeting. The large Monitor/TV displays were too large for my use, and cost way to much. The mobile displays (other than maybe the 10" realm) was too small to see things from across the room when mounted to a wall. So targeting the Laptop displays put me in the 720p/1080p resolutions (I planned to go with 1080p for better pixel quality), need for eDP display output to the LCD, a GPU capable of outputting 1080p resolutions, and 12V voltage for the display. After searching through availability, and various LCD comparison charts, I settled on starting with the Innolux N173HCE-E31, which is a 17.3" 1080p IPS LCD screen with a 2 lane EDP interface through an I-PEX 30 pin interface, and 6-bit color control, and was readily available on Amazon and Ebay
Now that the LCD was known, next to pick out was the CPU board. First place I thought about was going with a Raspberry Pi, which has the power for high resolution displays, is extremely affordable, and has a huge community behind it. Unfortunately, HDMI to eDP interfaces don't exist in 1 interface. The only solution I found was to take HDMI->LVDS->eDP which is a hack in my mind, not a real solution. Finding out this, I needed to find a CPU board with one of the following display output interfaces: eDP, LVDS, or MIPI DSI. There exist ICs to convert LVDS or DSI to eDP so targeting the one IC approach, these were my options. Most CPUs which support eDP natively are x86 based CPUs, which tend to be more expensive than ARM alternatives, so I started looking at ARM based SOM boards, such as the UDOO NEO, which runs an i.MX6 CPU. My first prototype used this board with a cheap ebay HDMI to eDP adapter. Unfortunately there were a few issues with this: low GPU performance (lag, only supports 720p resolutions), poor Android support. The board I ended up using for this design is the Dragonboard 410c. It uses a Qualcomm APQ8016E...Read more »
With the addition of some USB base patches, touch screen functionality and USB functionality now works, planning to create a git repository at some point to track the changes as functionality works
Got Android Q booting up on the Dragonboard 410c, with a few issues, like USB not working so touch screen is not functional, debating rolling back to marshmallow for function support, but external LCD is working properly