之前,我们熟悉了platform的驱动相关知识,现在我们要对其进行相关测试。
首先,我们需要写好makefile来生成.ko文件。
Makefile如下:
RCH = s3c2440
KERNEL_VER = linux-3.0.54 //内核版本,必须与开发板相同
LINUX_SRC ?= /home/yangni/fl2440/kernel/$(KERNEL_VER) //内核路径
#INST_PATH=../rootfs/mnt/usr/drivers/
INST_PATH=/tftp //.ko文件输出路径
CROSS?=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux- //交叉编译器路径
CROSS_COMPILE=${CROSS}
ARCH=arm
PWD := $(shell pwd)
EXTRA_CFLAGS+=-DARCH_${ARCH}
EXTRA_CFLAGS+=-D__KERNEL__
EXTRA_CFLAGS+=-DMODULE
obj-m += plat_led.o
modules:
@make -C $(LINUX_SRC) M=$(PWD) modules //"-C" 表示指定路径
@make clear
@make install
uninstall:
rm -f ${INST_PATH}/*.ko
install: uninstall
cp -af *.ko ${INST_PATH}
tag:
@ctags --c-kinds=+defglmnstuvx --langmap=c:.c.h.ho.hem.het.hec.hev.him.hit.hic.hiv -R .
@cscope -Rbq
clear:
@rm -f *.o *.cmd *.mod.c
@rm -rf *~ core .depend .tmp_versions Module.symvers modules.order -f
@rm -f .*ko.cmd .*.o.cmd .*.o.d
clean: clear
@rm -f *.ko
distclean: clear
@rm -f cscope* tags
@rm -f *.ko
准备好三个程序以及Makefile后将它们放在同一个文件夹,执行make
然后我们要编写我们的测试程序:
/*********************************************************************************
* Copyright: (C) 2017 qicheng
* All rights reserved.
*
* Filename: plat_led_test.c
* Description: This file
*
* Version: 1.0.0(04/04/2017)
* Author: yangni <497049229@qq.com>
* ChangeLog: 1, Release initial version on "04/04/2017 10:23:58 PM"
*
********************************************************************************/
#include <stdio.h>
#include "plat_ioctl.h" //for ioctl
/*******open******/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h> //for strcmp
#include <unistd.h> //for sleep
int main(int argc,char **argv)
{
int fd,i;
fd=open("/dev/led",O_RDWR);
if (argc > 1)
{
if (!strcmp (argv[1],"LED_ON" ))
{
printf("turn on all leds!\n");
for(i=0;i<=3;i++)
ioctl(fd,LED_ON,i);
}
else if(!strcmp (argv[1],"LED_OFF"))
{
printf("turn off all leds!\n");
for(i=0;i<=3;i++)
ioctl(fd,LED_OFF,i);
}
else if (!strcmp (argv[1],"LED_BLINK"))
{
printf("leds begin to blink...\n");
while(1)
{
for(i=0;i<=3;i++)
{
ioctl(fd,LED_BLINK,i);
sleep(1.5);
ioctl(fd,LED_OFF,i);
}
}
}
}
else
{
printf("please input the status,LED_ON,LED_OFF or LED_BLINK");
}
close(fd);
return 0;
}
该测试程序用参数控制灯的状态。LED_ON表示全亮度,LED_OFF表示全部关闭,LED_BLINK表示闪烁。
对其进行编译:
armgcc是我重命名的一个命令,完整命令为/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
编译完后可查看文件类型:
下载到开发板上测试:
然后通过insmod plat_led.ko就会安装好驱动,因为驱动程序中加入了自动创建节点的类,所以我们不需要再创建节点了。
接下来就是修改权限,并运行了:
这里最好加上打印提示,可以方便检测出你是否进入某个循环!