文档介绍:实验十三:LED点阵驱动
一、 实验目的:
编写一个针对总线操作的硬件驱动程序。
二、 实验内容:
编写一个针对硬件LED点阵的驱动程序。
三、 实验原理及步骤
实验原理:
Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系 统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是 Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现 上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。
本实验中采用的8X8点阵数码管发光原理:,8X8点阵共由64个发光二极管组 成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电 平,某一行置0电平,则相应的二极管就亮。在本开发板上,整个LED显示模 块是作为一个I/O进行控制的。DATA [0.. 7], DATA [8.. 15]分别对应系统数据线 的低16位,LED_L0CK信号是由系统总线的写信号和地址信号经简单的逻辑组合 而得。
在本实验中,ssize_t SIMPLE LED write ()这个函数很关键,在这个函数中 定义了两个数组来控制LED阵列的行和列。通过前几个实验的操作,我对驱动程 序的编写又有了更进一步的认识。在本实验中,我将没有完成的程序补充完全, 实验步骤如下。
实验步骤:
1硬件连接:连接宿主PC机和一台PXA270-EP g标板。
2在宿主机上编写编译驱动程序:需要在宿主PC机端编辑三个文件,分别是驱 动程序、编译驱动程序时用的Makefile、测试程序。
3在终端输入vi pxa270_led_ary_drv. c后开始编辑驱动程序,添加的代码部 分截图及说明如下:
(1)补充showversion ()函数用于显示版本号;补充read()函数,对字符 型设备进行读操作。
(2)补充ioctl()函数,可实现读写之外的控制;补充open()函数,打开 设备时调用。
⑦ 072355zuojun.
r 7赠回吐取出
a
补充open()函数, 备时调用
补充ioctl()函数,可实现读 写之外的控制
return 0;-INSERT ——
94,11-18
41%
File Edit View Terminal Go Help
// IOCTL
ssize_t SIMPLE_LED_ioctl (struct inode * inode ,struct file * file, unsi cmd, long data)
#ifdef OURS_LED_DEBUG
printk ("SIMPLE_LED_ioctl [ ―kernel—]\n");
#endif
return 0;
// OPEN
ssize_t SIMPLE_LED_open (struct inode * inode .struct file * file)
#ifdef OURS_LED_DEBUG
printk ("SIMPLE_LED_open [ --kernel--]\n");
#endif
M0D_INC_USE_C0UNT;
(3)补充file_operations ()函数,指出设备驱动程序所提供的入口点位置,
(4)补充编写模块程序时必须提供的两个函数,一个是int init-module (void), 供insmod在加载此模块的时候自动调用,负责进行设备驱动程序初始化工 , void cleanup_module(void),在模块被卸载时调用,负责进行设备驱动程序的清 除工作•
补充 intinit-module(void),供insmod在加载此模块的时候自
static int _init pxa270_LED_CTL_init(void) {
int ret = -ENODEV;
#ifdef OURS_LED_DEBUG 、 动调用
printk ( "pxa27O_LED_CTL_init [ —kernel—]\n") ;
#endif
ret = HW_LED_CTL_init(); if (ret)
return ret;
return 0;
static void _exit cleanup_LED_ctl(void)
#ifdef OURS_LED_DEBUG
printk (*'cleanup_LED_c11 [ ―kernel—]\n") #endif
outw(0x0000,ioremap_addr);
devfs-unr^