LED驱动测试程序以及静态加载驱动过程

编程入门 行业动态 更新时间:2024-10-26 08:28:17

LED驱动测试程序以及<a href=https://www.elefans.com/category/jswz/34/1771395.html style=静态加载驱动过程"/>

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>


(一)程序完成之后因为是在x86平台上编写的,要想在板子上识别出来势必要用到交叉编译器编译。

[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驱动测试程序以及静态加载驱动过程

本文发布于:2024-02-13 14:15:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1759020.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:静态   加载   过程   测试   程序

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!