zoukankan      html  css  js  c++  java
  • S3C2440 LED驱动

    //头文件

    #include <linux/miscdevice.h>
    #include <linux/delay.h>
    #include <asm/irq.h>
    #include <mach/regs-gpio.h>
    #include <mach/hardware.h>
    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/mm.h>
    #include <linux/fs.h>
    #include <linux/types.h>
    #include <linux/delay.h>
    #include <linux/moduleparam.h>
    #include <linux/slab.h>
    #include <linux/errno.h>
    #include <linux/ioctl.h>
    #include <linux/cdev.h>
    #include <linux/string.h>
    #include <linux/list.h>
    #include <linux/pci.h>
    #include <linux/gpio.h>
    #include <asm/uaccess.h>
    #include <asm/atomic.h>
    #include <asm/unistd.h>

    //定义设备名称
    #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"\tInitialized\n");

     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 <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/ioctl.h>

    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|1\n");
      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 *~

  • 相关阅读:
    IntelliJ IDEA 14.03 java 中文文本处理中的编码格式设置
    应聘感悟
    STL string分析
    CUDA SDK VolumeRender 分析 (1)
    BSP
    CUDA SDK VolumeRender 分析 (3)
    CUDA SDK VolumeRender 分析 (2)
    Windows软件发布时遇到的一些问题
    Ten Commandments of Egoless Programming (转载)
    复习下光照知识
  • 原文地址:https://www.cnblogs.com/Neddy/p/2080819.html
Copyright © 2011-2022 走看看