adrb Posted July 5, 2017 Share Posted July 5, 2017 It's simple guide, presenting how to setup LCD (ili9431) with integrated touchscreen (tsc2046) on mainline kernel (4.11). It may be not fully "armbian way", since I'm pretty new in armbian In case that somebody is interested, I recently bought couple those displays from here Few basic informations: 1. OrangePiZero has two SPI buses. First one is usually occupied by build in memory. So we can only use bus1 2. tsc2046 chip is fully compatible with ads7846, and we have drivers for it since years now 3. Maximum clock frequency for ads7846 is 3.25Mhz, but don't expect that it will work with that. Reasonable value is something beetween 0.5-2Mhz. Lower frequency, if you observing misbehavior. 4. Probably most important information ili9431 and tsc2046 poorly cooperate on shared bus. I don't know exactly why, because I don't have access to logic analyzer, but it's proven fact (at least on my equipment). You have to lower bus frequency to 2MHz (highest common value), and even then it work very unstable. My educated guess is that, missed interrupt from touchscreen (when SPI is busy with sending data to LCD) makes it stop making further attempts to communicate. Or maybe there is some incompatibility on electrical level, I really don't know. 5. My electrical setup (keep in mind it's 3.3V) OPIZ - LCD (ili9431) PA13 - CS PA14 - SCK PA16 - SDO PA15 - SDI PA03 - DC PA00 - RESET PA06 - controls transistor which is driving current to LCD pin. You may also connect LCD pin to VCC, and leave PA06 floating. And here is part for touchscreen. We are going to use emulated spi bus with bitbang. At this point bitbang isn't compiled in armbian kernel - we will take care of this later. OPIZ - LCD (tsc2046) PA10 - T_CS PA18 - T_IRQ PA19 - T_CLK PA11 - T_DIN PA12 - T_DO Configuration for the first spi bus: Spoiler /* author: Adrian Brzezinski: adrb at wp.pl, adrian.brzezinski at adrb.pl */ /dts-v1/; /plugin/; / { compatible = "allwinner,sun8i-h3"; fragment@0 { target-path = "/aliases"; __overlay__ { spi1 = "/soc/spi@01c69000"; }; }; fragment@1 { target = <&spi1>; __overlay__ { status = "okay"; spidev { compatible = "spidev"; reg = <0>; spi-max-frequency = <50000000>; }; }; }; }; Configuration for touchscreen driver: Spoiler /* author: Adrian Brzezinski: adrb at wp.pl, adrian.brzezinski at adrb.pl */ /dts-v1/; /plugin/; / { compatible = "allwinner,sun8i-h3"; fragment@0 { target-path = "/aliases"; __overlay__ { spi2 = "/spi2"; }; }; fragment@1 { target-path = "/"; __overlay__ { spi2 { compatible = "spi-gpio"; #address-cells = <0x1>; ranges; gpio-sck = <&pio 0 19 0>; // PA19 gpio-mosi = <&pio 0 11 0>; // PA11 gpio-miso = <&pio 0 12 0>; // PA12 cs-gpios = <&pio 0 10 1>; // PA10 num-chipselects = <1>; status = "okay"; ads7846@0 { compatible = "ti,ads7846"; reg = <0>; /* Chip Select 0 */ status = "okay"; spi-max-frequency = <500000>; interrupt-parent = <&pio>; interrupts = <0 18 2>; /* PA18, IRQ_TYPE_EDGE_FALLING */ pendown-gpio = <&pio 0 18 2>; /* PA18, IRQ_TYPE_EDGE_FALLING */ vcc-supply = <®_vcc3v3>; ti,pressure-min = /bits/ 16 <0>; ti,pressure-max = /bits/ 16 <0xfff>; ti,x-plate-ohms = /bits/ 16 <40>; wakeup-source; /* swap axis if LCD has been rotated by 90 or 270 degrees */ //ti,swap-xy = <1>; //* ti,x-min = /bits/ 16 <0>; ti,y-min = /bits/ 16 <0>; ti,x-max = /bits/ 16 <0xffff>; ti,y-max = /bits/ 16 <0xffff>; //*/ }; }; }; }; }; Compile and add those DTS with "armbian-add-overlay" command. Next, download armbian sources and cross compile kernel - without any modifications, just to make sure that everything is compiling without issues: # mkdir armbian # cd armbian # git clone https://github.com/armbian/build.git # git clone https://github.com/igorpecovnik/lib # cp lib/compile.sh . # ./compile.sh BRANCH=dev BOARD=orangepizero KERNEL_ONLY=yes PROGRESS_DISPLAY=plain RELEASE=jessie Enable required modules : echo "CONFIG_SPI_BITBANG=m" >> lib/config/kernel/linux-sun8i-dev.config echo "CONFIG_SPI_GPIO=m" >> lib/config/kernel/linux-sun8i-dev.config ... and recompile kernel, then install deb packages from output directory. You may also copy drivers, it may be faster for testing but it's not advised for "serious" deployment. Loading modules at startup: # cat > /etc/modprobe.d/fb_ili9341.conf << _EOF_ options fbtft_device custom name=fb_ili9341 gpios=dc:3,reset:0,led:6 speed=16000000 busnum=1 _EOF_ # echo fbtft_device >> /etc/modules # echo ads7846 >> /etc/modules If you connected LED pin to VCC, then you should omit that ",led:6" in configuration above. I hope that this will help anyone who want to connect LCD display and build simple touchscreen based Orange Pi Zero terminal Spoiler ps: I'ts late and i'm tired so im preety sure that there is a bunch of grammatical errors :/ 7 Link to comment Share on other sites More sharing options...
km1kze Posted September 18, 2017 Share Posted September 18, 2017 Hi adrb, I see that you have some experience with SPI LCDs. Can you please tell me if is possible to mirror the framebuffer, similar like fbcp is doing for Raspberry? https://github.com/tasanakorn/rpi-fbcp And here some explanation: https://github.com/notro/fbtft/wiki/Framebuffer-use#framebuffer-mirroring Thank you Link to comment Share on other sites More sharing options...
adrb Posted September 28, 2017 Author Share Posted September 28, 2017 I don't know if it will work similar as fbcp, but It's possible. Link to comment Share on other sites More sharing options...
DoubleHP Posted January 16, 2018 Share Posted January 16, 2018 On 06/07/2017 at 1:35 AM, adrb said: Compile and add those DTS with "armbian-add-overlay" command. Where do we store those files ? Which directory ? which file name ? Which compiler should be use ? What's the compile command ? What you are quoting is not any of the 12 languages I know (x86 ASM, ARM ASM, Saturn ASM, C, C++, Bash, Shell, Perl, Python, Prolog, VHDL ... ) Link to comment Share on other sites More sharing options...
DoubleHP Posted January 16, 2018 Share Posted January 16, 2018 After reading https://docs.armbian.com/Hardware_Allwinner_overlays/ I have tried: # aptitude install linux-headers-sun8i # aptitude install linux-headers-dev-sun8i # armbian-add-overlay myili9431.dts Kernel headers are not installed properly. Please install the kernel headers package # uname -r 4.13.16-sunxi so in short, Armbian does not provide any package header for the default kernel ... EDIT: after a good sleep, I have found the right kernel-headers: # dpkg -S /boot/vmlinuz-4.13.16-sunxi linux-image-next-sunxi: /boot/vmlinuz-4.13.16-sunxi # aptitude install linux-headers-next-sunxi I have stored your first bit of code in /root/myili9431.dts: # armbian-add-overlay myili9431.dts Compiling the overlay Error: myili9431.dts:29.1-6 syntax error FATAL ERROR: Unable to parse input tree Error compiling the overlay After removing the very last line "EOF": # armbian-add-overlay myili9431.dts Compiling the overlay Copying the compiled overlay file to /boot/overlay-user/ Reboot is required to apply the changes So please edit your initial post and remove that EOF thing. I don't plan on using the touch layer, so, I am not going to break my mind on that part. Now comes the second big issue: # ./compile.sh BRANCH=dev BOARD=orangepizero KERNEL_ONLY=yes PROGRESS_DISPLAY=plain RELEASE=jessie Error: missing build directory structure Please clone the full repository https://github.com/armbian/build/ # ls build compile.sh lib I have cloned this twice, and it's still asking me to clone it. Link to comment Share on other sites More sharing options...
DoubleHP Posted January 17, 2018 Share Posted January 17, 2018 In the end, what worked for me: 0: my system: "ARMBIAN 5.35 user-built Debian GNU/Linux 8 (jessie) 4.13.16-sunxi" (called next) 1: I am not going to try using the touch layer. 2: wire things as described (with LED directly on 3.3V) 3: aptitude install linux-headers-next-sunxi 4: copy the content of "Configuration for the first spi bus" from initial post, except last line about EOF, into /root/myili9431.dts 5: armbian-add-overlay myili9431.dts 6: edit /boot/armbianEnv.txt and edit this line (some parts may be useless or overkill) overlays=usbhost2 usbhost3 spi-spidev spidev myili9431 (this appeared to be useless) 7: reboot 8: modprobe fbtft_device custom name=fb_ili9341 gpios=dc:3,reset:0,led:6 speed=16000000 busnum=1 ... and immediately the LCD turned from all white, into classic console (black background with prompt at the top) Here is my dmesg: [ 166.951033] fbtft: module is from the staging directory, the quality is unknown, you have been warned. [ 166.962129] fbtft_device: module is from the staging directory, the quality is unknown, you have been warned. [ 166.967576] fbtft_device: GPIOS used by 'fb_ili9341': [ 166.967602] fbtft_device: 'dc' = GPIO3 [ 166.967627] fbtft_device: 'reset' = GPIO0 [ 166.967649] fbtft_device: 'led' = GPIO6 [ 166.967703] spi spi1.0: fb_ili9341 spi1.0 16000kHz 8 bits mode=0x00 [ 166.983929] fb_ili9341: module is from the staging directory, the quality is unknown, you have been warned. [ 167.341354] Console: switching to colour frame buffer device 30x40 [ 167.344793] graphics fb0: fb_ili9341 frame buffer, 240x320, 150 KiB video memory, 16 KiB buffer memory, fps=20, spi1.0 at 16 MHz https://kaspars.net/blog/linux/spi-display-orange-pi-zero mentions rotate=90 ... could be usefull for someone 9: xinit worked immediately 1 Link to comment Share on other sites More sharing options...
Kevin Wietzorek Posted March 19, 2018 Share Posted March 19, 2018 On 6.7.2017 at 1:35 AM, adrb said: ./compile.sh BRANCH=dev BOARD=orangepizero KERNEL_ONLY=yes PROGRESS_DISPLAY=plain RELEASE=jessie @adrb First of all thanks for your instructions, but if I try to use the compile script in my folder where I copied it, I get the following message: ./compile.sh BRANCH=dev BOARD=orangepizero KERNEL_ONLY=yes PROGRESS_DISPLAY=plain RELEASE=jessie Error: missing build directory structure Please clone the full repository https://github.com/armbian/build/ What did I wrong? I followed all you points till I get this message. Thank you in advance Link to comment Share on other sites More sharing options...
adrb Posted March 24, 2018 Author Share Posted March 24, 2018 On 1/17/2018 at 10:36 AM, DoubleHP said: In the end, what worked for me: 0: my system: "ARMBIAN 5.35 user-built Debian GNU/Linux 8 (jessie) 4.13.16-sunxi" (called next) 1: I am not going to try using the touch layer. 2: wire things as described (with LED directly on 3.3V) 3: aptitude install linux-headers-next-sunxi 4: copy the content of "Configuration for the first spi bus" from initial post, except last line about EOF, into /root/myili9431.dts 5: armbian-add-overlay myili9431.dts 6: edit /boot/armbianEnv.txt and edit this line (some parts may be useless or overkill) overlays=usbhost2 usbhost3 spi-spidev spidev myili9431 (this appeared to be useless) 7: reboot 8: modprobe fbtft_device custom name=fb_ili9341 gpios=dc:3,reset:0,led:6 speed=16000000 busnum=1 ... and immediately the LCD turned from all white, into classic console (black background with prompt at the top) .... 9: xinit worked immediately Ad3. Yes, guide is for mainline kernel, I tested it on 4.11 if I recall correctly. Ad 4. Yes, sorry my bad. Link to comment Share on other sites More sharing options...
DoubleHP Posted March 24, 2018 Share Posted March 24, 2018 On 19/03/2018 at 10:17 PM, Kevin Wietzorek said: What did I wrong? I followed all you points till I get this message. Either I tried to mkdir build, or, maybe I made the LCD work without this git tree; I forgot. But according to my last post, I probably got it working without this git tree. Try my post from Jan 17th 2018 ... Link to comment Share on other sites More sharing options...
adrb Posted March 24, 2018 Author Share Posted March 24, 2018 4 minutes ago, DoubleHP said: Either I tried to mkdir build, or, maybe I made the LCD work without this git tree; I forgot. But according to my last post, I probably got it working without this git tree. Try my post from Jan 17th 2018 ... If you don't plan to use touchscreen, then no need to recompile kernel. Link to comment Share on other sites More sharing options...
adrb Posted March 24, 2018 Author Share Posted March 24, 2018 On 3/19/2018 at 9:17 PM, Kevin Wietzorek said: What did I wrong? I followed all you points till I get this message. I would check armbian docs, maybe something changed - I must admit that I was busy with other things and hadn't recompile Armbian kernel since then. Link to comment Share on other sites More sharing options...
Igor Posted March 25, 2018 Share Posted March 25, 2018 On 16. 1. 2018 at 10:02 PM, DoubleHP said: I have cloned this twice, and it's still asking me to clone it. As written in the documentation: Login as root and run: apt-get -y -qq install git git clone --depth 1 https://github.com/armbian/build cd build Run the script ./compile.sh Link to comment Share on other sites More sharing options...
DoubleHP Posted December 21, 2018 Share Posted December 21, 2018 Update: I have bought https://www.fasttech.com/products/0/10020192/5321900-3-5-320-480-tft-lcd-display-touch-board-for Sold with the following specs: Quote # SKU MPI3501 # SKU 5321900 # XPT2046 # ILI9486 which seems to me very similar to https://www.amazon.fr/gp/product/B06X191RX7/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1 I started with image Armbian_5.35_Orangepizero_Ubuntu_xenial_next_4.13.16.img And then, ran the following commands to get the LCD working on oPi0: aptitude dist-upgrade vim /root/myili9431.dts # see previous message reboot aptitude install linux-headers-next-sunxi armbian-add-overlay myili9431.dts reboot modprobe fbtft_device custom name=fb_ili9486 gpios=dc:18,reset:2 speed=16000000 busnum=1 and now I have a console in portrait mode. # cat /root/myili9431.dts /* author: Adrian Brzezinski: adrb at wp.pl, adrian.brzezinski at adrb.pl */ /dts-v1/; /plugin/; / { compatible = "allwinner,sun8i-h3"; fragment@0 { target-path = "/aliases"; __overlay__ { spi1 = "/soc/spi@01c69000"; }; }; fragment@1 { target = <&spi1>; __overlay__ { status = "okay"; spidev { compatible = "spidev"; reg = <0>; spi-max-frequency = <50000000>; }; }; }; }; To get X: # Some of the following packages may be facultative. aptitude install startx xinit x11-xserver-utils xinput-calibrator xinput xserver-xorgxserver-xorg-video-all xterm x11-utils startx # gives a black console # or xinit # gives a white console Mouse does not work very well. Did not try keyboard. No touchpad (I don't need it, so, no time to loose on this). Rotation of screen works, but produces crappy output. # Need reboot each time modprobe fbtft_device custom name=fb_ili9486 gpios=dc:18,reset:2 speed=16000000 busnum=1 rotate=90 modprobe fbtft_device custom name=fb_ili9486 gpios=dc:18,reset:2 speed=16000000 busnum=1 rotate=180 modprobe fbtft_device custom name=fb_ili9486 gpios=dc:18,reset:2 speed=16000000 busnum=1 rotate=270 # 90 and 270 produce a rectangle in landscape orientation; unusable in neither console or X. # 180 works fine. Bed time; more tries later. Some tips to make conf persistent: https://kaspars.net/blog/linux/spi-display-orange-pi-zero 1 Link to comment Share on other sites More sharing options...
DoubleHP Posted December 22, 2018 Share Posted December 22, 2018 Random tips : - orange pi zero all have 2 SPI bus: one in the main GPIO port, and one for the flash on the back side. If you don't have the plus model, you can unsolder the FLASH and use the port. FLASH is port 1, so, GPIO is port 1. This is very important when you follow tutorials written for other opis - before you start following a tutorial, you need to understand which kernel you are using. If the turial is written after jan 2017, and mentions adding an overlay in armbianEnv.txt, then it's for kernel 4; if the tuto is before feb 2018, and does not mention altering armbianEnv.txt for SPI compatibility, author is using kernel 3. This is critical. - I got adressable LEDs working on both kernels, 3 and 4. Easier on 4. - SPI LCDs work only on kernel 3; I have spend days on kernel 4, just forget them; drivers exist, but they are broken. - con2fbmap is required only on kernel 3 - to get X working, you need to create /etc/X11/xorg.conf.d/99-fbturbo.conf - check your FB number with a command like this: dmesg | grep ili | grep graphics | grep -i fb . I have seen people using 0, 1 and 8. Now, I have ili9486 working perfectly fine ... with image Armbian_5.35_Orangepizero_Ubuntu_xenial_default_3.4.113 (kernel 3.4.113). Link to comment Share on other sites More sharing options...
jonokoi Posted June 24, 2020 Share Posted June 24, 2020 On 12/22/2018 at 8:40 PM, DoubleHP said: Random tips : - orange pi zero all have 2 SPI bus: one in the main GPIO port, and one for the flash on the back side. If you don't have the plus model, you can unsolder the FLASH and use the port. FLASH is port 1, so, GPIO is port 1. This is very important when you follow tutorials written for other opis - before you start following a tutorial, you need to understand which kernel you are using. If the turial is written after jan 2017, and mentions adding an overlay in armbianEnv.txt, then it's for kernel 4; if the tuto is before feb 2018, and does not mention altering armbianEnv.txt for SPI compatibility, author is using kernel 3. This is critical. - I got adressable LEDs working on both kernels, 3 and 4. Easier on 4. - SPI LCDs work only on kernel 3; I have spend days on kernel 4, just forget them; drivers exist, but they are broken. - con2fbmap is required only on kernel 3 - to get X working, you need to create /etc/X11/xorg.conf.d/99-fbturbo.conf - check your FB number with a command like this: dmesg | grep ili | grep graphics | grep -i fb . I have seen people using 0, 1 and 8. Now, I have ili9486 working perfectly fine ... with image Armbian_5.35_Orangepizero_Ubuntu_xenial_default_3.4.113 (kernel 3.4.113). Hello friend, I know it's an old discussion but I have read many posts on many forums and I couldn't find a clear answer. I have an orange pi zero and I am not sure which version of armbian is compatible with SPI LCDs. I have a chinese waveshare clone 3.5" which is working fine on raspberry pi with waveshare drivers (both lcd and touchscreen). Which armbian and kernel version should I use? You mention that we should use kenrel 3.x but you had some success with 4.x as well (on another forum). Did you manage to enable touchscreen? I read that it could be done if we unsolder the flash rom so we could use the second SPI bus with touchscreen. Is it possible? Is there any other workaround? Thank you Link to comment Share on other sites More sharing options...
Recommended Posts