platform驱动学习二之led测试实例

来源:互联网 发布:js取消onblur事件 编辑:程序博客网 时间:2024/04/28 23:40

*********************************************************************************************************************************************

#操作系统:CentOS6.7

#开发板  :fl2440

#cpu        :s3c2440(arm920t)

#编译器 :arm-Linux-gcc(buildroot-2012.08)

#linux内核版本:linux-3.0

#开发模块:platform_led

********************************************************************************************************************************************

      前面我已经分析过了platform_led.c源代码,具体可以参考我的博客http://blog.csdn.net/zouleideboke/article/details/68969544

下面我将源代码进行编译,然后编写一个测试程序进行测试!

  1.创建platform_led驱动模块

   [zoulei@CentOS ~]$ mkdir LED1

   [zoulei@CentOS ~]$ cd LED1

   [zoulei@CentOS LED1]$ vim plat_led.c

   [zoulei@CentOS LED1]$ vim s3c_driver.h

    [zoulei@CentOS LED1]$ vim plat_ioctl.h 

   [zoulei@CentOS LED1]$ vim Makefile

obj -m:=plat_led.cC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gccKDIR?=~/fl2440/kernel/linux-3.0obj-m:=plat_led.odefault:@$(MAKE) -C $(KDIR) M=`pwd` modules  @make clean  clean:rm -f *.o *mod.c *.order *.symvers  
 将上面的.c和.h文件保存,然后进行编译链接

 [zoulei@CentOS LED1]$make

 [zoulei@CentOS LED1]$ls

Makefile  plat_ioctl.h  plat_led.c  plat_led.ko  s3c_driver.h

2编写及编译测试程序

[zoulei@CentOS ~]$mkdir LED1_test

[zoulei@CentOS ~]$ cd LED1_test/

[zoulei@CentOS LED1_test]$ vim s3c_led_test.c

/******************************************************************************** *      Copyright:  (C) 2017 zoulei<zoulei121@gmail.com>    *                  All rights reserved.  *  *       Filename:  s3c_led_test.c *    Description:  This file   *                   *        Version:  1.0.0(04/4/2017)  *         Author:  zoulei <zoulei121@gmail.com>  *      ChangeLog:  1, Release initial version on "04/4/2017 15:03:40 PM"  *                   ********************************************************************************/  #include<stdio.h>#include<stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/ioctl.h>#include <unistd.h>#define PLATDRV_MAGIC     0x60#define LED_OFF           _IO (PLATDRV_MAGIC,0x18)#define LED_ON            _IO (PLATDRV_MAGIC,0x19)#define LED_BLINK         _IO (PLATDRV_MAGIC,0x1A)int main(int argc,char**argv){    int  i;    int  led_num;    int  cmd_num;    int  fd;    char dev_name[10]={0};        if(argc<3)     {        printf("too few parameters,please input:./%s\n",argv[0]);        return -1;     }    snprintf(dev_name,sizeof(dev_name),"/dev/led");    fd=open(dev_name,O_RDWR);        led_num=atoi(argv[1]);    cmd_num=atoi(argv[2]);       switch(cmd_num)      {         case 0:            ioctl(fd,LED_ON,led_num);         break;         case 1:            ioctl(fd,LED_OFF,led_num);         break;             case 2:            ioctl(fd,LED_BLINK,led_num);         break;                  default:            printf("failure\n");         break;      }     close(fd);return 0;}   


[zoulei@CentOS LED1_test] /opt/buildroot_2012.08/arm920t/usr/bin/arm-linux-gcc  s3c_led_test.c -o  s3c_led_test

[zoulei@CentOS LED1_test]$ ls
s3c_led_test  s3c_led_test.c

接下来是将驱动模块及测试程序的可执行文件下载到开发板上!

3.在开发板上的操作

