UT-S3C6410 ARM11 Linux 下的LED驱动
一 、实验环境
操作系统:fedora13
交叉编译环境:arm-Linux-gcc 或以上,
6410板子内核源码路径在:忘了,需要厂家给的内核源代码
硬件平台:S3C6410开发板(其他类型的开发板也可以注意配置GPIO)
注:交叉编译环境一定要装好,一般的开发板给的配套资料中都会有,安装过程也都有详细的过程,如果没有,亲,你只有自己解决了。也可以联系我(476695721@qq.com),泪奔支持你们。
二 、实验原理
控制LED是最简单的一件事情,就像学C语言时候写的“hello world”程序一样,是一个入门的程序。
首先来了解一下相关的硬件知识:
UT-S3C6410 LED原理图
UT-S3C6410 LED外部引脚图
从上面的原理图可以得知,LED与CPU引脚的连接方法如下,高电平点亮。 LED1 -GPM0 LED2 -GPM1 LED3 -GPM2 LED4 -GPM3
从数据手册可以找到相应的控制方法。这里我们以LED1为例,介绍一下LED1的操作方法,其他的类似,请大家自行分析。
通过上面可以得知,需要先将GPM0设置为输出方式。将寄存器GPMCON低四位配置成0001。
然后将GPMDAT寄存器的第0位置1灯亮,置LED0灯亮,开发板上有四个LED所以要对GPMDAT的低四位进行操作,就可以实现对灯的亮灭操作了。
三、实验步骤
1、编写驱动程序
mini6410_leds.c
#include
//#include
#include
#include
#include
static long sbc2440_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {
switch(cmd) { unsigned tmp;
case 0: case 1:
if (arg > 4) { return -EINVAL; }
tmp = readl(S3C64XX_GPKDAT); tmp &= ~(1 << (4 + arg)); tmp |= ( (!cmd) << (4 + arg) ); writel(tmp, S3C64XX_GPKDAT);
//printk (DEVICE_NAME\return 0; default:
return -EINVAL; } }
static struct file_operations dev_fops = { .owner = THIS_MODULE,
.unlocked_ioctl = sbc2440_leds_ioctl, };
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops, };
static int __init dev_init(void) {
int ret; {
unsigned tmp;
tmp = readl(S3C64XX_GPKCON);
tmp = (tmp & ~(0xffffU<<16))|(0x1111U<<16); writel(tmp, S3C64XX_GPKCON); tmp = readl(S3C64XX_GPKDAT); tmp |= (0xF << 4);
writel(tmp, S3C64XX_GPKDAT); }
ret = misc_register(&misc);
printk (DEVICE_NAME\return ret; }
static void __exit dev_exit(void) {
misc_deregister(&misc); }