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'