嵌入式ARM平台下的Linux字符设备驱动实例
- 格式:doc
- 大小:23.50 KB
- 文档页数:4
第28卷第4期增刊 2007年4月仪 器 仪 表 学 报Chinese Jour nal of Scientif ic InstrumentVol.28No.4Apr.2007 嵌入式L inux 下GPIO 驱动程序的开发及应用3何 泉,贺玉梅(北京化工大学信息科学与技术学院 北京 100029)摘 要:嵌入式Linux 是一种适用于嵌入式系统的源码开放的占先式实时多任务操作系统,是目前操作系统领域中的一个热点,其重点与难点是驱动程序的开发。
开发嵌人式Linux 下的设备驱动程序,可以更好地利用新硬件特性,提高系统访问硬件的效率,改善整个应用系统的性能。
驱动程序修改非常方便,使应用系统非常灵活。
本文简要论述了基于A TM E L 公司嵌入式ARM 处理器芯片的嵌入式Linux 的GP IO 驱动程序的开发原理及流程。
关键词:嵌入式Linux ;ARM ;驱动程序;设备文件;GPIOInvest igat ion an d a pplicat ion of GP IO dr iver in t he embedded L inuxHe Quan ,He YuMei(School of I nf orma tion Science and Tec hnology BU CT ,Beij ing 100029,China )Abstract :Embedded Linu x ,w hich i s a full y real 2time kernel and applicable to embedded syst ems ,has bec o me a hot s 2po t in t he do main of op erati ng system at present.It s out line and difficult y is to investigat e drivers.Developi ng device dri vers o n embedded Lin ux can help using t he new devices ,and imp rovi ng t he e fficiency of access to t he new devices and t he p erformance cap abilit y.As drivers can be changed easil y ,t he system is very convenient and flexi ble.Thi s p a 2p er simpl y point s o ut t he element s and flow of t he GPIO driver in t he embedded Linux based o n t he A RM proces sor of A TMEL system.Key words :embedded Li nux ;A RM ;driver ;device file ;GPIO 3基金项目国家自然科学基金(6)、北京化工大学青年教师自然科学研究基金(QN 58)资助项目1 引 言随着半导体技术的飞速发展,嵌入式产品已经广泛应用于军事、消费电子、网络通信、工业控制等各个领域,这是嵌入式系统发展的必然趋势。
嵌入式Linux下ADC的驱动程序实现与应用作者:孙德辉梁鑫杨扬来源:《现代电子技术》2008年第22期摘要:详细介绍S3C2410芯片ADC模块以及Linux的驱动模型,并且通过S3C2410内置的ADC驱动程序设计说明字符型设备驱动开发方法;将驱动编译为模块的方式,单独加载入内核,便于调试。
以MINICOM为操作台,控制驱动模块的加载和应用程序的运行。
并通过实例介绍ADC驱动程序在电阻、电压等测试中的实际应用;从实验结果可以看出ADC驱动可以被成功加载和调用;该驱动可以测试电压、电流等标准工程量信号,或作为工业传感器接口的一部分对现场标准工程量信号进行采集处理。
关键词:S3C2410;ADC;Linux;字符设备驱动程序中图分类号:TP311文献标识码:B文章编号:1004373X(2008)2203303Implement and Application of ADC Driver about Embedded-LinuxSUN Dehui,LIANG Xin,YANG Yang(Key Laboratory of Beijing Municipality,The FAT Laboratory,North China University of Technology,Beijing,100041,China)Abstract:The module of ADC in S3C2410 CMOS chip and the model about Linux drivers are expounded,the method of developing character device drivers are illuminated by realizing an ADC driver.As convenient to debug,compiling the drivers into module and "insmod" it into kernel.Updating the drivers module and application by MINICOM,one kind of consoles.Application on testing resistance and voltage using ADC driver are introduced through an example.In the end,it is obviously that ADC drivers module could be "insmoded"and called successful from the result of ing the drivers testing resistance,voltage and many other standard signal.ADC drivers can collect the standard signal of plants as one part of interface of industrial sensor.Keywords:S3C2410;ADC;Linux;character device driver1 引言S3C2410开发板制造商提供了绝大部分的驱动程序,但有时出于实际开发的需要、应用程序的稳定性考虑,用户往往需要开发一个自己需要的接口驱动程序。
ARM板TL_WN725N USB Wifi Driver 移植内容描述:2014-12-15,TL_WN725N USB Wifi Linux Driver 移植。
操作1:确定型号插入TP-link USB wifi,提示UT@utcooker:/data # 插入前后lsusbBus 001 Device 007: ID 0bda:8179得知idVendor=0bda, idProduct=8179,确认芯片型号为8188eu,TL-WN725N V2版本。
UT@utcooker:/data # netcfgsit0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00ip6tnl0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00操作2:测试驱动1)Realtek官方暂无8188eu linux 驱动。
下载相近型号芯片驱动源码。
进入os_dep\linux\usb_intf.c 查看RTL8192C_USB_IDS无{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8187)}2)github 下载驱动rtl8188eu-master.tar (经测试,热插拔有问题)rtl8188EUS_linux_v4.1.4_6773.20130222.tar.gz(可用)RTL8188EUS_RTL8189ES_linux_v4.1.7_9024.20130916.zip(可用)操作3:修改内核以RTL8188EUS_RTL8189ES_linux_v4.1.7_9024.20130916.zip为例,移植过程如下:1)确认linux内核有以下配置:[*] Networking support --->-*-Wireless ---><*> cfg80211 - wireless configuration API[*] cfg80211 wireless extensions compatibility2)打开makefileCONFIG_PLATFORM_I386_PC = y 改为CONFIG_PLATFORM_I386_PC = nCONFIG_PLATFORM_ARM_S3C2K4 =n 改CONFIG_PLATFORM_ARM_S3C2K4 = y 配置编译链及内核源码地址ifeq ($(CONFIG_PLATFORM_ARM_S3C2K4), y)EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIANARCH := armCROSS_COMPILE := /opt/FriendlyARM/gcc-toolschain/4.5.1/bin/arm-linux-KSRC := /svn/pengdonghui/Android_maize/linux-3.5-newEndif3)make –j32后得到8188eu.ko放入开发板:adb push 8188eu.ko /data加载驱动模块:UT@utcooker:/data # insmod 8188eu.ko[18668.230000] bFWReady == _FALSE call reset 8051...[18668.260000] usbcore: registered new interface driver rtl8188eu 查看网络设备:UT@utcooker:/data # ifconfig -a…wlan0 Link encap:Ethernet HWaddr 08:57:00:98:6B:31BROADCAST MULTICAST MTU:1500 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)此时,此时能看到网络接口,Android界面setting 无法打开wifi。
基于rk3568的linux驱动开发——gpio知识点基于rk3568的Linux驱动开发——GPIO知识点一、引言GPIO(General Purpose Input/Output)通用输入/输出,是现代计算机系统中的一种常用接口,它可以根据需要配置为输入或输出。
通过GPIO 接口,我们可以与各种外设进行通信,如LED灯、按键、传感器等。
在基于Linux系统的嵌入式设备上开发驱动程序时,熟悉GPIO的使用是非常重要的一环。
本文将以RK3568芯片为例,详细介绍GPIO的相关知识点和在Linux驱动开发中的应用。
二、GPIO概述GPIO是系统中的一个基本的硬件资源,它可以通过软件的方式对其进行配置和控制。
在嵌入式设备中,通常将一部分GPIO引脚连接到外部可编程电路,以实现与外部设备的交互。
在Linux中,GPIO是以字符设备的形式存在,对应的设备驱动为"gpiolib"。
三、GPIO的驱动开发流程1. 导入头文件在驱动程序中,首先需要导入与GPIO相关的头文件。
对于基于RK3568芯片的开发,需要导入头文件"gpiolib.h"。
2. 分配GPIO资源在驱动程序中,需要使用到GPIO资源,如GPIO所在的GPIO Bank和GPIO Index等。
在RK3568芯片中,GPIO资源的分配是通过设备树(Device Tree)来进行的。
在设备树文件中,可以定义GPIO Bank和GPIO Index等信息,以及对应的GPIO方向(输入或输出)、电平(高电平或低电平)等属性。
在驱动程序中,可以通过设备树接口(Device Tree API)来获取这些GPIO资源。
3. GPIO的配置与控制在驱动程序中,首先要进行GPIO的初始化与配置。
可以通过函数"gpiod_get()"来打开指定的GPIO,并判断其是否有效。
如果成功打开GPIO,则可以使用函数"gpiod_direction_output()"或"gpiod_direction_input()"来设置GPIO的方向,分别作为输出或输入。
实验二:字符设备驱动实验一、实验目的通过本实验的学习,了解Linux操作系统中的字符设备驱动程序结构,并能编写简单的字符设备的驱动程序以及对所编写的设备驱动程序进行测试,最终了解Linux操作系统如何管理字符设备。
二、准备知识字符设备驱动程序主要包括初始化字符设备、字符设备的I/O调用和中断服务程序。
在字符设备驱动程序的file_operations结构中,需要定义字符设备的基本入口点。
open()函数;release()函数read()函数write()函数ioctl()函数select()函数。
另外,注册字符设备驱动程序的函数为register_chrdev()。
register_chrdev() 原型如下:int register_chrdev(unsigned int major, //主设备号const char *name, //设备名称struct file_operations *ops); //指向设备操作函数指针其中major是设备驱动程序向系统申请的主设备号。
如果major为0,则系统为该驱动程序动态分配一个空闲的主设备号。
name是设备名称,ops是指向设备操作函数的指针。
注销字符设备驱动程序的函数是unregister_chrdev(),原型如下:int unregister_chrdev(unsigned int major,const char *name);字符设备注册后,必须在文件系统中为其创建一个设备文件。
该设备文件可以在/dev目录中创建,每个设备文件代表一个具体的设备。
使用mknod命令来创建设备文件。
创建设备文件时需要使用设备的主设备号和从设备号作为参数。
阅读教材相关章节知识,了解字符设备的驱动程序结构。
三、实验内容根据教材提供的实例。
编写一个简单的字符设备驱动程序。
要求该字符设备包括open()、write()、read()、ioctl()和release()五个基本操作,并编写一个测试程序来测试所编写的字符设备驱动程序。
嵌入式Linux下AD7490驱动的实现摘要:用AD7490对s3c2440进行了扩展,提高其数模转换精度。
介绍了嵌入式Linux 操作系统下AD7490驱动程序的开发原理及流程,并编写测试程序测试其功能,对于基于Linux的嵌入式系统中小型外设的开发具有借鉴意义。
关键词:A/D;s3c2440;嵌入式Linux;ARM;驱动程序A/D 转换是控制系统的基本组成部分,为了满足高精度、高速度的A/D转换应用要求,需要在嵌入式的控制系统中外接高性能的A/D转换芯片。
s3c2440本身自带8通道10位A/D转换器,在要求不高的情况下可以直接使用,但是当测量精度、速度要求较高时,片内的A/D转换器往往不能满足要求,所以我们利用s3c2440的外部接口资源直接进行扩展,使用独立的A/D 转换芯片AD7490。
在嵌入式Linux系统下,要对AD7490进行操作,需要编写相应的驱动程序。
设备驱动程序为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。
1AD7490工作原理AD7490是AD 公司推出的12 位16 通道高速、低功耗、逐次逼近式AD 转换器。
它带有高速的串行接口SPI ,所以很容易与微处理器接口。
本设计中采用IO口模拟SPI的方式实现对AD7490的操作,使用了s3c2440的通用IO口GPG0、GPG1、GPG2、GPG3。
AD7490位控制字从s3c2440 的MOSI 模拟脚即GPG1输出,由AD7490 的DIN 端读入AD控制寄存器,根据输入控制字,把规定一路送到采样保持电路,对此信号进行采样;②AD7490 向s3c2440发送前次转换结果的数据,在AD7490 的输出数据寄存器中保存的前次A/ D 转换结果通过DOU T 端在每个时钟的下降沿输出给s3c2440的MISO模拟脚,即GPG3。
A/ D 转换周期在最后一个时钟下降沿完成,片内转换器对采样值进行逐次逼近式A/ D 转换,转换结果在转换完成后锁存在输出数据寄存器中,在下一个转换过程输出。
基于嵌入式Linux的LED驱动开发与应用摘要:简要介绍了基于嵌入式ARM处理器芯片LPC3250的嵌入式Linux的LED驱动程序的开发原理、流程以及相关主要接口硬件电路的设计。
实际运行结果表明,该设计完全达到预期效果。
关键词:嵌入式Linux;LED;硬件;驱动程序0引言随着IT技术和嵌入式技术的快速发展,嵌入式产品已经广泛应用于工业、能源、环保、通信等各个行业,显示出其强大的生命力。
Linux是当今流行的操作系统之一,具有源代码开放、内核稳定、功能强大和可裁减等优点而成为众多应用的首选。
同样嵌入式Linux也继承了Linux的诸多优点。
对Linux应用程序来说,由于设备驱动程序屏蔽了硬件的细节,其硬件设备将作为一个特殊的文件,因此应用程序可以像操作普通文件一样对硬件设备进行操作。
本设计中驱动的设备是基于NXP公司的LPC3250微处理器开发的LED信号指示灯,利用这些指示灯来显示仪器的运行状态,方便用户了解仪器的工作状况。
1LPC3250简介及接口电路设计本设计中主控芯片采用LPC3250微处理器,具有高集成度、高性能、低功耗等特点。
它采用90nm工艺和ARM926EJS内核,主频最高为208MHz,具有全系列标准外设。
其中包括带专用DMA控制器的24位LCD控制器,可支持STN和TFT面板。
充分满足本设计的需要,外部只需加入很少芯片就可实现系统功能<sup>[1]</sup>。
LPC3250共有296个管脚。
对于4个LED灯来说需要用到4个引脚,这里使用GPIO端口来设计,GPM1~GPM3作为LED灯的控制端口,另外还需要为LED提供电源,这里需要3.3V的直流电源。
接口电路设计如图1所示。
GPM0~GPM3分别与电阻、LED连接,当GPM0~GPM3置为低电平时,相应的LED灯点亮。
2驱动程序设计在嵌入式Linux操作系统下,有三类主要的设备文件类型:字符设备、块设备和网络设备<sup>[2]</sup>。
嵌入式系统实验报告Linux 设备驱动实验学院专业学生姓名实验台号指导教师提交日期一、实验目的1.了解Linux驱动程序的结构;2.掌握Linux驱动程序常用结构体和操作函数的使用方法;3.初步掌握Linux驱动程序的编写方法及过程;4.掌握Linux驱动程序的加载方法。
二、实验内容1.实现helloworld驱动,观察驱动的加载和释放过程;2.根据参考代码,分析数码显示驱动的结构和原理,给出设备程序的主要组成部分框图;3.利用数码显示驱动模块,编写测试程序实现按键对数码显示的控制,包括点亮和关闭,显示不同数字等。
三、实验原理3.1驱动程序介绍驱动程序负责将应用程序如读、写等操作正确无误的传递给相关的硬件,并使硬件能够做出正确反应的代码。
驱动程序像一个黑盒子,它隐藏了硬件的工作细节,应用程序只需要通过一组标准化的接口实现对硬件的操作。
3.2 Linux设备驱动程序分类Linux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。
虽然Linux内核的不断升级,但驱动程序的结构还是相对稳定。
Linux系统的设备分为字符设备(char device),块设备(block device)和网络设备(network device)三种。
字符设备是指在存取时没有缓存的设备,而块设备的读写都有缓存来支持,并且块设备必须能够随机存取(random access)。
典型的字符设备包括鼠标,键盘,串行口等。
块设备主要包括硬盘软盘设备,CD-ROM等。
网络设备在Linux里做专门的处理。
Linux的网络系统主要是基于BSD unix的socket 机制。
在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据传递。
系统有支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。
3.3驱动程序的结构驱动程序的结构如图3.1所示,应用程序经过系统调用,进入核心层,内核要控制硬件需要通过驱动程序实现,驱动程序相当于内核与硬件之间的“系统调用”。
GPIO驱动实验一、实验目的1.理解Linux GPIO驱动程序的结构、原理。
2.掌握Linux GPIO驱动程序的编程。
3.掌握Linux GPIO动态加载驱动程序模块的方法。
二、实验内容1. 编写GPIO字符设备驱动程序。
2. 编写Makefile文件。
3. 编写测试程序。
4. 调试GPIO驱动程序和测试程序。
三、实验设备1.硬件:PC机,基于ARM9系统教学实验系统实验箱1台;网线;串口线,电压表。
2.软件:PC机操作系统;Putty;服务器Linux操作系统;arm-v5t_le-gcc交叉编译环境。
3.环境:ubuntu12.04.4;文件系统版本为filesys_clwxl;烧写的内核版本为uImage_slh_gpio,编译成的驱动模块为davinci_dm365_gpios.ko,驱动源码见GPIO文件夹。
四.预备知识4.1 概述在嵌入式系统中,常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。
而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,例如灯的亮与灭。
对这些设备/电路的控制,使用传统的串行口或并行口都不合适。
所以在微控制器芯片上一般都会提供一个通用可编程I/O接口,即GPIO (General Purpose Input Output)。
GPIO的驱动主要就是读取GPIO口的状态,或者设置GPIO口的状态。
就是这么简单,但是为了能够写好的这个驱动,在LINUX上作了一些软件上的分层。
为了让其它驱动可以方便的操作到GPIO,在LINUX里实现了对GPIO操作的统一接口,这个接口实则上就是GPIO驱动的框架。
在本实验中,将编写简单的GPIO驱动程序来控制LCD液晶屏屏幕的亮灭,然后动态加载模块,并编写测试程序,以验证驱动程序。
4.2 实现的功能1> 设置对应的GPIO口为输出。
《嵌入式Linux驱动程序》PDFThe success's road嵌入式Linux驱动程序设计/doc/744669185.html,远见品质今天的内容v Linux驱动程序和应用程序的区别 v 嵌入式Linux驱动程序特点v 高效的嵌入式Linux内核和驱动程序开发 v 嵌入式Linux内核开发工具远见品质驱动程序对比应用程序v 应用程序是一个进程编程从主函数main()开始主函数main()返回即是进程结束v 驱动程序是一系列内核函数驱动程序向内核添加了一些函数,是内核的一部分üOpen() üRelease() üRead() üWrite() 这些函数由内核在适当的时候来调用这些函数可以用来完成硬件访问等操作远见品质Linux驱动程序介绍v 驱动程序的分类 v 设备驱动程序分字符设备块设备网络接口另外有一些设备驱动比较特殊,比如ip forwarding accelerator, cypher coprocessor, realtime extend hardware远见品质Linux驱动程序介绍(2)v 嵌入式Linux驱动已经支持的设备门类齐全,已成为linux相对其他嵌入式操作系统的一大优势工业控制常用的串口,并口人机输入设备鼠标,键盘,触摸屏彩色,黑白液晶显示输出远见品质Linux驱动程序介绍(3)v 嵌入式Linux驱动包含了完善的基础设施,这是Linux另一大优势网络的完善支持包括ü TCP/UDP/IP ü Firewall ü WLAN ü IP forwarding,IPSEC,VPN USB主机和设备的全面支持,包括ü USB Hard Disk,Flash Disk ü USB Camera ü USB 网卡ü USB HID 支持各种标准总线和I/O规范远见品质Linux驱动程序介绍(4)v 嵌入式Linux支持非常多的文件系统DOS/Windows兼容的vfat,NTFS Linux自有的ext2,ext3文件系统强大的企业级文件系统XFS,ReiserFS 针对嵌入式FLASH存储器设计的JFFS2/YAFFS2文件系统可堆叠统一化文件系统的UNIONFS cryptfs gzipfs 实现 Compression/Cipher on the Fly远见品质Linux驱动程序介绍(5)v 嵌入式Linux支持丰富的音频和视频硬件,以及各种流行的codec,包括mpeg4,wmv9,realvideo. v 嵌入式Linux支持图形硬件加速,可以充分利用图形硬件的强大功能 v 嵌入式Linux的驱动/图形库有DirectFB OpenGL ES Simple DirectMedia Layer QT-embedded GTK+ 2.0远见品质驱动程序的作用v 从传统嵌入式开发角度来看,Linux驱动程序是直接操控硬件的软件直接读写硬件寄存器,控制硬件操作设备缓冲区数据读写存储介质,比如flash或硬盘操作输出设备和执行机,例如打印,开关门襟等等远见品质驱动程序的作用(2)v 从应用软件编写人员来看,Linux驱动程序提供软件访问硬件的机制应用软件通过驱动程序安全高效的访问硬件驱动程序文件节点可以方便的提供访问权限控制驱动程序作为一个隔离的中间层软件,将底层细节隐藏起来,提高了软件的可移植性和可重用性接口鲜明的Linux 驱动程序便于将软件划分开, 并隔离有缺陷的代码,对于项目的管理有积极贡献远见品质访问Linux设备驱动的方法v 设备提供dev文件系统节点和proc文件系统节点 v 应用程序通过dev文件节点访问驱动程序字符型驱动一般通过标准的文件I/O访问块设备在上层加载文件系统,比如以FAT32 的形式访问网络设备通过SOCKET来访问v 应用程序通过proc文件节点可以查询设备驱动的信息远见品质驱动程序在哪儿v 驱动程序位于内核源代码的drivers目录下,按照层次结构分门别类放置v 驱动程序占kernel源代码超过50%. v 开发完毕的驱动程序,放置在/lib/modules/kernel-version里远见品质嵌入式Linux驱动程序特点v 嵌入式Linux驱动程序需求多样嵌入式设备硬件各异嵌入式处理器往往资源有限,比如处理速度, 存储器容量,总线带宽,电池容量等v 开发团队面临上市时间的压力v 开发驱动程序需要专业知识,包括硬件和软件的远见品质典型的嵌入式设备框图远见品质典型的嵌入式设备框图v Intel PXA远见品质嵌入式Linux驱动程序特点(2)v 嵌入式系统硬件还在不停的更新进步v 国际上嵌入式芯片提供商如intel, samsung,freescale,TI,ST 每年都有新品推出v Linux对于ARM,PPC/PPC64, MIPS/MIPS64,x86都有很好的支持v 芯片花样繁多的功能总是需要相应的驱动程序远见品质Linux驱动程序开发流程v 熟悉设备的特性 v 确定设备驱动程序是哪一类 v 编写测试用例 v 搜集可重用的代码 v 编写自己的驱动程序代码 v 调试,编码,测试远见品质Linux驱动程序的开发环境v 本机编译调试开发环境配置简单无需网络环境适用于配置较高的x86机器v 主机+目标机主机可以自由选择Linux或Windows+Cygwin 主机和目标机通过网络共享文件系统内核崩溃不会影响主机远见品质Linux驱动程序的开发环境v 主机+目标机环境包括主机运行的工具链:cross gcc + glibc + gdb, 如果是windows主机还要有cygwin仿真环境主机运行远程服务,常用的有tftp用来传送内核映像,initrd,nfs用来共享文件系统目标机运行ssh或telnet等远程登陆服务,用来调试驱动程序。
嵌入式ARM平台下的Linux字符设备驱动实例
6.1 下面以一个名为S3C2440_leds.c”的简单控制目标板LED亮灭的驱动为例进行分析。
(目标板为天嵌TQ2440;Linux2.6.25.8)。
主要功能是通过应用程序调用该驱动来按制目标板的四个LED灯的亮灭。
驱动源程序如下:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>
#define DEVICE_NAME "leds" /* 加载模式后,执行”cat /proc/devices”命令看到
的设备名称*/
#define LED_MAJOR 231 /* 主设备号*/
/* 应用程序执行ioctl(fd, cmd, arg)时的第2 个参数*/
#define IOCTL_LED_ON 0
#define IOCTL_LED_OFF 1
/* 用来指定LED 所用的GPIO 引脚*/
static unsigned long led_table [] = {
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB7,
S3C2410_GPB8,
};
/* 用来指定GPIO 引脚的功能:输出*/
static unsigned int led_cfg_table [] = {
S3C2410_GPB5_OUTP,
S3C2410_GPB6_OUTP,
S3C2410_GPB7_OUTP,
S3C2410_GPB8_OUTP,
};
/*应用程序对设备文件/dev/leds 执行open()时,
*就会调用s3c24xx_leds_open */
static int s3c24xx_leds_open(struct inode *inode, struct file *file)
{
int i;
for(i=0; i<4; i++)
{
s3c2410_gpio_cfpin(led_table[i], led_cfg_table[i])
}
return 0;
}
/*应用程序对设备文件/dev/leds 执行iotcl()时,
*就会调用s3c24xx_leds_iotcl
*/
static int s3c24xx_leds_iotcl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
if (arg > 4)
{
return -EINV AL;
}
switch(cmd) {
case IOCTL_LED_ON:
s3c2410_gpio_setpin(led_table[arg], 0);
return 0;
case IOCTL_LED_OFF:
s3c2410_gpio_setpin(led_table[arg], 1);
return 0;
default:
return -EINV AL;
}
}
/*这个结构是字符设备驱动程序的核心
*当应用程序操作设备文件时调用的open、read等函数,
*最终会调用这个结构中指定的对应函数
static sturct s3c24xx_leds_fops = {
.owner = THIS_MODULE,
.open = s3c24xx_leds_open,
.ioctl = s3c24xx_leds_ioctl
};
/*模块的初始化函数*/
static int __init s3c24xx_leds_init(void)
{
int ret;
ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &s3c24xx_leds_fops);
if(ret < 0)
{
printk(DEVICE_NAME "can't register major number\n");
return ret;
}
printk(DEVICE_NAME "initialized\n");
return 0;
}
/*模块的撤销函数*/
static void __exit s3c24xx_leds_exit(void)
{
unregister_chrdev(LED_MAJOR, DEVICE_NAME);
}
/*指定驱动程序的初始化函数和卸载函数*/
module_init(s3c24xx_leds_init);
module_exit(s3c24xx_leds_exit);
/*加入描述信息*/
MODULE_AUTHOR("ckz");
MODULE_DESCRIPTION("S3C2440 LED Driver");
MODULE_LICENSE("GPL");
写好的驱动放在内核源文件目录下:linux2.6.25.8]#drivers/char/
6.2 以模块形式编译及加载
修改同目录下的“Kconfig”文件,在合适的地方添加如下内容:
Config S3C2440_LEDS
tristate “S3C2440 LEDS Driver”
depends on ARCH_S3C2440
help
LEDS on S3C2440
然后再通目录下修改“Makefile”,添加如下内容:
Obj-$(CONFIG_ S3C2440_LEDS) += S3C2440_leds o
添加完成以上内容之后,输入#make menuconfig,然后配置如下
Device Drivers -
Character devices ->
<M> S3C2440 LEDS Driver
将其选择为“M”,然后保存配置,编译出内核镜像烧写到开发板中。
然后再使用命令#make SUBDIR=drivers/char modules,编译出驱动模块,在内核目录下的“drivers/char”下面,名为S3C2440_leds.Ko,将其复制到开发板中的/lib目录中。
加载、卸载驱动到目标系统中。
在/lib目录下:
***] insmod S3C2440_leds.KO /***加载驱动***/
***] rmmod S3C2440_leds.KO /***卸载驱动***/
6.3 下面编写简单的应用程序来测试刚才的驱动程序,新建名为leds.c的文件
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
int main(int argc, char **argv)
{
int on;
int led_no;
int fd;
if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 || on < 0 || on > 1 || led_no < 1 || led_no > 4) {
fprintf(stderr, "Usage: leds led_no 0|1\n");
exit(1);
}
fd = open("/dev/GPIO-Control", 0);
if (fd < 0) {
perror("open device leds");
exit(1);
}
ioctl(fd, on, (led_no-1));
close(fd);
return 0;
}
因为这只是一个简单的应用程序所以没有必要编写Makefile文件,直接使用arm-linux-gcc 命令编译并将其传到目标板上运行即可!
在终端中输入:./leds 2 0
则目标板上的第二个LED灯亮被点亮。