⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pxa270_led_ary_drv.c

📁 Linux环境下的嵌入式编程,即实现led的按时间亮
💻 C
字号:



#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/init.h>

#include <linux/module.h>

#include <asm/hardware.h>

#include <asm/io.h>


// LED DEVICE MAJOR
#define SIMPLE_LED_MAJOR	99

#define OURS_LED_DEBUG 
#define LED_ON 0
#define LED_OFF 1
#define VERSION         "PXA2700EP-ledary-V1.00-060603"

void showversion(void)
{ 
 printk("*********************************\n");
 printk("\t%s\t\n",VERSION);
 printk("********************************\n\n");


}

static long ioremap_addr;

// ------------------- READ ------------------------
ssize_t SIMPLE_LED_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)
{
 #ifdef OURS_LED_DEBUG
        printk("SIMPLE_LED_read[--kernel--]\n");
 #endif
        return count;

}	

// ------------------- WRITE -----------------------
ssize_t SIMPLE_LED_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)
{
	
	int tmp_buf;
	#ifdef OURS_LED_DEBUG
        	printk ("SIMPLE_LED_write [ --kernel--]\n");
        #endif
	
	// -------------------------------------------		
	tmp_buf = buf[1];
	tmp_buf = tmp_buf<<8;
	tmp_buf = tmp_buf | buf[0];
	#ifdef OURS_LED_DEBUG
                printk("tmp = %x\n",tmp_buf);	
	#endif

	outw(tmp_buf,ioremap_addr);
	// -------------------------------------------

	return count;
}	

// ------------------- IOCTL -----------------------
ssize_t SIMPLE_LED_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data)
{
#ifdef OURS_LED_DEBUG
	    printk("SIMPLE_LED_ioctl [--kernel--]\n");
#endif
switch(cmd)
{
 case LED_ON:{GPCR3|=0x1;break;}
 case LED_OFF:{GPCR3|=0x1;break;}
 default:
   {printk("lcd control:no cmd run [--kernel--]\n");return (-EINVAL);}
}
		return 0;
}

// ------------------- OPEN ------------------------
ssize_t SIMPLE_LED_open (struct inode * inode ,struct file * file)
{
	#ifdef OURS_LED_DEBUG
        	printk ("SIMPLE_LED_open [ --kernel--]\n");
        #endif
	
	MOD_INC_USE_COUNT;
	
	return 0;
}	

// ------------------- RELEASE/CLOSE ---------------
ssize_t SIMPLE_LED_release (struct inode  * inode ,struct file * file)
{
	#ifdef OURS_LED_DEBUG
	        printk ("SIMPLE_LED_release [ --kernel--]\n");
        #endif

	outw(0x0000,ioremap_addr); // close the led ary, all led off

	MOD_DEC_USE_COUNT;

	return 0;
}

// -------------------------------------------------
struct file_operations LED_ctl_ops ={
open:   SIMPLE_LED_open, 

read:   SIMPLE_LED_read, 

write:  SIMPLE_LED_write, 

ioctl:  SIMPLE_LED_ioctl, 

release:   SIMPLE_LED_release, 



};



// ------------------- INIT ------------------------
static int __init HW_LED_CTL_init(void)
{
    	int ret = -ENODEV;
	
	ret = devfs_register_chrdev(SIMPLE_LED_MAJOR, "led_ary_ctl", &LED_ctl_ops);

	showversion();

	if( ret < 0 )
	{
		printk (" pxa270: init_module failed with %d\n [ --kernel--]", ret);	
		return ret;
	}
	else
	{
		printk(" pxa270 led_driver register success!!! [ --kernel--]\n");
	}

	// ---------------------------------------------
	
	ioremap_addr=ioremap(0x0800c000,0x0f); // 
        outw(0x00ff,ioremap_addr); // open led ary, all led on
	
	#ifdef OURS_LED_DEBUG
	        printk("remap address = %x  [ --kernel--]\n",ioremap_addr);
	#endif


	// ---------------------------------------------

	return ret;
}


static int __init pxa270_LED_CTL_init(void) 
{
    int ret = -ENODEV;

    #ifdef OURS_LED_DEBUG

	             printk("pxa270_LED_CTL_init [--kernel--]\n");

    #endif

    ret = HW_LED_CTL_init();

    if (ret)

      return ret;

    return 0;    
}

static void __exit cleanup_LED_ctl(void)
{      
 #ifdef OURS_LED_DEBUG

   printk("cleanup_LED_ctl [--kernel--]\n");

    #endif

	outw(0x0000,ioremap_addr);
	
	devfs_unregister_chrdev (SIMPLE_LED_MAJOR, "led_ary_ctl" );

}


MODULE_DESCRIPTION("simple led driver module");
MODULE_AUTHOR("liduo");
MODULE_LICENSE("GPL");

module_init(pxa270_LED_CTL_init);
module_exit(cleanup_LED_ctl);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -