从电路图中看出,GPIO低电平有效(LED亮)。GPK共有16个端口,每个端口由三个寄存器控制——控制寄存器(GPKCON)、数据寄存器(GPKDAT)和上拉寄存器(GPKPUD),每个寄存器都是32位,如下图所示。
GPK的控制寄存器分为两个,GPKCON0控制0~8好端口,GPKCON1控制9~15号端口。控制寄存器连续的4位控制一个端口,如下图中LED对应的控制寄存器。
驱动程序
/*
*===========================================================================
* Filename: tiny6410_leds.c
* Description: led drivers for Tiny6410
*
* Created: xhzuoxin 05/07/2013
* Compiler: gcc
*===========================================================================
*/
#include<linux/module.h>
#include<linux/init.h>
//#include <linux/mm.h>
#include<linux/fs.h>
//#include <linux/types.h>
//#include <linux/delay.h>
//#include <linux/slab.h>
//#include <linux/cdev.h>
#include<linux/miscdevice.h>
#include<linux/errno.h>
#include<linux/ioctl.h>
//#include <linux/string.h>
//#include <linux/list.h>
#include<linux/pci.h>
#include<asm/uaccess.h>
//#include <asm/atomic.h>
//#include <asm/unistd.h>
//#include <asm/irq.h>
#include<mach/regs-gpio.h>
#include<mach/hardware.h>
#include<mach/map.h>
#include<mach/regs-clock.h>
#include<mach/regs-gpio.h>
#include<plat/gpio-cfg.h>
#include<mach/gpio-bank-e.h>
#include<mach/gpio-bank-k.h>
#defineLED4 GPK7
#defineLED3 GPK6
#defineLED2 GPK5
#defineLED1 GPK4
#defineDEBUG 0
#defineDEVICE_NAME
"tiny6410_leds"
static long tiny6410_leds_ioctl(structfile *flip,unsignedintcmd,
unsigned longarg)
{
/* arg:which led */
switch(cmd) {
unsigned tmp;
case 0:
case 1:
if (arg > 4) {
return -EINVAL;
}
tmp =readl(S3C64XX_GPKDAT); // read data register
tmp&= ~(1 << (4+arg)); // clear bit
tmp |=((!cmd) << (4+arg)); // set bitwith cmd
writel(tmp,S3C64XX_GPKDAT); // write data register
#ifDEBUG
printk(DEVICE_NAME":%ld %d\n", arg, cmd);
#endif
return 0;
default:
return -EINVAL;
}
}
static struct file_operations dev_fops = {
.owner =THIS_MODULE,
.unlocked_ioctl= tiny6410_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;
/*configure config register : 0001 output */
tmp =readl(S3C64XX_GPKCON);
tmp = (tmp&~ (0xffffU<<16)) | (0x1111U<<16);
writel(tmp,S3C64XX_GPKCON);
/*configure data register : init dark */
tmp =readl(S3C64XX_GPKDAT);
tmp |=(0xF << 4);
writel(tmp,S3C64XX_GPKDAT);
ret =misc_register(&misc);
printk(DEVICE_NAME"\tinitialized\n");
return ret;
}
static void __exit dev_exit(void)
{
misc_deregister(&misc);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zx");
Makefile文件如下:
ARCH=arm
COMPILE=arm-linux-
ifneq ($(KERNELRELEASE),)
obj-m:=tiny6410_leds.o
else
KDIR ?= /mnt/HappyStudy/Tiny6410/linux-2.6.38
PWD := $(shell pwd)
endif
all:
make -C$(KDIR) M=$(PWD) modules ARCH=$(ARCH) CROSS_COMPILE=$(COMPILE)
clean:
rm -f *.ko*.o *.mod.o *.od.c *.symvers
用户空间测试文件为led.c如下,
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#defineDEVICE_NAME"/dev/tiny6410_leds"
intmain(int argc,char**argv)
{
int on;
int led_no;
int fd;
if (argc != 3 || sscanf(argv[1], "%d",&led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 || on < 0|| on > 1 || led_no < 0 || led_no > 3) {
fprintf(stderr,"Usage: leds led_no 0|1\n");
exit(1);
}
fd =open(DEVICE_NAME, 0);
if (fd < 0) {
perror("opendevice leds");
exit(1);
}
ioctl(fd,on, led_no);
close(fd);
return 0;
}
使用arm-linux编译,友善提供了一个编译led.c的Makefile文件,我们关注其中的install目标,该目标能将编译后的程序安装到系统中。
ifndef DESTDIR
DESTDIR ?=/tmp/FriendlyARM/mini6410/rootfs
endif
CFLAGS =-Wall -O2
CC =arm-linux-gcc
INSTALL =install
TARGET =led
all: $(TARGET)
led: led.c
$(CC)$(CFLAGS) $< -o $@
install: $(TARGET)
$(INSTALL)$^ $(DESTDIR)/usr/bin
clean distclean:
rm -rf *.o$(TARGET)
.PHONY: $(PHONY) install clean distclean
分享到:
相关推荐
Tiny6410led驱动程序及测试程序
基于友善之臂的ARM-cotexA9驱动编写,包含led驱动的驱动代码和测试程序
tiny210基于输入子系统的按键程序自己写的,友善提供的按键驱动为普通字符驱动。在linux3.0.8测试,带驱动、应用程序和makefile.
这是一个基于tiny4412板的android led hal示例。 用户可以通过按钮打开/关闭 LED。 整个项目包括3个目录:android_code、led_driver、sequenceDiagram。 android_code:android 代码,包括应用程序、java 系统服务、...
本文基于tiny6410 开发板设计了一种新型的网络控制开关,控制系统可以通过有线或无线网络,由电脑输入命令或控制板按键来操作受控板上4 个LED 灯的亮灭。开发过程涉及到嵌入式Linux 环境下的设备驱动程序开发,按键驱动...
有很多Instructables向您展示如何将Arduino引导装载程序和您的程序添加到ATTINY85,所以我不会在这里介绍。然而,我会指出,你将需要将保险丝设置为“内部8MHz”。 第七步:成品 视频观看链接地址:...
ATMEL公司的AVR单片机是一种基于增强RISC结构的、低功耗、CMOS技术、8位微控制器(Enhanced RISC Microcontroller),目前有Tiny、Mega两个系列50多种型号。它们的功能和外部的引脚各有不同,小到8-12个引脚,多到100...
ECEN 5713最终项目存储库 存储库所有者-Arpit Savarkar 该存储库包含Tensorflow代码,用于在Jetson Nano和... 为基于I2C的4字符7段显示和基于GPIO的LED功能开发和测试驱动程序: https : //github.com/AESD-Course
--- 无线网卡驱动:修复 RT3070 驱动兼容性问题( LED 正常工作) 。 --- 固件:wireless-fw-2010-06-04.tce ,非独立软件包 。 2010-06-02 Beini-1.2 --- 此版本附带的软件程序源于 Beini-1.1 。 --- 将 ...