• 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 *~

  • 相关阅读:
    STL--set_difference
    priority_queue和sort应用
    16进制转化8进制---map
    LeetCode62. 不同路径
    LeetCode209. 长度最小的子数组
    LeetCode第29场双周赛题解
    LeetCode61. 旋转链表
    LeetCode60. 第k个排列
    LeetCode59. 螺旋矩阵 II
    LeetCode58. 最后一个单词的长度
  • 原文地址:https://www.cnblogs.com/Neddy/p/2080819.html
Copyright © 2020-2023  润新知