这节主要讲解下综合例程,包括代码编译,使用。
1.驱动和测试例程的编译
驱动和测试程序使用同一Makefile编译,Makefile如下,自己编译的使用只要修改如下2处就可以了:
1. KERN_DIR=/ext_hdd/Public/local_100ask_imx6ull_sdk/Linux-4.9.88 修改为自己的内核目录
2. CC = arm-linux-gnueabihf-gcc 修改为自己的工具链
KERN_DIR=/ext_hdd/Public/local_100ask_imx6ull_sdk/Linux-4.9.88
CUR_DIR=`pwd`
OUT_PUT_DIR=$(CUR_DIR)/output
#obj-m += spi_lcd_st7789.o
obj-m := lcd_st7789.o
lcd_st7789-objs := lcd_st7789_fb.o spi_lcd_st7789_lowlevel.o spi_lcd_st7789.o
test_app_name = test_spi_lcd_st7789
test_app_name_2 = test_spi_lcd_st7789_2
test_app_name_3 = test_spi_lcd_st7789_3
test_app_name_jpeg = test_spi_lcd_st7789_jpeg
tets_app_src = test_spi_lcd_st7789.c
tets_app_src_2 = test_spi_lcd_st7789_2.c
tets_app_src_3 = test_spi_lcd_st7789_3.c
tets_app_src_jpeg = test_spi_lcd_st7789_jpeg.c
CC = arm-linux-gnueabihf-gcc
INC_PATH +=
LOCAL_CFLAGS += -Wall
LDFLAGS += -pthread
all:
@ if [ ! -d ${OUT_PUT_DIR} ]; then mkdir -p ${OUT_PUT_DIR}; fi
make -C $(KERN_DIR) M=$(CUR_DIR) modules V=1
$(CC) $(INC_PATH) $(LOCAL_CFLAGS) $(LDFLAGS) $(tets_app_src) -o $(test_app_name)
$(CC) $(INC_PATH) $(LOCAL_CFLAGS) $(LDFLAGS) $(tets_app_src_2) -o $(test_app_name_2)
$(CC) $(INC_PATH) $(LOCAL_CFLAGS) $(LDFLAGS) $(tets_app_src_3) -o $(test_app_name_3)
$(CC) $(INC_PATH) $(LOCAL_CFLAGS) $(LDFLAGS) $(tets_app_src_jpeg) -o $(test_app_name_jpeg)
mv *.ko *.o $(test_app_name) $(test_app_name_2) $(test_app_name_3) $(test_app_name_jpeg) ${OUT_PUT_DIR}
cp ${OUT_PUT_DIR}/* ${sh_dir}
.PHONY:clean
clean:
make -C $(KERN_DIR) M=$(CUR_DIR) modules clean
rm ${OUT_PUT_DIR}/*
执行完make后,output目录会有lcd_st7789.ko test_spi_lcd_st7789 test_spi_lcd_st7789_jpeg
lcd_st7789.ko 驱动模块
test_spi_lcd_st7789 测试framebuf的可执行文件
test_spi_lcd_st7789_jpeg 综合测试可执行文件
注意 test_spi_lcd_st7789_jpeg.c的一些定义 可能要根据自己使用摄像头参数修改:
#define VIDEO_WIDTH 320 //摄像头支持的分辨率宽度
#define VIDEO_HEIGHT 240 //摄像头支持的分辨率高度
#define VIDEO_PIXEL_FORMAT V4L2_PIX_FMT_JPEG //摄像头支持的视频数据格式
如果改了摄像头分辨率,数据处理线程也要修改才能正常显示数据
2.libjpeg-turbo 编译
代码:
进入目录修改my_build.sh,修改红色部分为自己使用工具链的前缀
prefix_dir=${PWD}/build
if [ ! -e ${prefix_dir} ];then
mkdir -p ${prefix_dir}
fi
./configure --host=arm-linux-gnueabihf --prefix=${prefix_dir}
make -j8
make install
make clean
echo "===================================="
echo "Build file in ${prefix_dir}"
echo "===================================="
执行my_build.sh
将编译产生的build/lib/libturbojpeg.so.* 复制到开发板的/usr/lib
将编译产生的build/bin/djpeg 复制到 test_spi_lcd_st7789_jpeg 所在目录
3. 测试方法
3.1 framebuf测试
#insmod lcd_st7789.ko use_dma_flag=1
...
[ 261.245332] fb2: spi_lcd_st7789 frame buffer device, using 112K of video memory
#./test_spi_lcd_st7789 /dev/fb2
一切ok,log输出:
The phy mem = 0xa0b5d000, total size = 115200(byte)
xres = 240, yres = 240, bits_per_pixel = 16
So the screensize = 115200(byte), using 1 frame
vinfo.xoffset = 0, vinfo.yoffset = 0
vinfo.vmode is :0
finfo.ypanstep is :1
vinfo.red.offset=0x0
vinfo.red.length=0x5
vinfo.green.offset=0x5
vinfo.green.length=0x6
vinfo.blue.offset=0xb
vinfo.blue.length=0x5
vinfo.transp.offset=0x0
vinfo.transp.length=0x0
Get virt mem = 0x76e16000
Test FBIOPAN_DISPLAY...
Test drawing RED......
data 0x000000f8
Test drawing GREEN......
data 0xffffe007
Test drawing BLUE......
data 0x00001f00
Test drawing WHITE......
data 0xffffffff
Test drawing Black......
data 0x00000000
Test write......
lcd对应frambuf编号在插入模块的时候可以看出来,如果没有错误,lcd会依次显示红绿蓝白黑各种颜色
3.2 综合测试将usb摄像头的数据,通过frambuf,实时显示在lcd上
#./test_spi_lcd_st7789_jpeg /dev/fb2 /dev/video0
一切ok,log输出:
FbInfo:
The phy mem = 0xa0b5d000, total size = 115200(unsigned char)
xres = 240, yres = 240, bits_per_pixel = 16
So the screensize = 115200(unsigned char), using 1 frame
vinfo.xoffset = 0, vinfo.yoffset = 0
vinfo.vmode is :0
finfo.ypanstep is :1
vinfo.red.offset=0x0
vinfo.red.length=0x5
vinfo.green.offset=0x5
vinfo.green.length=0x6
vinfo.blue.offset=0xb
vinfo.blue.length=0x5
vinfo.transp.offset=0x0
vinfo.transp.length=0x0
CameravCapabilityInfo:
driver:uvcvideo
card:PC Camera
bus_info:usb-ci_hdrc.1-1.3
version:264536
capabilities:84200001
Camera supports capture.
Camera supports streaming.
Camera Support video formats:
1.Motion-JPEG
2.YUYV 4:2:2
V4l2FmtInfo:
fmt.type: 1
pix.pixelformat: MJPG
pix.width: 320
pix.height: 240
pix.field: 1
V4l2 buf info:
Buf count:16
index:0 map_address:0x76dbc000 length:230400
index:1 map_address:0x76d83000 length:230400
index:2 map_address:0x76d4a000 length:230400
index:3 map_address:0x76d11000 length:230400
index:4 map_address:0x76cd8000 length:230400
index:5 map_address:0x76c9f000 length:230400
index:6 map_address:0x76c66000 length:230400
index:7 map_address:0x76c2d000 length:230400
index:8 map_address:0x76bf4000 length:230400
index:9 map_address:0x76bbb000 length:230400
index:10 map_address:0x76b82000 length:230400
index:11 map_address:0x76b49000 length:230400
index:12 map_address:0x76b10000 length:230400
index:13 map_address:0x76ad7000 length:230400
index:14 map_address:0x76a9e000 length:230400
index:15 map_address:0x76a65000 length:230400
---->[app_init:553] start_capture ok!!!
/dev/video0 节点为插入usb摄像头系统自动创建的devj如果没有错误,lcd会在lcd中间位置实时显示摄像头画面。
spi-lcd7789 imx6ull测试视频