When you want to connect a display to the Intel Edison module, you should utilise the existing Linux infrastructure and use a kernel framebuffer driver instead of writing your own screen functions based on Arduino libraries.
The schematics and more technical information about my display and board are in my previous post: Framebuffer fbtft Installation on Intel Edison for OLED Display SSD1322.
At the time of writing the article, the Linux kernel SPI support was broken in the original Intel kernel. So, I used Primiano’s kernel that fixed the SPI support. It works perfectly for me, it may not contain the latest Intel’s modifications. Use it on your own risk.
First, I downloaded the Intel sources from http://iotdk.intel.com/src/3.0/edison/. I extracted them into ~/edison in my home directory and followed the instructions for compiling it.
cd ~/edison/poky/ source oe-init-build-env ../build_edison/ bitbake edison-image u-boot ../poky/meta-intel-edison/utils/flash/postBuild.sh . ./toFlash/flashall.sh
Then I replaced the kernel in ~/edison/poky/linux-kernel by my own, but I kept the directories .git and .meta intact.
I increased the revision number in the variable PR = “r3″ in the file ~/edison/poky/meta-intel-edison/meta-intel-edison-bsp/recipes-kernel/linux/linux-externalsrc.bb
I added my new configuration parameters for fbtft into the file ~/edison/poky/linux-kernel/arch/x86/configs/i386_edison_defconfig
I downloaded the fbtft sources. I created the folder ~/edison/poky/linux-kernel/drivers/video/fbtft and extracted the fbtft sources into the folder.
I added the line in ~/edison/poky/linux-kernel/drivers/video/Kconfig before the line “endmenu”.
source "drivers/video/fbtft/Kconfig"
I added the line in ~/edison/poky/linux-kernel/drivers/video/Makefile
obj-$(CONFIG_FB_TFT) += fbtft/
Then I edited the file ~/edison/poky/linux-kernel/drivers/video/fbtft/fbtft_device.c
I added the header
#include <linux/spi/intel_mid_ssp_spi.h>
Then I added the description of my display into the list of displays.
Where “reset” uses the number 49 of the GP49 pin, “dc” is GP15.
The pin “led” is GP14 and I use it in my custom initialization code in the file fb_ssd1322.c
It seems that the chip SSD1322 supports speeds only up to 12.5MHz, but the Edison must be able to support speeds up to 25MHz.
{ .name = "er_oled028", .spi = &(struct spi_board_info) { .modalias = "fb_ssd1322", .max_speed_hz = 12500000, .mode = SPI_MODE_3, .bus_num = 5, .chip_select = 0, .controller_data = &(struct intel_mid_ssp_spi_chip) { .burst_size = DFLT_FIFO_BURST_SIZE, .timeout = DFLT_TIMEOUT_VAL, .dma_enabled = true, }, .platform_data = &(struct fbtft_platform_data) { .display = { .buswidth = 8, .backlight = 0, .width = 256, .height = 64, }, .gpios = (const struct fbtft_gpio []) { { "reset", 49 }, { "dc", 15}, { "led", 14}, {}, }, } } },
I modified the file ~/edison/poky/linux-kernel/drivers/video/fbtft/fbtft-core.c
--- fbtft-core.c 2015-03-05 02:54:01.000000000 -0800 +++ fbtft-core.c.new 2016-05-30 19:19:21.000000000 -0700 @@ -863,7 +863,7 @@ if (txbuflen > 0) { if (dma) { dev->coherent_dma_mask = ~0; - txbuf = dmam_alloc_coherent(dev, txbuflen, &par->txbuf.dma, GFP_DMA); + txbuf = devm_kzalloc(par->info->device, txbuflen, GFP_DMA | GFP_ATOMIC); } else { txbuf = devm_kzalloc(par->info->device, txbuflen, GFP_KERNEL); }
I added the lines to the file ~/edison/poky/meta-intel-edison/meta-intel-edison-bsp/conf/machine/edison.conf to autoload the fbtft module.
Where busnum=5 is the SPI bus number on the Edison.,
name=er_oled028 defines my oled display from fbtft_device.c,
debug=7 shows more debugging information. It’s optional.
KERNEL_MODULE_AUTOLOAD += "fbtft_device" module_conf_fbtft_device = "options fbtft_device name=er_oled028 busnum=5 debug=7" KERNEL_MODULE_PROBECONF += "fbtft_device"
Then I recompiled the kernel and flashed my Edison.
I compiled mplayer on the Edison and played a sample video. I couldn’t find a video with the same dimensions as my display, but it should work in the full-screen mode too.
/usr/local/bin/mplayer -vo fbdev ultra.mp4
Downloads
Linux kernel for Edison with SPI DMA fixes and fbtft framebuffer