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

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

#操作系统: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.c
C=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
KDIR?=~/fl2440/kernel/linux-3.0
obj-m:=plat_led.o

default:
	@$(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值