linux led测试程序,Linux驱动:LED驱动测试

Linux驱动:LED驱动测试

环境:

主机:Fedora12

目标板:MINI6410

目标板LINUX内核版本:2.6.38

实现功能:

驱动目标板4个LED.

说明:

LED与6410引脚对应连接:

LED1---GPK4

LED2---GPK5

LED3---GPK6

LED4---GPK7

驱动源代码:

led_driver.c:

#include

#include

#include

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define DEVICE_NAME "led_driver"

#define T_MAJORS700

static struct cdev fun_cdev;

static dev_t dev;

static struct class *led_class;

//功能:初始化IO

static void init_led(void)

{

unsigned temp;

//GPK4-7设置为输出

temp = readl(S3C64XX_GPKCON);

temp &= ~((0xf << 4) | (0xf << 5) | (0xf << 6) | (0xf<< 7));

temp |= (1 << 16) | (1 << 20) | (1 << 24) | (1 << 28);

writel(temp, S3C64XX_GPKCON);

}

//功能:ioctl操作函数

//返回值:成功返回0

static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)

{

unsigned int temp = 0;

printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d\n",cmd,arg);

temp = readl(S3C64XX_GPKDAT);

if (cmd == 0)

{

temp &= ~(1 << (arg + 3));

}

else

{

temp |= 1 << (arg + 3);

}

writel(temp,S3C64XX_GPKDAT);

return 0;

}

static struct file_operations io_dev_fops = {

.owner = THIS_MODULE,

.unlocked_ioctl = led_driver_ioctl,

};

static int __init dev_init(void)

{

int ret;

unsigned temp;

init_led();

dev = MKDEV(T_MAJORS,0);

cdev_init(&fun_cdev,&io_dev_fops);

ret = register_chrdev_region(dev,1,DEVICE_NAME);

if (ret < 0) return 0;

ret = cdev_add(&fun_cdev,dev,1);

if (ret < 0) return 0;

printk (DEVICE_NAME"\tjdh:led_driver initialized!!\n");

led_class = class_create(THIS_MODULE, "led_class1");

if (IS_ERR(led_class))

{

printk(KERN_INFO "create class error\n");

return -1;

}

device_create(led_class, NULL, dev, NULL, "led_driver");

return ret;

}

static void __exit dev_exit(void)

{

unregister_chrdev_region(dev,1);

device_destroy(led_class, dev);

class_destroy(led_class);

}

module_init(dev_init);

module_exit(dev_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("JDH");

用户程序:

test_led.c

#include

#include

#include

#include "stdio.h"

#include "sys/types.h"

#include "sys/ioctl.h"

#include "stdlib.h"

#include "termios.h"

#include "sys/stat.h"

#include "fcntl.h"

#include "sys/time.h"

#include

#include

int main(int argc, char** argv)

{

int fd;

int led_num = 0;

int led_value = 0;

char temp[10];

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

if (fd < 0)

{

perror("open led_driver error");

exit(1);

}

strcpy(temp,argv[1]);

led_num = atoi(temp);

strcpy(temp,argv[2]);

led_value = atoi(temp);

printf("%d %d\n",led_num,led_value);

ioctl(fd,led_num,led_value);

close(fd);

return 0;

}

测试说明:

将编译所得的可执行文件test_led上传到开发板

运行:

./test_led 0 1 打开LED1

./test_led 1 1 熄灭LED1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值