linux下led驱动程序,linux下led灯驱动程序

1.驱动程序

led.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define LIGHT_ON 0X01

#define LIGHT_OFF 0X02

#define gpbcon S3C2410_GPBCON

#define gpbdat S3C2410_GPBDAT

#define

gpbup S3C2410_GPBUP

#define led_on_1 ~(1<<5)

#define led_on_2 ~(1<<6)

#define

led_on_3 ~(1<<7)

#define led_on_4 ~(1<<8)

#define DEVICE_NAME "linux_led"

MODULE_AUTHOR("xiaoheng");

void light_on(void)

{

writel(led_on_1, gpbdat);

mdelay(300);

printk("one");

writel(led_on_2, gpbdat);

mdelay(300);

printk("two");

writel(led_on_3, gpbdat);

mdelay(300);

printk("three");

writel(led_on_4, gpbdat);

mdelay(300);

printk("four");

writel(0, gpbdat);

mdelay(300);

printk("all

on\n");

}

void light_off(void)

{

writel(0xffff,gpbdat);

}

int light_open(struct inode* inode, struct file* filp)

{

printk("myled open NOW!");

writel((1<<10) | (1<<12) |

(1<<14) | (1<<16), gpbcon);

writel(0, gpbdat);

return

0;

}

int light_release(struct inode* inode, struct file* filp)

{

printk("myled close NOW!");

return 0;

}

int light_ioctl(struct inode* inode, struct file* filp, unsigned int

cmd,unsigned long t)

{

switch(cmd)

{

case

LIGHT_ON:

light_on();

break;

case

LIGHT_OFF:

light_off();

break;

default:

return -ENOTTY;

}

return 0;

}

struct file_operations light_fops = {

.owner = THIS_MODULE,

.ioctl = light_ioctl,

.open = light_open,

.release =

light_release,

};

static struct miscdevice misc = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &light_fops,

};

int light_init(void)

{

int ret;

printk("my led init

NOW\n");

ret = misc_register(&misc);

printk(DEVICE_NAME"initialized\n");

return ret;

}

void light_cleanup(void)

{

printk("myled OVER\n");

misc_deregister(&misc);

}

module_init(light_init);

module_exit(light_cleanup);

2.测试程序

ledtest.c

#include

#include

#include

#include

#include

#define LED_ON 0x01

#define LED_OFF 0x01

void delay()

{

unsigned int i, j;

for (i = 0; i < 0xf;

i++)

for (j = 0; j < 0xff; j++)

;

}

int main(int argc, char **argv)

{

int fd;

fd = open("/dev/linux_led", 0);

if(strcmp(argv[1], "0"))

{

while(1)

{

delay();

ioctl(fd, LED_ON, 0);

printf("1\n");

}

}

else if (strcmp(argv[1], "1"))

{

printf("0");

ioctl(fd, LED_OFF, 0);

}

return 0;

}

3.Makefile

obj-m:=led.o

KDIR:=/home/xiaoheng/Desktop/2.6.30.4/opt/EmbedSky/linux-2.6.30.4

all:

make

-C $(KDIR) M=$(shell pwd) modules

clean:

make -C $(KDIR) M=$(shell pwd)

clean

原文:http://www.cnblogs.com/xiaoheng008/p/3728983.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值