2013-10-05 实验之LED灯全关,全开

实验描述:LED灯全关,全开

注意事项:开发板默认已有Led点灯的示例,要将其关闭,否则,看不到效果。

内核版本:Linux 2.6.38

开发板: Mini 6410


电路原理:



驱动程序:

#include <linux/init.h>  
#include <linux/module.h>  
#include <linux/device.h>
#include <asm/uaccess.h>
#include <linux/kdev_t.h>
#include <linux/fs.h>
#include <asm/io.h>

/*
      Kernel Version: Linux 2.6.38
      Arm Version: Mini 6410
*/

#define MyPrintk  printk

static dev_t Leds_Major ;
static char * DEVICE_NAME = "MyLeds";
static struct class *leds_class;

volatile unsigned long *gpkcon0 = NULL;
volatile unsigned long *gpkdat = NULL;

static int   leds_init (struct inode *inode, struct file *file)
{
	*gpkcon0 &= ~( (0xF<<4*4) | (0xF<<5*4) | (0xF<<6*4) | (0xF<<7*4));
	*gpkcon0 |= ( (0x1<<4*4) |(0x1<<5*4) | (0x1<<6*4) | (0x1<<7*4));
 	*gpkdat |= (1<<4) | (1<<5) | (1<<6) | (1<<7) ;
	MyPrintk ("Leds Open gpkcon0: %lu\n",*gpkcon0);  
	MyPrintk ("Leds Open gpkdat: %lu\n",*gpkdat);  
	return 0;
}

static ssize_t leds_write (struct file *file, const char __user *buffer, size_t count, loff_t * ppos)
{
 	int val;
 	unsigned long ret = copy_from_user(&val,buffer,count);
	if  (ret != 0){
		MyPrintk ("value error%lu\n", ret);  
		return -1;
	}
	MyPrintk ("value %d\n", val);  
	if(val == 1){
 		*gpkdat &= ~ ((1<<4) | (1<<5) | (1<<6) | (1<<7)) ;
	  	MyPrintk ("Leds On gpkdat:%lu\n",*gpkdat);  
 	}else if(val == 0){
		*gpkdat |= (1<<4) | (1<<5) | (1<<6) | (1<<7) ;
		MyPrintk ("Leds Off gpkdat:%lu\n",*gpkdat);  
	}
	return 0;
}

static struct file_operations  s3c64XX_leds_fops = {
	.owner = THIS_MODULE,
	.write = leds_write,
	.open = leds_init,
};

static int myleds_init(void)  
{  
  	Leds_Major = register_chrdev(Leds_Major,DEVICE_NAME , &s3c64XX_leds_fops);
	if(Leds_Major < 0){
		MyPrintk (KERN_EMERG "Sorry, Can not register the leds device!\n");  
  	}
	MyPrintk (KERN_EMERG " Register the leds device\n");  
  	leds_class = class_create(THIS_MODULE, "FirstLeds");
  	device_create(leds_class, NULL , MKDEV(Leds_Major, 0), NULL, "XYZ");
  	gpkcon0 = (volatile unsigned long *)ioremap(0x7F008800, 16);
  	gpkdat = gpkcon0 + 2;
 	return 0;  
}  

static int myleds_exit(void)  
{  
	unregister_chrdev(Leds_Major, DEVICE_NAME);
  	device_destroy(leds_class,MKDEV(Leds_Major, 0));
  	class_destroy(leds_class);
  	MyPrintk (KERN_EMERG "MyLeds ByeBye\n");  
  	return 0;  
}  
  
module_init(myleds_init);  
module_exit(myleds_exit);
MODULE_LICENSE("GPL");  


测试应用程序

#include<stdio.h>
#include<fcntl.h>

int main(int argc, char **argv)
{
	int fd;
	int val = 1;
	fd = open("/dev/XYZ", O_RDWR);
	if (fd < 0){
		printf("Sorry, can't open!\n");
	}
	if (argc != 2){
		printf("Usage :\n");
		printf("%s <on|off>\n", argv[0]);
		return 0;
	}
	if (strcmp(argv[1], "on") == 0){
		val  = 1;
	}
	else{
		val = 0;
	}
	write(fd, &val, 4);
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值