一、硬件部分
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、 这时候我们就可加载卸载模块了
最后看下效果图