静态加载驱动过程"/>
LED驱动测试程序以及静态加载驱动过程
前两天写好的LED驱动测试程序以及小结。
linux内核版本:3.0
/********************************************************************************** Copyright: (C) 2015 songyong<handy_skyoutlook>* All rights reserved.** Filename: song_testled.c* Description: This file * * Version: 1.0.0(2015年03月30日)* Author: sky <handy_sky@outlook>* ChangeLog: 1, Release initial version on "2015年03月30日 21时12分31秒"* ********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <asm/ioctl.h>
#ifndef __KERNEL__
#include <sys/ioctl.h>
#endif#define PLATDRV_MAGIC 0X60
#define LED_ON _IO (PLATDRV_MAGIC, 0x18)
#define LED_OFF _IO (PLATDRV_MAGIC, 0x19)
#define LEN_LED 4
#define LED_BUF 128 /********************************************************************************* Description:* Input Args:* Output Args:* Return Value:********************************************************************************/
int main (int argc, char **argv)
{int fd[LEN_LED];char dev_name[LED_BUF];int i;for(i = 0 ;i<LEN_LED ;i++){snprintf(dev_name,sizeof(dev_name),"/dev/led%d",i);fd[i] = open(dev_name,O_RDWR,0755);if(fd[i] < 0){printf("open failure :%s ",strerror(errno));}}while(1){for(i = 0 ;i < LEN_LED;i++){ioctl(fd[i],LED_ON); sleep(1);ioctl(fd[i],LED_OFF);sleep(1);}}for(i = 0;i < LEN_LED ;i++){close(fd[i]);return 0;}#if 0if(argc > 1){printf("error:Too many parameter ");}else {while ( 1 ){for( i = 0 ;i < 4 ;i++ ){switch(i){case 0: fd[i] = open("/dev/led0",O_RDWR,755);ioctl(fd[i],LED_ON);sleep(1);ioctl(fd[i],LED_OFF);close(fd[i]);test1.c break;case 1:fd[i] = open("/dev/led1",O_RDWR,755);ioctl(fd[i],LED_ON);sleep(1);ioctl(fd[i],LED_OFF);close(fd[i]);break;case 2:fd[i] = open("/dev/led2",O_RDWR,755);ioctl(fd[i],LED_ON);sleep(1);ioctl(fd[i],LED_OFF);close(fd[i]);break;case 3:fd[i] = open("/dev/led3",O_RDWR,755);ioctl(fd[i],LED_ON);sleep(1);ioctl(fd[i],LED_OFF);close(fd[i]);break;}} }}
#endifreturn 0;
} /* ----- End of main() ----- */</span></strong>
[pikaqiu@centos6 s3c_led]$ /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc test1.c -o test1
[pikaqiu@centos6 s3c_led]$ ls
Makefile s3c_led.c s3c_led.ko song_testled.c <span style="color:#33ff33;">test1</span> test1.c test_s3c_led.c
(二)然后通过Tftp服务器将上篇make编译后的s3c_led.ko驱动文件和这个test1测试程序一起放入开发板中。
=========================================================================
=========================================================================
(三)insmod手动加载驱动。一般情况下还需要我们cat /proc/devices 来查看驱动对应的设备节点
=========================================================================
=========================================================================
可以看到,我的led驱动对应的是252.
然后便是手动创建设备节点了(mknod filename type major minor)
mknod /dev/led0 c 252 0 如果像我一样需要点亮多盏则需把次设备号123号都创建设备节点,本篇这类最原始的方法就是如此。
创建好设备节点之后要记得给权限再运行
./test1 如果成功的话即可在开发板上看到LED灯点亮的效果了。
=========================================================================
=========================================================================
另外补上上篇的Makefile
#ARCH=x86
ARCH=arm920t
PROJ=fl2440
PWD=$(shell pwd)ifneq ("${ARCH}", "x86")CROSS_COMPILE ?= /opt/buildroot-2012.08/${ARCH}/usr/bin/arm-linux-KERNEL_DIR = ${PWD}/../../kernel/linux-3.0/
elseKERNEL_DIR = /lib/modules/$(shell uname -r)/build
endifobj-m += s3c_led.oall:make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules@make clearclear:@rm -f *.o *.cmd *.mod.c@rm -rf *~ core .depend .tmp_versions Module.symvers modules.order -f @rm -f .*ko.* *ko.* .*.o.cmd clean:rm -f *.ko
~
基本的GCC编译生成.ko例:
obj-m := module.o module-objs := file1.o file2.o KERNEL_DIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default:$(MAKE) -C $(KENREL_DIR) M=$(PWD) modules 然后,直接make就可以得出moduble.ko 说明: 1)module.o表示编译模块的名字; 2)/lib/modules/$(shell uname -r)/build表示Linux内核的存放路径
小结:
起初以为弄好LED驱动以及在Makefile中指定了交叉编译器的路径和linux内核路径之后只需要将找到的linux内核生成的.bin二进制文件放入开发板就可以加载驱动。
弄了半天才醒悟,我的粗略理解是:
仅仅靠以前linux内核生成好的.bin的二进制文件是不够的。在Makefile中指定了交叉编译器的路径和linux内核路径之后还需要在linux内核文件夹中重新编译。而且开发板运行的内核必须和编译驱动的内核版本不能相差太大。而要加载哪些驱动都是在linux内核的make menuconfig配置中设置,设置好后重新make编译生成新的与驱动相配的.bin二进制文件才行。
更多推荐
LED驱动测试程序以及静态加载驱动过程
发布评论