找回密码
 注册
关于网站域名变更的通知
查看: 266|回复: 1
打印 上一主题 下一主题

迅为4412开发板-实验LEDS驱动一

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-1-5 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
14.1 本章导读1 ?$ W" e! i! Q  s7 @% A
本节实验介绍一个完整的 GPIO 驱动,以后在 Linux 中需要处理 GPIO 驱动都可以仿照或
! |  T+ Q  O( m1 Y/ e5 `者移植这个驱动。9 _0 Y3 H  I2 S8 [% T
14.1.1 工具& Z7 W, I& A; I3 g3 `
14.1.1.1 硬件工具
( B. L: r7 |/ G! |( {+ z9 A0 e* k1)iTOP4412 开发板  e9 a) G2 ]* v* h3 K
2)U 盘或者 TF 卡
  R2 O6 B1 O& n8 p. Z3)PC 机
. e4 f: B+ q' l  Q0 }  b  J  L4)串口. K/ d, G3 w1 D# B4 g$ i
14.1.1.2 软件工具
6 W+ f) K( g5 ]# U. {; g" c* X1)虚拟机 Vmware
$ u7 d2 ^! K: m2)Ubuntu12.04.2$ n* s; N3 m2 @* p7 z0 B# Z7 W
3)超级终端(串口助手)7 v' P# Y7 B8 `! ]8 k4 U- l7 |. U4 ]
4)源码文件夹“leds”
' N9 z8 v' h3 O* Q. r5 g9 ?2 i14.1.2 预备课程. d4 l& T4 m/ c$ J' X0 C: C
实验 12_物理地址虚拟地址
- {" q: o8 T/ @5 _) \& L1 v实验 13_GPIO 初始化) S/ Q! N! q5 t$ t/ J+ M- O. g
14.1.3 视频资源
) i6 v, |. `+ s  I本节配套视频为“视频 14 LEDS 驱动一”8 d( }$ v+ _' x7 ~2 r: ~( u; Q8 J
14.2 学习目标
' A& x1 \5 i5 a* a: M. _4 S本章需要学习以下内容:
8 V, K2 `" x& x7 ~! E  {! y6 fLed 硬件原理简单介绍
  ?& |8 d1 n7 U/ MLed 管脚的调用、赋值以及配置
) i3 L8 ?  h0 \9 ~编写简单应用调用 LED 管脚,并测试
4 S$ H- ^3 P1 }5 r14.3 Led 硬件原理简单介绍8 Q6 [9 G; j8 P3 b
Led 的电路比较简单,一般是使用三极管搭建一个控制电路。; H, u4 }* r. N5 _9 I
如下图所示,是原理图中两个 Led 的控制电路。KP_COL0 和 VDD50_EN 网络控制 Led的通断。( e1 S/ O! }8 M1 e8 B0 _
, R3 v. i3 K6 l& X
如上图所示。/ ^: [* M& J8 v5 P+ W) ?2 G; x& c
当 KP_COL0 和 VDD50_EN 网络时高电平的时候,三极管 L9014 的 BE 导通,CE 导通,相当于 5V 的 VSYS 电压加到 1K 和 Led 小灯上,小灯就会亮。3 `$ S4 O: s$ ~% t9 t0 ?
当 KP_COL0 和 VDD50_EN 网络时低电平的时候,三极管 L9014 的 BE 会截止,CE 截止,相当于 5V 的 VSYS 电压加到 1K、Led 小灯和一个无限大的电阻上,电流为零,小灯就会灭。
8 X: }( H' }: @( x$ V) p) V: u14.4 Led 管脚的调用、赋值以及配置6 T/ f1 S8 Q" p+ L, B
本节给大家介绍一部分涉及 GPIO 调用、赋值以及配置的函数。
) i2 T# z/ c7 Z, b14.4.1 GPIO 申请和释放函数
1 W0 A: m3 o) |想用使用任何一个 GPIO 都必须先申请。
# @: e+ E' j$ B6 z, z3 r0 U2 d在头文件“include/linux/gpio.h”中有 Linux 默认的 GPIO 申请函数,这个头文件是属于嵌入式 Linux 平台,任何一个嵌入式 Linux 内核都可以这么使用。/ @: C$ G) q0 P4 X/ E, A3 s
如下图所示,在源码目录中使用命令“vim include/linux/gpio.h”打开该文件。
1 q- G5 }/ L/ _; H' N5 s. G8 k6 u2 ]- W+ n% G- I- e6 d
如下图所示,就是本节实验中需要用到的函数 gpio_request。- ?2 d# k. S  C0 ^1 {2 D7 e! _

0 Z1 j: s7 H) F. R+ ]: j( P5 P5 C如上图所示,简单介绍一下 gpio_request 函数。
. P" Y" {  M: E7 m5 J6 `% R首先这个函数有一个重要的“检测”功能,就是如果其它地方申请了这个 IO,那么这里就会返回错误,提示已经被占用了,这是 Linux 中的一个标准用法。
6 B9 L* r# I. |* o# U' fgpio_request 函数有两个参数
! N( G1 b9 V$ g8 U% l: i! qunsigned gpio,申请的那个 GPIO,一般是 GPIO 对应的宏定义
! R) _9 {5 I  a& m% nconst char *label,为 GPIO 取个名字,便于阅读
) e# J) D6 u$ D: ~4 I如下图所示,和 gpio_request 函数对应的是 gpio_free 函数。
% D& T* o, ^1 {
$ c) U) c6 W" f; Y2 M, q在调用 gpio_request 函数之后,向系统表明这个 IO 已经被占用了,在卸载驱动的时候一般需要调用 gpio_free 函数将其释放。
, e- R' S3 O0 X# ngpio_free 函数的参数比较简单,只有一个 GPIO 参数,使用 GPIO 对应的宏定义即可。$ n3 S& N% z2 c, y2 M) _7 b
如下图所示,还有一个赋值函数 gpio_set_value。" d  s4 P9 y6 g" K# k# C# T7 z# _

