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

一、硬件部分

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、 这时候我们就可加载卸载模块了

最后看下效果图


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值