到此,未完成的驱动包括:
15.1、UDA1341音频驱动(未解决)
原因:linux-4.x版本的音频驱动采用了ALSA全新的结构,按照linux-2.6内核的音频驱动移植方法移植,一定会失败的。在linux2.x与linux4.x版本之间的linux3.x部分版本,可以使用ASOC的音频驱动模式,具体测试过的版本是linux-3.6.6,可以直接参考该版本内的arch/arm/mach-s3c2440/mach-mini2440.c驱动IIS音频,可以成功驱动(需要在menuconfig中配置一下声卡部分,以及开启DMA支持)。网上也有这个版本的音频移植介绍,但是到了linux4.x版本这一驱动模式又改变了,目前遇到的问题就是内核启动时会提示
UDA134X SoC Audio Codec
s3c24xx-iis s3c24xx-iis: Failed to get DMA channel capabilities,falling back to period counting: -6
s3c24xx-iis s3c24xx-iis: Failed to get DMA channel capabilities,falling back to period counting: -6
s3c24xx_uda134x s3c24xx_uda134x.0: uda134x-hifi <->s3c24xx-iis mapping ok
ALSA device list:
#0: S3C24XX_UDA134X
声卡已经识别,但是使用就会出问题。根据日志可见与DMA有一定的关系,但是目前暂时没找到解决的方法。
15.2、USB驱动(已解决)
参考http://singleboy.blog.163.com/blog/static/5490019420115278402359/进行配置即可。
但是提示:usbusb1-port1: unable to enumerate USB device
怀疑是uboot 的问题,导致usb移植无法使用,换回友善提供的内核也无法使用。
参考http://www.360doc.com/content/16/0306/11/18945873_539818316.shtml
在uboot源码中的board/mini2440/mini2440.c中的初始化部分添加了一个延时就好了。
将其改为:
clk_power->MPLLCON = ((M_MDIV << 12) + (M_PDIV << 4)+ M_SDIV);
/* some delay between MPLLand UPLL */
delay (4000);
delay (4000); //添加
/* configure UPLL */
clk_power->UPLLCON = ((U_M_MDIV << 12) +(U_M_PDIV << 4) + U_M_SDIV);
也就是多加一个delay(4000); Usb就可以使用了,鼠标、U盘都可以使用。
另外,可以顺便把uboot启动时mini2440的蜂鸣器响声关掉
将 gpio->GPBCON = 0x00055555;
改为gpio->GPBCON= 0x00055550;
即可关闭每次复位开发板上电时,mini2440的蜂鸣器声音。
15.3、SD卡驱动
手上没有SD卡,无法测试,大家可以参考友善提供的文档移植。
15.4 一些笔记
下面总结一下移植过程中发现的linux-4.x内核与linux-2.6的不同之处
1、GPIO的驱动不同之处
(1)使用GPIO需要添加头文件
#include <mach/gpio-samsung.h>
#include <mach/regs-gpio.h>
#include <plat/gpio-cfg.h>
(2)配置GPIO模式
Linux2.6:s3c2410_gpio_cfgpin
Linux4.9:s3c_gpio_cfgpin
(3)设置GPIO输出
Linux2.6:s3c2410_gpio_setpin
Linux4.9:gpio_set_value
(4)读取GPIO
Linux2.6:s3c2410_gpio_getpin
Linux4.9:gpio_get_value
(5)驱动中的.ioctl要改为.unlocked_ioctl,同时,后面的函数声明为long函数名,并删除
struct inode *inode参数
例如在蜂鸣器驱动中
原来的 .ioctl =s3c24xx_pwm_ioctl,
改为 . unlocked_ioctl = s3c24xx_pwm_ioctl,
并且原来的 static int s3c24xx_pwm_ioctl(struct inode*inode, struct file *file, unsigned int cmd, unsigned long arg)
要改为 static long s3c24xx_pwm_ioctl(structinode *inode, struct file *file, unsigned int cmd, unsigned longarg)
2、互斥锁
init_MUTEX(&lock); //初始化一个互斥锁
在linux 4.9中已经废除了init_MUTEX
要改为sema_init(&lock,1);
3、两个有用的linux命令
1.使用grep查找当前目录下所有包含某一文本的文件
# grep -rn “要找的文本” *
2.使用find查找某一名称的文件
# find -iname “文件名.后缀”