单片机 > 单片机程序设计 > 详情

S3C2440 LED驱动

发布时间:2020-12-31 发布时间:
|

//头文件


#include

//定义设备名称
#define DEVICE_NAME "leds"

//led与ARM硬件连接

static unsigned long led_table [] = {
 S3C2410_GPB(5),
 S3C2410_GPB(6),
 S3C2410_GPB(7),
 S3C2410_GPB(8),
};

//ARM I/0配置为输出

static unsigned int led_cfg_table [] = {
 S3C2410_GPIO_OUTPUT,
 S3C2410_GPIO_OUTPUT,
 S3C2410_GPIO_OUTPUT,
 S3C2410_GPIO_OUTPUT,
};

//file operations 结构体的ioctl()函数

static int sbc2440_leds_ioctl(
 struct inode *inode, 
 struct file *file, 
 unsigned int cmd, 
 unsigned long arg)
{
 switch(cmd) {
 case 0: case 1:
  if (arg > 4) return -EINVAL;
  s3c2410_gpio_setpin(led_table[arg], !cmd);
  return 0;
 default: return -EINVAL;
 }
}

static struct file_operations dev_fops = {
 .owner = THIS_MODULE,
 .ioctl = sbc2440_leds_ioctl,
};

static int __init dev_init(void)
{
 int i,ret;
 for (i = 0; i < 4; i++) {
  s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
  s3c2410_gpio_setpin(led_table[i], 0);
 }

 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_LICENSE("GPL");

/////////////////////////////////////////////////////////////////////////////////

//Makefile

DEVICE = led
ifneq ($(KERNELRELEASE),)
obj-m := ${DEVICE}.o
else
CC = arm-linux-gcc
KERNELDIR = /opt/linux-2.6.32.2
PWD       := $(shell pwd)
modules:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(KERNELDIR)/include modules

endif

clean:
 rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *~ modules.order

depend .depend dep:
 $(CC) $(CFLAGS) -M *.c > .depend


ifeq (.depend,$(wildcard .depend))
include .depend
endif

////////////////////////////////////////////////////////////////////////////////////////////

//API

#include
#include
#include
#include

int main(int argc, char **argv)
{
 int on;
 int led_no;
 int fd;
 if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||
     on < 0 || on > 1 || led_no < 0 || led_no > 3) {
  fprintf(stderr, "Usage: leds led_no 0|1n");
  exit(1);
 }
 fd = open("/dev/leds0", 0);
 if (fd < 0) {
  fd = open("/dev/leds", 0);
 }
 if (fd < 0) {
  perror("open device leds");
  exit(1);
 }
 ioctl(fd, on, led_no);
 close(fd);
 return 0;
}

////////////////////////////////////////////////////////////////

//Makefile

CROSS=arm-linux-

all: led

led: led.c
 $(CROSS)gcc -o led led.c

clean:
 @rm -vf led *.o *~



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C8051F020的UART