Linux-2.6.39在Tiny6410上的移植 - 外设驱动移植

Linux内核版本号:linux 2.6.39

交叉编译工具:arm-linux-gcc 4.5.1

Linux内核下载:www.kernel.org

开发板:友善之臂Tiny6410

LCD:友善之臂S70

一、移植LED驱动

打开arch/arm/mach-s3c64xx/mach-mini6410.c添加下列代码:

 1 static struct gpio_led tiny6410_gpio_led[] = {
 2     [0] = {
 3         .name = "led1",              //设备名
 4         .gpio = S3C64XX_GPK(4),      //GPK4
 5         .active_low = 1,             //低电平点亮
 6         .default_state = LEDS_GPIO_DEFSTATE_ON,        //系统启动后默认为打开
 7     },
 8     [1] = {
 9         .name = "led2",
10         .gpio = S3C64XX_GPK(5),
11         .active_low = 1,
12         .default_state = LEDS_GPIO_DEFSTATE_OFF,       //系统启动后默认关闭
13     },
14     [2] = {
15         .name = "led3",
16         .gpio = S3C64XX_GPK(6),
17         .active_low = 1,
18         .default_state = LEDS_GPIO_DEFSTATE_ON,
19     },
20     [3] = {
21         .name = "led4",
22         .gpio = S3C64XX_GPK(7),
23         .active_low = 1,
24         .default_state = LEDS_GPIO_DEFSTATE_OFF,
25     },
26 };
27
28 static struct gpio_led_platform_data tiny6410_leds_data = {
29     .num_leds = ARRAY_SIZE(tiny6410_gpio_led),
30     .leds = &tiny6410_gpio_led,
31 };
32
33 static struct platform_device tiny6410_device_leds = {
34     .name = "leds-gpio",
35     .id = -1,
36     .dev = {
37         .platform_data = &tiny6410_leds_data,
38     },
39 };

在mini6410_devices中添加tiny6410_device_leds,系统启动时将自动注册LED平台设备:

1 static struct platform_device *mini6410_devices[] __initdata = {
2     ...
3     &tiny6410_device_leds,
4 };

执行make menuconfig修改内核配置,添加对LED设备的支持:

Device Drivers  --->

│ │    [*] LED Support  --->

│ │ [*] LED Class Support 
        │ │ *** LED drivers *** 
        │ │ <*> LED Support for GPIO connected LEDs 
        │ │ [*] Platform device bindings for GPIO LEDs

编译并烧写内核,启动开发板可以看到第一、第三个LED被点亮。

编写应用程序控制LED:

系统LED设备名为每个LED设备创建了一个节点文件夹,位于/sys/devices/platform/leds-gpio/leds/目录下,对设备文件夹里面的brightness 文件写0或写非0即可对LED进行操作。

 1 #include <stdio.h>
 2 #include <sys/stat.h>
 3 #include <sys/types.h>
 4 #include <fcntl.h>
 5 #include <stdlib.h>
 6 #include <string.h>
 7
 8
 9 int main(int argc,char** argv)
10 {
11     int fd = 0;
12     char path[64] = "/sys/devices/platform/leds-gpio/leds/";
13
14     if(argc != 3)
15     {
16         printf("format error!\n");
17         return -1;
18     }
19
20     strcat(path,argv[1]);
21     strcat(path,"/brightness");
22
23     printf("%s\n",path);
24     fd = open(path,O_RDWR);
25     if(fd == -1)
26     {
27         printf("open file failure!\n");
28         return -1;
29     }
30     if(atoi(argv[2]))
31         write(fd,"1",1);
32     else
33         write(fd,"0",1);
34
35     close(fd);
36     return 0;
37 }

二、按键驱动移植

在arch/arm/mach-s3c64xx/mach-mini6410.c添加下列代码:

 1 static struct gpio_keys_button tiny6410_gpio_keys[] = {
 2     [0] = {
 3         .code            = KEY_F1,        //键值
 4         .type            = EV_KEY,        //按键输入类型
 5         .gpio            = S3C64XX_GPN(0),
 6         .active_low        = 1,           //低电平表示按下
 7         .wakeup            = 0,
 8         .debounce_interval    = 5, /* ms */    //延时消抖
 9         .desc            = "Button 1",
10     },
11     [1] = {
12         .code            = KEY_F2,
13         .type            = EV_KEY,
14         .gpio            = S3C64XX_GPN(1),
15         .active_low        = 1,
16         .wakeup            = 0,
17         .debounce_interval    = 5, /* ms */
18         .desc            = "Button 2",
19     },
20     [2] = {
21         .code            = KEY_F3,
22         .type            = EV_KEY,
23         .gpio            = S3C64XX_GPN(2),
24         .active_low        = 1,
25         .wakeup            = 0,
26         .debounce_interval    = 5, /* ms */
27         .desc            = "Button 3",
28     },
29     [3] = {
30         .code            = KEY_F4,
31         .type            = EV_KEY,
32         .gpio            = S3C64XX_GPN(3),
33         .active_low        = 1,
34         .wakeup            = 0,
35         .debounce_interval    = 5, /* ms */
36         .desc            = "Button 4",
37     },
38
39 };
40
41 static struct gpio_keys_platform_data tiny6410_key_data = {
42     .buttons = &tiny6410_gpio_keys,
43     .nbuttons = ARRAY_SIZE(tiny6410_gpio_keys),
44 };
45
46 static struct platform_device tiny6410_device_keys = {
47     .name = "gpio-keys",
48     .id = -1,
49     .dev = {
50         .platform_data = &tiny6410_key_data,
51     },
52 };

