赞
踩
leddevice.c
#include <linux/init.h> #include <linux/fs.h> #include <linux/major.h> #include <linux/blkdev.h> #include <linux/backing-dev.h> #include <linux/module.h> #include <linux/gpio.h> #include <linux/capability.h> #include <linux/uio.h> #include <linux/cdev.h> #include <linux/device.h> #include <linux/mutex.h> #include <linux/gfp.h> #include <linux/compat.h> #include <linux/vmalloc.h> #include <linux/uaccess.h> #define PAD_SPIO_LOOK 66 #define PAD_GPIOG6 6 #define PAD_SPI0_MOSI 64 static struct class *led_dev_class; static struct device *led_dev_class_dev; static char val[64]; static int lde_dev_open(struct inode *inode, struct file *file) { printk("lde_dev_open"); return 0; } static ssize_t lde_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { printk("lde_dev_read"); int ret=0; char vall[]="hello,woed!"; ret = copy_to_user(buf, vall, count); if (ret < 0) { printk("ret=%d \n", ret); return ret; } return 0; } static ssize_t lde_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { printk("lde_dev_write"); int ret=0; char status=0; ret = copy_from_user(val, buf, count); if(ret<0) { printk("ret = %d /n",ret); status=-ENOMEM; } char key=simple_strtoul(val,NULL,0); if (key <= 1) { gpio_set_value(PAD_GPIOG6, 1); } else { gpio_set_value(PAD_GPIOG6, 0); } if(!status) { status=count; } return status; } static const struct file_operations led_dev_fops = { .owner = THIS_MODULE, .open = lde_dev_open, .read = lde_dev_read, .write = lde_dev_write, }; int major; static int __init led_device_init(void) { printk("led_device_init"); gpio_request(PAD_GPIOG6, "PAD_GPIOG6"); gpio_direction_output(PAD_GPIOG6, 1); major = register_chrdev(0, "led_dev", &led_dev_fops); led_dev_class = class_create(THIS_MODULE, "led_dev"); led_dev_class_dev = device_create(led_dev_class, NULL, MKDEV(major, 0), NULL, "led_dev"); return 0; } module_init(led_device_init); static void __exit led_device_exit(void) { printk("led_device_exit"); unregister_chrdev(major, "led_dev"); device_unregister(led_dev_class_dev); class_destroy(led_dev_class); gpio_free(PAD_GPIOG6); } module_exit(led_device_exit); MODULE_LICENSE("GPL");
Makefile
obj-m += leddevice.o
KDIR=/home/root/linux
CROSS_COMPILE=aarch64-linux-gnu-
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm64 CROSS_COMPILE=$(CROSS_COMPILE)
clean:
rm -rf *.ko *.o *.mod.o *.mod.c *.symvers modul*.hello.*.tmp_versions.*.*.cmd modules.order
help:
@echo "nake KDIR=<your kernel path>CROSS_COMPILE=<your CROSS_COMPILE>"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。