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