文件名称:
在Android上实现LED灯的驱动控制实例(图文).pdf
开发工具:
文件大小: 1mb
下载次数: 0
上传时间: 2019-09-14
详细说明:在Android上实现LED灯的驱动控制实例(图文)pdf,在Android上实现LED灯的驱动控制实例(图文)idefire GPMDAT 53C64XX GPMAT
defi
S3C64Xx GPMPJD
50. defire VIB ON Ox11
define工BFF0x22
static const sruct file_operations GrIo Viberator__ ops-
53
When
= THIS MOU二E,
54。
aper
GPIO VIB open
PTMT3“a
56
write
-GPIO VIB write,
57
i。ct1
GPIO IB loct
release
一 GPTQ TR e easE
ssizet GPIO VIB read(struct file file, char x buf, size t. count, loff t.
print k: GPTO VIB read \rin")
63
apio direcion output (53C54XX GPM(3), 0)://
return count i
5. ssizet GPIO VIB write (struct file x =iler ccnst char k buf, sizet
count, loff t f Opst
67
printk(" GPIO_ VIB write \r\n")
69
gpio_direction_ output (S3C64xx_GPM(3)r 1)://
r8 turn coun二
//ssizc t GPIO. ioctl(struct inode inode, s ruct filc filc, unsigned
int cmd, lorg data)
74. static int GPIC VIB ioctl(struct inode *inode, struct fil
*filc, unsigned int cmd, urigigncd long arz)
75
rintk KERN ERR"VIB: GPIO VIB ioccl--CMD-x n" cmd)i
C
78
79
CEsc IB ON:
80
gpio_direction output 33C4XX_GPK(-), C)://
81
gpio direction output S3C64XX_GPM(2) 0)i//
82
io direct主
3C64XXGP(3),5);//
83
gpio_direction_output S3C64xX_GPM(4), 1)i//
printk(KERN ERR"VIB: GPIO VIBiDc-1--VIB ON\n");
break
86
case VIB oFE
printk(KERN_ ERR"VIB: GP IO_ VIB_ioc-1--VIB_OFF\n",i
89
gpio direction output S3C64XX GDM(-)r 1)://
90
gpio_direction_ output S3C64XX-GPM(2), 1)i//
91
gpio direction_ output S3C64XX_GEM(3), 1);//
upio-direction_ output:_ GDM(4),C);//
93
break
94
defanlT: brEak
96
97
Y/ free (S 3C64XX_ SPN(7))i
10
ssizet GPIO VIB open (struct inode inode, sruct file file,
101.
102./??eey
//MOD TNC TISF COUNT
104
prir-k(GP IO VIB open() n"Ii
10七
retirn 0;
06,}
107, ssiz9t GPIO VIB release(struct inode t inode, struct file ile
10.
109
/ MCD_ DEC_ USE_COUNT;//?S:ccy?
printk(GPIO VIB release () \ n");
111
TCEEUEI
112.}
113. static int GPIC VIB CTL init (void)
114.
⊥⊥5,
1rt rct
ENQDEV:
116
int error i
117
prlntki'N
-rn");
//32:?22u
119
s3c_pio_cfgpin(S3C64*x_GPM(1) S3C_P-O_SFN (1))://GPMI output
s3c gpio cfgpin(S3C61XX_ GPM(2), S3CGP-0 SFN(1))://GPM2 output
121
s3c_gpio-cfgpin(33C64XX_GPM(3), 33C_EPO SIN (1))://GPM3 outrut
122,
s3c_ gpio-cfgpin(S3C64XX_GPM(4), S3C_CP=O_SFN(1))://GPM4 output
123.41f1/*?21?·?e?xq2a?y2+/
124. ret= register chrdev (Viberator MAJOR, viberatoi,
&GPIO V:berator ctl ops)i
125.if《ret<0)
126
printk KERN_ERR "VIB: unable to get major d\n", ret)
127
return ret:
129./1?”\uc1c1asa
13
vib_dew class- class_(TIlIS_ MODULE, viberator)i
131. if ( IS ERR; vib dev class))i
132,
unregister chrdev (Viberator MAJOR,"cap120)
135
return PTR ERR(vib dev class):
34.}
135,?21??
136.devi已e_ creaL(⊥b_dev_C1ass,NULL, MKDEV( VibeLdLur MAjOR,3)NULL,”v⊥b”)
137.// create a point under /dev/class/wib
138./11y6????a?2?S??y?26?200??1?/dev/c1ass/2???3\uc1ib?面?
2616231D0?0?221x÷222t:??2x÷?a??21u??1y\ clopen,wrie,read
1eo”y2×÷E????向????1?6??y3iD?
139
reter 0;
14
end⊥f
141.⊥f0/*x2a?-主7*/
142
if ((error allocchrdev_region (&dev, 0, DEVCOUNT, vibrate"))<0)
14
144
print. k (KERN FRR
14E
VIB: Coulan't alloc chrdev red-on, error=od\n
146
error)i
1
14s,
149
int<("de=是dn",dev)
15
cdev_p= cdev_alloc()
151
cdevp->ap3=&GPIO Viberator ctl opsi
152.
error cdev add(cdev_ _p, dev, DEVCOUNT);
15
f ( error) i
n54
printk (KERN_ERR
155
"工B:Cou1dn" t cdev add; error=号dn", error);
⊥5E
rcturn li
157
15忘
15
vibdcvclu3s-clas3 crcatc(THIS MODULE, "vib-dcv")i
16
if (IS_ERR(vib_dev_class)!
161
s- PTR ERR (vib dev class
goto out_ unreg_c⊥ass;
164
rC
165
#endif
uf rec_c1三s3
167
class destroy(vib dev class
16E
turn
171. static int init S3c6410 VIB init (void
172
irt ret --ENODEV:
174,
//÷6?0-色
175
printk(KERN_ERR" Auly: S3C6410VIBinit---\n")i
17E
re= GPIO VIB CTL init()
177
if(ret
17日
179
print k(KERN_ERR " Auly: S3C6410 VIBinit-Fail .!!\r")
return ret.
181
return
185
184. static void exit cleanup_ GPIO VIB(vcid)
185
⊥86
//xg?ucc±?
187
// devfs unregister chrdav (vibera-cr MA TOR, gpio vib ctl")
189
cdev del(cdev p)i
unregister_region(dev, DEVCOUNT)
class destroy (vib_dev class: i
192
#endif
19>. device_dest. ray (vih_dev_class, MKDEV (Viberator-MALTOR, 0)F
194. class_destroy (vib_dev_class);
unregister_ chrdev(Viberator MAJOR, "viberator")
19E
197. MODULE LICENSE ("GPL)i
19E. MODULE DESCRIPTION ("Peter tirst driver)
9. MODULE ALIAS CHARDEV (Viberator MAJOR, 0)i
20
201. module init(S3C6410VIB init);
202. module_exit(cleanup_G?IO_VIB);
driver.h文件
leddriver h文件
ssize_t GPIO VIBread(strust file k file, char bufr size_t countr loff_t
2
3312 t: Io VIB write( struct fl⊥e*土i⊥e, const char*buf,3ize_t
count r lofft s f_ops!i
atatic int GPIO VIB ioctl (struct inode inode, struct file
*file, unsigned int cmd, unsigned long are
ssize_t CPIO_VIE_open (struct inode inode, struct file s file):
5
33izct CPIO VIE rclcasc (struc= inode inode, struct filc filc)
tatic int GPIO VIB CTL init (veid)
Confi文件
Kconfig文件
config LEDTEST
tristate LED test for ARMeasy
3
ef两11tn
help
this is a led driver for ARMEASY with S3C6410
Makefile文件
Makefil|e文件
ch]-S(CUNE IG LEL'TEST)+=leddriverO
3、在内核配置里菜单里加入本驱动的配置项
达到的效果是,可以通过内核配置来选择是否把木驱动编译进大核里,也就是出现在make
menuconfig后出来的界面里,可以参考9.8章< Android添加新驱动方法〉
)在 arch/arm/Kconfig文件里men" Device drivers"与
enamel
之间添加
Source "drivers/ledtest/Kconfig"
)在 drivers/ Kconfig menu" Device drivers”和
已 nment
之问添加
source " drivers/ledtest/Kconfig"
3)修改/ drivers/ Makefile文件
Ch j-s(CONFIG_LEL TEST)+=ledtes:/
4、编译驱动
在 kernel目录下,终端输入
frake Inelluconric
“ Device drivers”下面会看到“ LED test for ARMeasy”,选择它
体存并退出
make
这样,就会在/ drivers/ detest目录下得到 leddrivr.ko文件,它就是驱动目标文件,已
级编译进了 zImage甲了,只要用这个 kernel烧录到开发板,开机就会自动加载木动,
PS,如果发现如上编译,没有在1 edtest日录下生成 leddriver.ko文件,也就是本根没有
去译本驱动,那就扣 Latest目录入到/ drivers/misc目录下,相应的修改misc下面,
然后,在 make file里,不用选育接写成obi-y+= leddriver.0,这样强制的包含进去编译。
、应用程序(测试驱动)
用C语言写一个应用,测试上面写的驱动是否工作正常,这是一殷的驱动开发流程
主要有两个文件: Android.mk和 Latest.c
1
在$( YOUR Android)/ axtorna/ LEDTEST/目录编写 lcdts.c文件,
ledtest
ledtest.c
Include
include // contact he open(,, close(,, read(),write( and so
+define DEVICE NAME "/dev/vib"//device point
井 define LED_ON
0x11
define LED○FF
x22
int main (int argc, char kkargv)
fdi
10
int ret
Char wi
(n start apio_1
ver test\
13
f:- open (DEVICE_NAVE, O_RDWR,;//Open device get -he handle
14
("fd s d \n"r fd)
15
if(fd
1)//open fail
17
print f(" sen dev⊥ce号 s error \ n",DEvI~ E NAME)
18
e1se
20
21
whiled
ioctl(td, LED_ CEF); //call the output -unction to off LEDS
s_eep(1)i//wait 1 second
tl(fd, LED_CN
eep()i
27
ret= close(fd)i //close device
printf
ad \ n", reti
30
p:inLr("close grio led Lest \:"I
31
}
return
33
2、在$ YOUR Android)/ externa1/ LEDTEST/月录编写 Android. mk文件。这是 Android
Makefile的标准命名,不要更改。 Android.lk文件的格式和内容可以参考其他凵有的
Android.mk文件的写法,针对 helloworld程序的 Android.mk文作冈容如下:
mk
2. LOCAL PATH:= s(call my-diL
3
include S(CLEAR VARS
LOCAL SRC_ FILES: - \\pEr
hello
LOCAL MOCULE : IedlesLapy
include $(BUILD EXECUTABLE)
注意上面 LOCAL SRC FILES用来指定源文件;
LOCAL MODULE指定要编译的模块的名字,下一步骤编译时就要用到
include$( BUILD EXECUTABLE)表示要编译成一个可执行文件,如果想编译成动态库则可用
BUILD SHARED LIBRARY,这些可以在
S(YOUR Android)/build/
ig,mk查到
3、回到 Android源代码顶层目录进行绽译
cd $(YOUR Android)&& make ledtestapp
例妇我这里的实际操作是
#cd Android. 1
#make ledtestapp
注意 make ledtestapr中的目标名 ledtestapp就是上面 Android.mk文件中由 LOCAL MODULE
指定的模块名。编译结果如下
make ledtestapp
==三三三三三三=三三=三
PLATFORM VERSION CODENAME=REL
PLATFORM VERSION=2. 1-update1
TARGET_PRODUCT=generic
TARGET BUILD VARIANT=eng
TARGET SIMULATOR=
TARGET BUILD TYPE=release
TARGET ARCH=arm
HOST ARCH=x86
HosT OS=linux
HOST BUILD TYPE=release
BUILD工D=ECLA工R
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓=〓〓〓〓〓〓〓〓=〓〓〓〓〓〓
/bin/bash: line 0: cd: sdk/layoutopt/app/src/resources: No such
file or directory
target thumb C: ledtestapp < external/LEDTEST/ledtestc
Install: out/host/linux-x86/bin/apriori
Install: out/ host/linux-x86/bin/soslim
target Executable: ledtestapp
(out/target/product/generic/obj/EXECUTABLES/ledtestapp_interme
diates/LINKED/ledtestapp)
target Non-prelinked: ledtestapp
(out/target/product/generic/symbols/system/bin/ledtestapp)
target strip: ledtestapp
(out/target/product/generic/obj/EXECUTABLES/ledtestapp interme
diates/ledtestapp)
Install; out/target/product/generic/system/lib/libdl,so
Install: out/target/product/generic/system/lib/libc.So
Install: out/target/product/generic/system/lib/libstdc++5o
Install: out/target/product/generic/system/lib/ibm.So
Install: out/target/product/generic/system/bin/ledtestapp
4、如上面的编译结果所示,编译后的可执行文件存放在
out/ target/ product./ generiC/ system/bin/目录可执行文件是 ledtestapp
5、拷贝 ledtestapp可执行文件到T卡,插入开发板
6、开电,在启动进入 Android的过程中,串口终端按回车,进入命令行模式
7、拷贝可执行文件到根目录
#cp /sdcard, ledtestapp
8、执行程序
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.