Linux-4.9.2内核在mini2440上的移植(十五)——总结

来源:互联网 发布:大数据 精准医疗 案例 编辑:程序博客网 时间:2024/06/14 20:38

到此,未完成的驱动包括:

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  “文件名.后缀

 

阅读全文
0 0
原创粉丝点击