jz2440裸板移植内核驱动,实现uvc摄像头驱动中经验总结

0:移植最重要的概念是参考,参考内核中已经成熟 的代码。

0.0 将没有的宏去掉或者换成新内核中定义的宏

0.1 将没有的头文件去掉。更加错误信息添加新的头文件路径

0.2 将没有的函数去掉或者换成内核新定义的函数

1 uboot的烧写

注意事项:jlink 不能烧写nandflash,   pc机是ping不通uboot的,只能从uboot ping主机

移植linux3.2.0到jz2440

1.1  内核配置s3c2410_defconfig  生成uImage 串口出现乱码。。。 开发板的时钟配置不整错

需要修改的地方:时钟为12000000 和mtd 分区

1.2 不支持dm9000网卡,内核中已经有dm9000的驱动。只是smdk2440的板级文件中为添加platform平台信息

2 nand  命令读写错误nand_write_ecc: Attempt to write not page aligned data

原因 nand读写需要页对齐...可以加上nand write.jffs2  则不不要页对齐了

nand write.yaffs则烧写不讲ecc校验码写入nand的oob,因为yaffs文件系统自己包含ecc校验码

3内核读取Verifying Checksum ... Bad Data CRC  原因内核的实际大小 大于你的分区大小、重新设置内核分区arch/arm/plat-s3c24xx/common_sdk.c中修改

4 uboot中的环境变量 有默认的 也有从nandflash中读取,初始化时候使用config/100ask2440.h中配置的环境变量,具体环境变量存在哪里,从哪里读取到内存,则根据

一下几个配置选项

//#define CFG_ENV_IS_IN_FLASH1
#define CFG_ENV_IS_IN_NAND  1
#define CFG_ENV_OFFSET      0x40000
#define CFG_ENV_SIZE 0x20000/* Total Size of Environment

5 根文件系统存放的位置 则根据内核mtd分区的设置 进行读取 rootfs=/dev/mtdblock3   就会根据commom_smdk24xx中的mtd_partion结构体重定义

6.挂载根文件系统出现Kernel panic - not syncing: Attempted to kill init!。原因是用了gnueabi的接口编译文件系统,所以内核也得选上

选上还是出现错误,用readelf查看 vmlinux  busybox ..原来编译链的架构出现错误。。。具体参考http://buildroot-busybox.2317881.n4.nabble.com/Kernel-panic-not-syncing-Attempted-to-kill-init-td21689.html

7.其他板子上可以执行的程序,用在自己制作的文件系统出现错误 line 1: syntax error: unexpected word (expecting ")")。。这种语法错误,是因为使用的交叉工具链不相同。。因为自己制作的文件系统中库文件 可能不包含某些头文件。

8.lcd驱动移植中遇到的错误与解决方法

8.1    'l' has incomplete type 问题原因结构体重包含有未定义的类型

8.2    two or more data types in declaration specifiers 定义结构体时末尾未加分号

8.3  Starting kernel ...


Uncompressing Linux... done, booting the kernel.后系统停止启动

原因 1 机器id不匹配

         2  控制台初试化失败

         3  最容易忽视的 是  自己驱动的问题,,出现了 segent faut  段错误oop,内核停止在初始化控制台之前,所以很多信息未打印出来

         解决:写出模块  加载,根据oob信息找到pc终止的地址,,用objdum 反汇编后找到错误代码,,本次失败原因是linux3.2内核宏定义的bug

      #define S3C2410_LCDREG(x) (x),而2,.26内核中定义为#define S3C2410_LCDREG(x) ((x) + S3C24XX_VA_LCD)

9 lcd驱动的移植。

9.1  lcd不显示 原因背光灯没有打开。可以在驱动中设置管脚将背光打开

9.2 lcd图像显示错误 初始化参数 有问题     本次移植的问题是将3.5的参数用在了4.3的屏幕上 。尴尬

9.3 1 / vclk = pixclk / 10^12

10 tslib的移植

selected device is not a touchscreen I understand
 因为内核的输入系统版本和tslib的input输入系统 不一致。。。

修改交叉工具链的头文件中的EV_VERSION

11

到目前为止,我们已经花了好多篇幅在LCD上,但还有一个问题,那就是LCD在开机10分钟后会自动关闭。

 

在Vt.c文件(drivers/tty/vt目录下)的第179行,定义了blankinterval变量:

static int blankinterval = 10*60;

 

通过改变blankinterval的值,可以修改LCD关闭的时间,如果我们不想让LCD关闭,则只要把该变量设置为零即可。

11 qt移植中遇到的问题

使用的版本是qt4.8.5...

11.1配置中出现

The specified system/compiler is not supported
用export看下自己的环境变量 可能被污染了。。

11.2tslib的路径不识别,no such file or directly  原因可能是配置命令中有回车

 11.3    

The tslib functionality test failed!

 

  原因有二。一 在如下路径中修改用哪个版本的交叉编译器。
# Vim qt-everywhere-opensource-src-4.8.5/mkspecs/qws/linux-arm-g++/qmake.conf    

二 你可以去到config.test/unix/tslib目录下,查看一下里面的Makefile文件,看看里面的关于tslib的路径是不是你自己的安装路径。如果不是,直接在这里更改即可,然后在回到qtarm-build目录。重新配置,即可通过。

   

错误:qtconcurrentiteratekernel.cpp:(.text+0x3c): undefined reference to `clock_gettime'

修改:vim src/corelib/Makefile 加上-lrt

LIBS          = $(SUBLIBS)  -L/opt/qt-everywhere-opensource-src-4.8.4/lib -lpthread -lm -ldl -lrt

12 QWSSocket::connectToLocalFile could not connect:: No such file or directory

因为qt程序需要一个服务程序。所以需要加上-qws将当前的qt程序作为qt服务程序

13

设置环境变量的语句貌似只有添加在etc/profile文件的后面,系统启动后才能生效,而单独把它们保存到一 个shell脚本(可执行),然后丢到bin目录下,并且在etc/init.d/rcS文件中也添加了执行该脚本的语句,奇怪的是这样做系统启动后环境 变量并没有成功设置,这是我遇到的一个说小不小说大不大的问题(因为这个问题折腾了不少时间)。

解决:这个环境变量只在子shell中有效,所以需要把需要执行的程序也放在这个shell脚本中,就可以了

ps:我现在大概明白为什么了,估计是子shell中设置的环境变量影响不到父shell。需要用source命令来执行脚本。环境变量就保存在当前shell中了。

14 qt编程总结

在Qt中如何调用外部程序呢? 最近遇到这个问题,解决方法如下:
用QProcess类解决这个问题:
如执行a.exe, 带两个参数为 -z20,-q85
第一种方法:使用 QProcess类静态函数 QProcess ::startDetached ( const  QString  &program ,  const QStringList  &argument )或者 QProcess ::execute ( const  QString  &program ,  const  QStringList  &argument);
startDetached 函数不会阻止进程, execute会阻止,即等到这个外部程序运行结束才继续执行本进程。
QStringList    list;
list<<"-q85"<<"-q85";
QProcess::startDetached("a.exe",list); 或  QProcess::execute("a.exe",list);
注意:由于使用execute会阻止进程,所以界面的刷新 会等到外部程序执行结束!!

14.2 

 改变Qt中QLineEdit中显示内容的大小:

        QLineEdit *lineEdit = new QLineEdit();

        lineEdit->setStyleSheet("font-size : 16px");

        也可以在主函数中添加语句:

         qApp->setStyleSheet("QLineEdit { font: 16px; });


你可能感兴趣的:(linux驱动开发)