您的位置:首页 > 编程语言

驱动实战-----OK6410驱动编程之led驱动1

2013-12-25 09:45 405 查看
一、硬件部分

1、LED灯的硬件连接



         


结论:

Led1-------gpm0

Led2-------gpm1

Led3-------gpm2

Led4-------gpm3

2、查看芯片手册



 

Gpmcon用于控制gpio的输入输出方向

Gpmdat 用于控制输出数据

Gpmpud 用于控制上下拉电阻的功能

 

如何配置gpio?虽然之前在裸机编程部分已经做过这些工作了,但是毕竟是第一个实战驱动,知识点都梳理一下

1.gpmcon

结论:

Gpmcon用于控制gpiom的输入输出方向,其中这是一个24bit的寄存器,目前我们只关心输入输出两种状态,其他状态暂且不管

0000表示出入

0001表示输出

显然,我们需要的书cpu输出功能,所以我们关心的gpm0-gpm3都应该是0001

从而得出,GPMCON =0x1111

2.gpmdat

继续看原理图



结论:

很容易,从之前的原理图中得知,当我们输出低电平的时候,灯才会点亮,那么我们不妨让灯全亮

GPMDAT = 0x00

3.gpmpud

这里的上下拉我们还用不到,所以暂时不考虑,那么我们就可以开始进行代码的编辑了。

 

二、软件部分

 

1、Makefile

obj-m:=led.o
KDIR:=/home/shopping/work/kernel/s3c6410_driver/linux-3.0.1
PWD:=$(shell pwd)

default:
$(MAKE)-C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.ko *.o Module* module* *.mod.c  *~ *.out *.unsigned


makefile中有几个需要注意的地方

1、 原则上KDIR的路径所指示的源代码linux-3.0.1应该和开发板所使用的源代码版本一致,否则有可能出现驱动模块格式不对的情况

2、 记住内核源代码顶层目录使用的makefile中,cpu和交叉编译器应该修改

 

2、驱动部分

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <asm/io.h>
#include<linux/ioport.h>

#define GPIOM_BASE 0x7F008820

unsigned long VA;
unsigned long gpmdat,gpmpud,gpmcon;

void s3c_led_config(void)
{
unsigned tmp;
tmp = ioread32(gpmcon);
tmp &= (~0xFFFF);
tmp|= (0x1111);
iowrite32(tmp,gpmcon);

tmp= ioread32(gpmdat);
tmp&= 0x10;
iowrite32(tmp,gpmdat);
printk("s3c_led_config  ... \n");
}
void s3c_led_on(void)
{
unsigned tmp;
tmp= ioread32(gpmdat);
tmp&= 0x10;
iowrite32(tmp,gpmdat);
}
void s3c_led_off(void)
{
unsigned tmp;
tmp= ioread32(gpmdat);
tmp|= 0x1f;
iowrite32(tmp,gpmdat);
}

static int __init led_init(void)
{
VA = (unsigned long)ioremap(GPIOM_BASE,0x0c);
gpmcon = VA + 0x00;
gpmdat = VA + 0x04;
gpmpud = VA + 0x08;
s3c_led_config();
printk("led_init  ...\n");
return 0;
}

static void __exit led_exit(void)
{

s3c_led_off();
printk("led_exit  ...\n");
}

module_init(led_init);
module_exit(led_exit);

MODULE_LICENSE("GPL");


3、软件部分需要注意的是:

1、 内核不能直接操作物理地址,首先需要通过地址映射函数ioremap将物理地址映射为虚拟地址。

2、 对寄存器的配置采用的是读改写的方式,这里使用的读写函数时ioread32 、iowrite32

4、驱动部分没有过多的说明,下面主要谈谈我是如何让led灯亮起来的。

1、 编译出驱动模块led.ko 这个没有任何问题

2、 在redhat下面安装minicom,使用minicom来进行文件传输,minicom的安装在之前已经学习过,所以不详说

3、 在minicom中能看到如下界面



4、 这时候使用ctrl+A命令然后选择S发送文件就好了。

5、 昨晚上述步骤后,led.ko就在开发板上了,记住还要我们把该驱动文件拷贝到/lib/modules/3.0.1目录(如果该目录不存在,则创建该目录)

6、 这时候我们就可加载卸载模块了



最后看下效果图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OK6410 LED驱动