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