Copyright (C) 2011 fulinux<fulinux@gmail.com>
root login: root
>: ls
a.out       data        hello.ko    lib         proc        sbin        usr
apps        dev         info        linuxrc     root        sys         var
bin         etc         init        mnt         s3c_led.ko  tmp

>: tftp -gr plat_led.ko 192.168.1.155
plat_led.ko          100% |*******************************|   115k  0:00:00 ETA
>: tftp -gr s3c_led_test 192.168.1.155
s3c_led_test         100% |*******************************|  5741   0:00:00 ETA
>: ls
a.out         dev           init          plat_led.ko  s3c_led_test  usr
apps          etc           lib           proc          sbin          var
bin           hello.ko      linuxrc       root          sys
data          info          mnt           s3c_led.ko    tmp
>: insmod plat_led.ko
S3C led driver version 1.0.0 initiliaz
>: chmod 777 s3c_led_test
>: ./s3c_led_test 0 0                 //第一盏灯亮
>: ./s3c_led_test 0 1                 //第一盏灯灭
>: ./s3c_led_test 0 2                  //第一盏灯闪烁
>: ./s3c_led_test 1 0                 //第二盏灯亮
>: ./s3c_led_test 1 1                 //第二盏灯灭
>: ./s3c_led_test 1 2                 //第二盏灯闪烁

遇到的问题及解决方法;

[zoulei@CentOS LED1]$ make
make[1]: Entering directory `/home/zoulei/fl2440/kernel/linux-3.0'
  CC [M]  /home/zoulei/LED1/plat_led.o
In file included from /home/zoulei/LED1/plat_led.c:1:0:
/home/zoulei/LED1/s3c_driver.h:102:90: warning: backslash and newline separated by space
/home/zoulei/LED1/s3c_driver.h:111:54: warning: backslash and newline separated by space
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/zoulei/LED1/plat_led.mod.o
  LD [M]  /home/zoulei/LED1/plat_led.ko
make[1]: Leaving directory `/home/zoulei/fl2440/kernel/linux-3.0'
make[1]: Entering directory `/home/zoulei/LED1'
rm -f *.o *mod.c *.order *.symvers
make[1]: Leaving directory `/home/zoulei/LED1'

出现了两个警告:warning: backslash and newline separated by space
解决:原来是反斜线后面多了一个空格,就会提示这样的警告,
打开s3c_driver.h发现102行和111行后面都有一个"\"符号,之前没有遇到过这种符号的使用,上网了解一下才知道是续行符,续行符后面不能紧跟空格,要紧跟命令,否则会出错!续行符一般用在定义宏时,宏名很长的情况下!


一哥们儿总结的linux反斜线的作用,感觉还不错!
   反斜线符号“ \ ”在Bash中被解释为转义字符,用于去除一个单个字符的特殊意义,它保留了跟随在之后的字符的字面值,除了换行符(\n,\r)。

   如果在反斜线之后一个换行字符立即出现,转义字符使 行 得以继续,但是换行字符后必须紧跟命令,不能出现空格,遇到命令很长时使用反斜线很有效。

例一: 

[Linux@linux ~]$ echo $HOME
/home/
[linux@linux ~]$ echo \$HOME
$HOME

  例子中,反斜线去除了“ $ ”字符的特殊意义,保留字面值,从而不输出home目录路径。

例二:

export PATH=\

/bin:\
/sbin:\
/usr/bin:\
/usr/sbin:\
/usr/local/bin:\
/apps/bin:\
/apps/tools:\
/apps/tslib/bin\

例子中,反斜线使行得以继续,命令可以正常输入。

例二(反)

export PATH=\

  /bin:\
  /sbin:\
  /usr/bin:\
  /usr/sbin:\
  /usr/local/bin:\
  /apps/bin:\
  /apps/tools:\
  /apps/tslib/bin\

例子中就会出现错误:

/bin:: bad variable name/*  /bin:错误变量名  */

因为在"\+换行符"之后必须紧跟命令,不能有空格。




  

0 0
原创粉丝点击