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

    xiaoxiao2021-03-25  126

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

    #操作系统: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:错误变量名  */ 因为在"\+换行符"之后必须紧跟命令,不能有空格。

      

    转载请注明原文地址: https://ju.6miu.com/read-6855.html

    最新回复(0)