Exynos4412 移植Linux-6.1(八)LCD驱动,解决error: implicit declaration of function ‘dma_free_writecombine’的问题
系列文章目录
-
Exynos4412 移植Linux-6.1(三)SD卡驱动——解决mmc0: Timeout waiting for hardware interrupt.
-
Exynos4412 移植Linux-6.1 (七)挂载Ramdisk文件系统,【已解决】Couldn’t find valid RAM disk image starting at 0
-
Exynos4412 移植Linux-6.1 (八)LCD驱动,解决error: implicit declaration of function ‘dma_free_writecombine’的问题
Exynos4412 移植Linux-6.1(八)LCD驱动,解决error: implicit declaration of function ‘dma_alloc_writecombine’的问题
0、问题描述
有些博主分享了友善之臂tiny4412(Exynos4412)LCD的驱动,如下2位博主:
但是,移植的内核版本是Linux-4.x。我要移植的内核版本是Linux-6.1,交叉编译的时候会报错:lcd_drv.c:325:5: error: implicit declaration of function ‘dma_alloc_writecombine’;
出错的原因是内核中没有dma_alloc_writecombine()函数。
1、问题解决的经过
在Linux6.1的内核文件中确实是找不到dma_free_writecombine()函数。但是在Linux4.4的内核文件中可以找到。这个函数是在/include/linux/dma-mapping.h中声明的。
在Linux6.1的内核文件中打开/include/linux/dma-mapping.h,通过搜索关键字alloc,可以找到dma_alloc_wc()函数的声明。当发现这个的时候,我太高兴了!
(1)修改函数名
只需要把dma_alloc_writecombine()
替换成dma_alloc_wc()
。
(2)修改形参
dma_alloc_writecombine()与dma_alloc_wc()的第一个参数不一样。dma_alloc_wc()的第一个参数是struct device *dev
,所以还需要做一些修改。定义结构体变量dev,然后修改dma_alloc_wc()的第一个参数为dev。如下:
struct device *dev = &pdev->dev;
……
tiny4412_lcd->screen_base = dma_alloc_wc(dev, tiny4412_lcd->fix.smem_len, (dma_addr_t *)&tiny4412_lcd->fix.smem_start, GFP_KERNEL);
同样,可以解决lcd_drv.c:344:5: error: implicit declaration of function ‘dma_free_writecombine’;
的问题。
2、编译结果
lighthouse@VM-4-13-ubuntu:~/02_lcd_drv$ make
make -C /home/lighthouse/linux-6.1/ M=/home/lighthouse/02_lcd_drv modules
make[1]: Entering directory '/home/lighthouse/linux-6.1'
CC [M] /home/lighthouse/02_lcd_drv/lcd_drv.o
Building modules, stage 2.
MODPOST 1 modules
CC [M] /home/lighthouse/02_lcd_drv/lcd_drv.mod.o
LD [M] /home/lighthouse/02_lcd_drv/lcd_drv.ko
make[1]: Leaving directory '/home/lighthouse/linux-6.1'