leds_drv.h
[cpp]
#ifndef _MEMDEV_H_
#define _MEMDEV_H_
#include <linux/ioctl.h>
/* 定义幻数 */
#define MEMDEV_IOC_MAGIC 'k'
/* 定义命令 */
#define MEMDEV_IOC_ON _IO(MEMDEV_IOC_MAGIC, 1)
#define MEMDEV_IOC_OFF _IO(MEMDEV_IOC_MAGIC, 2)
#define MEMDEV_IOC_MAXNR 2
#define LED_ON 0
#define LED_OFF 1
#endif /* _MEMDEV_H_ */
leds_drv.c
[cpp]
#include
#include
#include
#include
gpio.h> #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 'leds_drv.h'
#define DEVICE_NAME 'leds'
static unsigned long led_table[] = {
S3C2410_GPB(5),
S3C2410_GPB(6),
S3C2410_GPB(7),
S3C2410_GPB(8),
};
static unsigned int led_cfg_table[] = {
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
};
static int s3c2440_leds_ioctl(struct inode *inode,
struct file *file, unsigned int cmd, unsigned long arg)
{
/* 检测命令的有效性 */
if (_IOC_TYPE(cmd) != MEMDEV_IOC_MAGIC)
return -EINVAL;
if (_IOC_NR(cmd) > MEMDEV_IOC_MAXNR)
return -EINVAL;
/* 根据命令,执行相应的操作 */
switch (cmd)
{
case MEMDEV_IOC_OFF:
s3c2410_gpio_setpin(led_table[arg], LED_OFF);
return 0;
case MEMDEV_IOC_ON:
s3c2410_gpio_setpin(led_table[arg], LED_ON);
return 0;
default:
return -EINVAL;
}
}
/*文件操作结构体*/
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.ioctl = s3c2440_leds_ioctl,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
int ret;
int i;
/*设置GPIO控制寄存器,GPIO设置为输出模式,默认下灯全灭 */
for (i = 0; i < 4; i++)
{
s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
s3c2410_gpio_setpin(led_table[i], 1);
}
/*注册混杂型字符设备驱动 */
ret = misc_register(&misc);
printk(DEVICE_NAME 'tinitializedn');
return ret;
}
static void __exit dev_exit(void)
{
/*注销混杂型字符设备驱动 */
misc_deregister(&misc);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_AUTHOR('Cried Devil');
MODULE_LICENSE('GPL');
app-leds.c
[cpp]
#include
#include
#include
#include
#include 'leds_drv.h' /* 包含命令定义 */
int main(int argc, char **argv)
{
int on;
int fd;
int num;
if (argc != 3 ||
sscanf(argv[1],
'%d',
&num) !=
1 || sscanf(argv[2], '%d', &on) != 1 || on < 0 || on > 1 || num < 0 || num > 3)
{
fprintf(stderr, 'Usage: %s led_num off|onn', argv[0]);
fprintf(stderr, 'Usage: %s 0|1|2|3 0|1n', argv[0]);
fprintf(stderr, 'Ex : %s 0 1n', argv[0]);
exit(1);
}
fd = open('/dev/leds', 0);
if (fd < 0)
{
perror('open device leds');
exit(1);
}
if (on)
{
// printf('Turn on led %d!n', num);
ioctl(fd, MEMDEV_IOC_ON, num);
}
else
{
// printf('Turn off led %d!n', num);
ioctl(fd, MEMDEV_IOC_OFF, num);
}
close(fd);
return 0;
}
Makefile
[cpp]
ifneq ($(KERNELRELEASE),)
obj-m := leds_drv.o
上一篇:mini2440上SQLite操作
下一篇:mini2440上DS18B20的驱动程序(含简单测试)
推荐阅读最新更新时间:2026-02-26 16:25
- DI-88 - PoE检测和分类(0-3类)接口电路
- LTC2207-14 和 LTC6401-14 的组合演示板 (14dB)
- DER-979 - 使用 InnoSwitch4-CZ PowiGaN 和 ClampZero 的 100 W 入墙式 USB 插座,具有可选输出电压
- LT1317CMS8 数码相机电源典型应用电路
- LT1171HVIQ、5V/2.5A 正电流升压降压转换器的典型应用
- LTC3633AEUFD-2 1.8V/2.5V 4MHz 降压稳压器典型应用电路
- AD8532ARZ-REEL7 高输出电流基准/稳压器的典型应用
- 154W、12V、16V、20V、125V交流转直流多路输出高清电视电源
- AD8601ARTZ-REEL 低侧运算放大器电流监视器的典型应用
- RDR-734 - 适用于使用 LinkSwitch-3 的设备的 8.4 W 开放式电源



Linux技术手册
智能机械臂
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号