在mini6410_devices中添加tiny6410_device_keys:

1 static struct platform_device *mini6410_devices[] __initdata = {
2     ....
3     &tiny6410_device_leds,
4     &tiny6410_device_keys,
5 };

执行make menuconfig修改内核配置,添加对LED设备的支持:

Device Drivers  --->

│ │        Input device support  --->

│ │    [*]   Keyboards  ---> 
        │ │    <*>   GPIO Buttons 
同时在Input device support里面添加event interface的支持,在/dev/下面就能生成一个event设备文件:

Device Drivers  --->

│ │        Input device support  --->

│ │    <*>   Event interface

编译并烧写内核,启动开发板可以在/dev/目录下生成了event0设备文件,对按键驱动进行简单的测试:

执行hexdump /dev/event0

每次按下按键可以看到如下所示按键信息,表明按键是工作正常的。

1 /dev # hexdump event0
2 0000000 034d 0000 0e3b 000c 0001 003b 0001 0000
3 0000010 034d 0000 0e4c 000c 0000 0000 0000 0000
4 0000020 034d 0000 cd5f 000e 0001 003b 0000 0000
5 0000030 034d 0000 cd6b 000e 0000 0000 0000 0000

编写应用程序测试按键驱动:

按键驱动为输入子系统,应用程序中需要对event进行循环检测看系统有没有上报输入事件,按键的输入事件类型为EV_KEY,键值分别问KEY_F1、KEY_F2、KEY_F3、KEY_F4,数值为1表示按键按下为0表示按键释放。

 1 #include <stdio.h>
 2 #include <sys/stat.h>
 3 #include <sys/types.h>
 4 #include <fcntl.h>
 5 #include <stdlib.h>
 6 #include <linux/input.h>
 7
 8 int main(void)
 9 {
10     int fd = 0;
11     struct input_event event_key;
12     int count = 0;
13
14     fd = open("/dev/event0",O_RDONLY);
15     if(fd == -1)
16     {
17         printf("open file failed\n");
18         return -1;
19     }
20
21     while(1)
22     {
23         count = read(fd,&event_key,sizeof(struct input_event));
24         if(count < 0)
25         {
26             printf("read failed\n");
27             break;
28         }
29         if(event_key.type == EV_KEY)
30         {
31             switch(event_key.code)
32             {
33                 case KEY_F1:
34                 {
35                     if(event_key.value == 1)
36                         printf("key1 pressed\n");
37                     else if(event_key.value == 0)
38                         printf("key1 released\n");
39                 }
40                 break;
41                 case KEY_F2:
42                 {
43                     if(event_key.value == 1)
44                         printf("key2 pressed\n");
45                     else if(event_key.value == 0)
46                         printf("key2 released\n");
47                 }
48                 break;
49                 case KEY_F3:
50                 {
51                     if(event_key.value == 1)
52                         printf("key3 pressed\n");
53                     else if(event_key.value == 0)
54                         printf("key3 released\n");
55                 }
56                 break;
57                 case KEY_F4:
58                 {
59                     if(event_key.value == 1)
60                         printf("key4 pressed\n");
61                     else if(event_key.value == 0)
62                         printf("key4 released\n");
63                 }
64                 break;
65             }
66         }
67
68     }
69
70     close(fd);
71     return 0;
72 }

三、LCD显示屏移植

在arch/arm/mach-s3c64xx/mach-mini6410.c修改显示代码:

 1 static struct s3c_fb_pd_win mini6410_fb_win[] = {
 2     {
 3         .win_mode    = {    /* 7.0" 800x480 */
 4             .left_margin    = 0x2c,//26,
 5             .right_margin    = 0xd2,//210,
 6             .upper_margin    = 0x15,//13,
 7             .lower_margin    = 0x16,//22,
 8             .hsync_len    = 0x02,//20,
 9             .vsync_len    = 0x02,//10,
10             .xres        = 800,
11             .yres        = 480,
12         },
13         .max_bpp    = 32,
14         .default_bpp    = 16,
15     },
16 };

参数的值根据LCD显示屏规格书确定,具体参数解释及计算见博客http://blog.csdn.net/longxiaowu/article/details/24319933

执行make menuconfig修改内核配置,添加对LCD设备的支持:

Device Drivers  --->

