zoukankan      html  css  js  c++  java
  • [置顶] 【原创分享】嵌入式linux应用之内核移植定制篇-后篇(修复部分问题)(linux-3.8.12 mini2440)

                 前面一个linux3.8.12的内核已经可以跑起来了,只不过,解决了网络以后还是有一堆问题影响正常使用,有3个问题需要解决。

                 同样准备工作:

                 1.linux 3.8.12  移植进度请参考上篇博文前篇、

                 2.uboot

                 3.ubuntu

                 4.mini2440

                 5.ts_lib1.4  需要重新移植,因为我一直使用以前友善的yaff2文件系统。

               一:背光

               背光的问题简单,仅仅改变下初始化的默认电平即可,在drivers/leds目录下leds-s3c24xx.c文件的s3c24xx_led_probe函数增加两句

                

    static int s3c24xx_led_probe(struct platform_device *dev)
    {
    	struct s3c24xx_led_platdata *pdata = dev->dev.platform_data;
    	struct s3c24xx_gpio_led *led;
    	int ret;
    
    	led = devm_kzalloc(&dev->dev, sizeof(struct s3c24xx_gpio_led),
    			   GFP_KERNEL);
    	if (led == NULL) {
    		dev_err(&dev->dev, "No memory for device
    ");
    		return -ENOMEM;
    	}
    
    	platform_set_drvdata(dev, led);
    
    	led->cdev.brightness_set = s3c24xx_led_set;
    	led->cdev.default_trigger = pdata->def_trigger;
    	led->cdev.name = pdata->name;
    	led->cdev.flags |= LED_CORE_SUSPENDRESUME;
    
    	led->pdata = pdata;
    
    	ret = devm_gpio_request(&dev->dev, pdata->gpio, "S3C24XX_LED");
    	if (ret < 0)
    		return ret;
    
    	/* no point in having a pull-up if we are always driving */
    
    	s3c_gpio_setpull(pdata->gpio, S3C_GPIO_PULL_NONE);
    
    	if (pdata->flags & S3C24XX_LEDF_TRISTATE)
    		gpio_direction_input(pdata->gpio);
    	else
    		gpio_direction_output(pdata->gpio,
    			pdata->flags & S3C24XX_LEDF_ACTLOW ? 1 : 0);
    
              if(pdata->name == "backlight")//第一句
    
            gpio_set_value(pdata->gpio,1);//第二句
    
    
    	/* register our new led device */
    
    	ret = led_classdev_register(&dev->dev, &led->cdev);
    	if (ret < 0)
    		dev_err(&dev->dev, "led_classdev_register failed
    ");
    
    	return ret;
    }


     


                二:ADC

                因为触摸屏驱动是建立在ADC基础上的,所以必须先准备ADC驱动。。 因为是一个新内核,为了方便管理,我自己喜欢在移植驱动建立自己的文件夹

    就像有些朋友,移植干脆在board下建立自己的板子的整个文件夹。

                1.进入内核根目录。在driver下建立一个文件夹 如“lynn”,同时建立两个空文件,一个Makefile,一个Kconfig 内核编译时必的文件。

                2.修改driver目录下的文件makefile,最后一行添加

    obj-y                           += lynn/

                3.修改driver目录下的文件Kconfig,添加

    source "drivers/lynn/Kconfig"


                4,进入lynn文件夹,修改makefile,添加

    obj-$(CONFIG_MINI2440_ADC)                      += mini2440_adc.o

               

               5.同样修改Kconfig文件

    menu "lynn Drivers"
    
    config LYNN_LED_DRIVER
    	tristate "MINI2440 LED driver"
    	help
    	  JUST TEST
    config MINI2440_ADC
           bool "ADC driver for MINI2440"
           depends on MACH_MINI2440
           default y if MACH_MINI2440
           help
             JUST TEST
    endmenu

                当选择MACH_MINI2440默认就选择编译此项,建议这样,这样就不用make menuconfig去改了。

                

     

               6.从之前的内核版本中,如友善的linux-2.6.32 里面ADC驱动都是写好的。我们直接复制过来文件mini2440_adc.c,s3c24xx-adc.h。

                  同时修改文件mini2440_adc.c

    //DECLARE_MUTEX(ADC_LOCK);
    DEFINE_SEMAPHORE(ADC_LOCK);

                 新版本定义方式不一样了,所以需要更改,否则编译这里会出错。找不到ADC_LOCK;可以看SEMAPHORE.C文件。

                7.mke menuconfig  如下图,进入之后发现已经选择了,退出即可

     

                 8.make zImage  uboot烧写测试即可。测试程序我就不写了。贴个网上的吧,可以自己arm-linux-gcc 编译后给开发板运行。运行效果

      可以调节电位器来看效果。。。

                 三:触摸屏

                 ADC好了,触摸屏还是不能用。如果要使用qt的话,还要进行TS移植,虽然内核有很多种触摸屏,但是没有一个适合的。所以放弃

    直接移植吧。同ADC的方法一样。

                1.拷贝文件s3c2410_ts.c到lynn目录下,

                    2.修改makefile与kconfig文件加入s3c2410_ts.c的选项

                       参考ADC ...

                   3.make menuconfig

                   4.make

                   uboot来测试效果。

                

                四:tslib移植

                   我用的之前的yaffs2的系统用新内核后,tslib是没有用了。查阅了下资料,需要更新下,因为友善的tslib是修改蛮多的。

                    1.下载tslib

                    2.配置

    ./autogen.sh
    ./configure --host=arm-linux --prefix=$PWD/tslib  --enable-inputapi=no
    make
    make install

                    3.生成的tslib 拷贝到开发板usr/local/tslib这里。

                    4.修改开发板的变量etc/profile添加

    export T_ROOT=/opt/local/tslib/
    export LD_LIBRARY_PATH=$T_ROOT/lib
    export TSLIB_CONSOLEDEVICE=none
    export TSLIB_FBDEVICE=/dev/fb0     
    export TSLIB_TSDEVICE=/dev/event0
    export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
    export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
    export TSLIB_CALIBFILE=/etc/pointercal

                  5.source /etc/profile 导入变量,进入tslib/bin下测试。

       

                好了,这样子,基本没有什么大问题了,有什么其他问题,后续慢慢解决,毕竟内核太新了,很多东西都已经不是很匹配了,适用就好

    千万不要追新。要不太苦了,我就是,哈哈。


                有朋友说按照这样移植后,发现触摸屏校验程序无反应。实际上有一个地方需要改动

                修改内核/include/uapi/include/linux/input.h 文件中的

                        #define EV_VERSION        0x010001
                       改为:
                        #define EV_VERSION        0x010000

                重新编译后就好了。





  • 相关阅读:
    null和undefined的区别
    减少页面加载时间的方法
    html5有哪些新特性、移除了那些元素?
    cookies,sessionStorage 和 localStorage 的区别
    小程序页面
    快速保存网页图片的工具
    Flex 布局教程
    第一阶段:Python开发基础 day08 Python基础语法入门--列表元组字典集合类型的内置方法
    第一阶段:Python开发基础 day08 数据类型的内置方法 课后作业
    python学习第一周知识内容回顾与小结
  • 原文地址:https://www.cnblogs.com/pangblog/p/3283440.html
Copyright © 2011-2022 走看看