' `; P0 b! |6 C) M1 t0 d) v在将 GPIO 配置为输出模式之后,还需要给 GPIO 赋值,一般就是高电平和低电平两种。
8 |0 o7 @" D+ n; G: Q两个参数分别为
: M( _1 Y6 X, R& O. Funsigned gpio,GPIO
2 L6 R) z* }. Y/ |int value,高电平 1 和低电平 0。
4 c) l7 \, A$ V9 B3 g4 H14.4.2 GPIO 配置参数宏定义1 D+ G* J" d/ `+ }. U
GPIO 在 Linux 初始化,进行映射之后调用 GPIO 操作函数对 GPIO 宏定义进行操作就是对 GPIO 的操作。% X* }% Z' b5 I
这个 GPIO 宏定义文件都是由原厂提供,肯定是已经做好的,属于 BSP 板级开发包。
  U6 N2 n$ c  J3 ^& n. n如下图所示,在源码目录中使用命令
/ X' r9 {, f+ r2 \“vim arch/ARM/mach-exynos/include/mach/gpio-exynos4.h”打开该文件。1 L7 n9 |1 A0 s$ B

; O2 U4 w, }. c如下图所示,可以看到所有的 GPIO 都已经定义了。' R0 V0 q' ]  z

" U  W  p9 W2 E. h; w0 h3 ]在原理图中查找 KP_COL0、VDD50_EN 网络,最终连接到 4412 上的部分如下图所示。
; i) g( M- C) W! L& V  E9 K& \: G9 j
% D1 i0 W" z( Q如上图所示,则两个 Led 的宏定义为 EXYNOS4_GPL2(0),EXYNOS4_GPK1(1)。, K& [4 s: A, y! y& S" i: @
14.4.3 GPIO 配置函数和参数
0 k2 P/ [  V$ w* d. ~7 d4 m在 Linux 中,对 GPIO 的配置函数以及参数都已经集成到三星板级开发包中。- S$ F# u5 L* K# ^) n4 e
先来看一下配置函数,如下图所示,在源码目录中使用命令( p1 W3 I5 a! Q: v- l' @/ d# L
“vim arch/arm/plat-samsung/include/plat/gpio-cfg.h”打开该文件。3 v8 q* ^/ Z$ G! e( \7 _3 _4 x

: B( e! V$ l' Y如下图所示,s3c_gpio_cfgpin 函数就是本节实验需要的。
$ h( `6 l( N9 R: N/ H/ K- s
  H& F& r! p0 _! v! v如上图所示,函数 extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);
  |8 l- d+ W' G6 c1 X% d一般来说带有 s3cxxx 的函数就是三星平台能够通用的函数。
0 T  h* w) Q: Fs3c_gpio_cfgpin 管脚配置函数有两个参数! }) K+ O3 ]: n5 q. T0 j+ _# l5 I
参数 unsigned int pin,管脚
- R# h* j0 l5 p% K/ w( E参数 unsigned int to,配置参数。
' m# }" w' ?" y( ?: q- v' R再来看一下配置参数,如下图所示,在源码目录中使用命令0 j0 z! M. m$ v/ Z+ u# L
“vim arch/arm/plat-samsung/include/plat/gpio-cfg.h”打开该文件,配置参数和函数是在同一个函数中。3 F( @& b; P4 f1 K
( G" F/ X3 B  l: ^! w/ Y
如下图所示,对于 GPIO 需要将其配置为输出模式,对应 S3C_GPIO_OUTPUT 宏定义。
0 s$ u% ]* I9 N. u8 ?- i9 @/ t
* S' e$ K  e9 S& V14.5 编写简单应用调用 LED 管脚,并测试; A0 F8 f7 _) M* z9 ^) p
在前面的 devicenode_linux_module.c 文件上添加代码,首先将文件名devicenode_linux_module.c 改为 leds.c。4 e6 K6 T; ]1 U* \5 i: f
先处理一下编译文件 Makefile,如下图所示,将 devicenode_linux_module 改为leds。
8 m- N2 U, |$ {. D7 d! l4 l* F3 Q% D2 e
接着修改 leds.c 文件。
1 X) I: `) O' a首先添加需要的头文件,如下图所示,分别是申请 GPIO、配置函数、配置参数、GPIO宏定义等的头文件。然后将设备节点名称由 hello_ctl123 修改为 hello_ctl, x. {5 T3 R$ X' C8 ^

$ `' u! H$ e; W) W然后需要修改的就是 probe 函数,一般说来 GPIO 的初始化都是在 probe 中。如下图所示,调用配置函数以及配置函数。) t+ d0 a2 y4 H# j. w4 [  H- I1 H

6 @3 R5 b$ }" n4 I+ r9 T然后就是修改一下 ioctl 函数,在 Linux 中对 GPIO 的控制一般是使用 ioctl,虽然 write函数也可以实现类似的功能,但是 ioctl 函数的效率高一些。如下图所示,根据应用传入的参数给 GPIO 赋值。& y7 [  P+ c1 C  X
7 m) {% f! ~5 [
如上图所示,先对于参数做一个简单的判断,然后给 led 赋值。
) D. i6 z' G7 q5 n接着再来看一下应用,如下图所示,应用比较简单,调用延时函数,首先将 Led 点亮三秒,然后再灭掉三秒,再点亮。4 D" ]. S0 ~( G2 m: ?
! x' Z' z+ s6 I9 s
在 Ubuntu 系统下新建 leds 文件夹,将写好的 leds 和编译脚本拷贝到 leds 文件夹下,使用 Makefile 命令编译驱动,使用1 l! z/ ]- M4 b$ _' M$ O( w8 D
“arm-none-linux-gnueabi-gcc -o invoke_leds invoke_leds.c -static”命令编译应用。如下图所示
/ Q' f: ]" A5 T. q% B, {+ u) k& F* [) E/ v% n
将上图中的文件 invoke_leds 和 leds.ko 拷贝到 U 盘。
: U1 [+ }3 }. Z启动开发板,将 U 盘插入开发板,使用命令“ mount /dev/sda1 /mnt/udisk/”加载 U盘符,# h9 [2 V  B, I- x- R
使用命令“ insmod /mnt/udisk/leds.ko ”加载驱动 leds.ko,
, O0 K1 d5 ]" d9 {1 |& Y( M% V' F使用命令“./mnt/udisk/invoke_leds”运行小应用 invoke_leds,如下图所示。
: g- ?4 X" o- @$ T
% K, S. Z; N- `0 x经过上面的操作可观察到 led 小灯会一亮一灭一亮,中间大概间隔三秒钟。
, c9 m& W# r' _) T9 q& e+ j# V" `( e
+ p2 r4 t% y% d8 l' @* I% E) X
9 x( z" G" P  M0 \: P% f
  • TA的每日心情
    开心
    2023-1-3 15:10
  • 签到天数: 2 天

    [LV.1]初来乍到

    2#
    发表于 2021-1-5 13:09 | 只看该作者
    看着还不错
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-25 01:47 , Processed in 0.171875 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表