│ │        Input device support  --->

│ │        Graphics support  --->

│ │    <*> Support for frame buffer devices  --->

│ │    <*>   Samsung S3C framebuffer support

│ │    [*] Bootup logo  --->               //开机显示小企鹅

│ │ --- Bootup logo │ │
                         │ │ [ ] Standard black and white Linux logo 
                         │ │ [ ] Standard 16-color Linux logo 
                         │ │ [*] Standard 224-color Linux logo

编译烧写内核并开机,屏幕上并没有看到小企鹅。加载Tiny6410一线触摸设备驱动之后小企鹅出来了,应该是Tiny6410 S70屏幕的背光是在一线触摸中进行打开的,由于一线触摸的协议并不开源所以没有进行深究。

四、触摸屏校验程序tslib移植

见博客:http://www.cnblogs.com/ape-ming/p/5134542.html

时间: 2025-01-01 14:17:04

Linux-2.6.39在Tiny6410上的移植 - 外设驱动移植的相关文章

Linux-2.6.39在Tiny6410上的移植

Linux内核版本号:linux 2.6.39交叉编译工具:arm-linux-gcc 4.5.1Linux内核下载:www.kernel.org开发板:友善之臂Tiny6410 一.解压内核 tar xzvf linux-2.6.39.tar.gz 二.修改Makefile ARCH ?= $(SUBARCH) CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%) 改成: ARCH ?= arm CROSS_COMPILE ?= arm-lin

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

Linux运维39期-听老男孩第一次分享学习方法

今天下午老男孩老师来到Linux运维39期分享学习方法: 1:怎样学好Linux?听到这个问题,感觉自己早已忘记开学习自己总结的学习方法,部分方案也没有去执行: 2:预习方法,老男孩老师推荐根据老师提供的预习知识点,自己去上网学,不要去花费大量时间去看预习视频,我的想法是快速浏览预习视频,看到重点知识去截图,遇到不会的知识,上课要重点听: 3:上课要保持最大化的输入,课前要预习: 4:激发老师讲课的动力的方法是,与老师互动,赞美老师: 5:下课保持最大化的输出,与同学们讨论: 6:日事日毕---

Linux服务器通过aws命令行上传文件至S3

目的Linux服务器通过AWS命令行上传文件至S3 配置打开你的AWS控制台: 连接你的Linux服务器,按照以下步骤操作: # 安装pip yum -y install python-pip   # 安装awscli pip install awscli   # 初始化配置 aws configure # 做这一步时系统会要求你输入"访问密钥ID"."私有访问密钥"."默认区域名称"."默认输出格式",前两个在创建IAM用户

移植SDL运行库到Tiny6410 上

在移植游戏之前, 我们首先需要将 SDL/SDL_mixer/SDL_ttf/SDL_image 这四个库移植到 Tiny6410 上, 另外还需要 iconv 库. libiconv-1.13.1.tar.gz Iconv 库 下载:http://ftp.gnu.org/pub/gnu/libiconv/SDL-1.2.14.tar.gz SDL 库 http://www.libsdl.org/download-1.2.phpSDL_image-1.2.8.tar.gz SDL_image 库

关于使用SecureCRT 实现 WIN7 与 Linux 双向通信的问题及文件上传下载

Linux 版本:Cent 6.5 X86 VMware workstation 10.0 win7 Ultimate x86 ,Linux 均可以正常链接网络[采用桥接方式] 遇到问题: win7 可以 ping 通linux及网关,linux不能ping通网关及win7,但能链接网络. 前提: 需要手动配置linux的IP为静态,WIN7的可以随意,但是一般在一个网段(不然配置较复杂了),保证可以正常通信访问. 解决: 通过手动改ip及相关配置的方法之后,仍然未能ping通,改链接方式为NA

linux下lrzsz安装过程,SecureCRT上传下载文件工具

linux下lrzsz安装过程,SecureCRT上传下载文件工具 1.从下面的地址下载 lrzsz-1.12.20.tar.gz http://down1.chinaunix.net/distfiles/lrzsz-0.12.20.tar.gz 2.查看里面的INSTALL文档了解安装参数说明和细节 3.解压文件 tar zxvf lrzsz-1.12.20.tar.gz 4.进入目录 cd lrzsz-1.12.20 5../configure --prefix=/usr/local/lrz

Linux下的经典软件-史上最全

前言 从2012年接触Linux系统以来就被Linux系统所吸引,2个月后便完全抛弃了Windows.在这2年的时间里,我尝试了很多Linux发行版: Gentoo, Fedora, Ubuntu, Debian等.在这些系统中又尝试了很多种软件,这里根据自己的使用经验并结合网上的一些资料,对Linux下常用的软件进行整理,供大家参考,希望能帮助到大家.每款软件都有它的优缺点,适合自己的才是最好的.在这篇文章中我是按自己的喜好推荐给大家或者进行排序的,并不是说它们就是最好的,其它的就不行.建议大