[LINUX] [Raspberry Pi] Minimales Memo zur Erstellung von Gerätetreibern zur Ausgabe von GPIO

Annahme

Code

driver.c


#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <asm/uaccess.h> // copy_from_user
#include <linux/cdev.h> // cdev★
#include <linux/ioport.h>
#include <linux/io.h>
#define NODE_NAME "kuredev"
#define SUCCESS 0

MODULE_LICENSE("Dual BSD/GPL");

static int major_num = 0;
static unsigned char k_buf[1024];
static int data_size;
static int read_count = 0;
static int minor_num = 1;//★
static struct cdev kure_cdev;//★
static void __iomem *gpio_map;
static volatile uint32_t *gpio_base;


static void gpio_set(void){
        printk("gpio_set\n");
        request_mem_region(0x20200000, 4096, "kure");
        gpio_map = ioremap_nocache(0x20200000, 4096);
        gpio_base = (volatile uint32_t *)gpio_map;

        gpio_base[2] = 0x8;
        gpio_base[7] = 0x200000;
}

static void gpio_clear(void){
        printk("gpio_clear\n");
        request_mem_region(0x20200000, 4096, "kure");
        gpio_map = ioremap_nocache(0x20200000, 4096);
        gpio_base = (volatile uint32_t *)gpio_map;

        gpio_base[2] = 0x8;
        gpio_base[10] = 0x200000;

}


static int kure_open(struct inode *inode, struct file *file){
        printk("kure_open\n");
        return SUCCESS;
}

static int kure_release(struct inode *inode, struct file *file){
        printk("kure_release\n");
        return SUCCESS;
}

static ssize_t kure_read(struct file *file, char __user *buf, size_t count, loff_t *f_pos){
        printk("kure_read, count: %d, data_size: %d\n", count, data_size);
        if(read_count){
                return 0;
        }
        int len;
        if(count > data_size){
                len = data_size;
        }else{
                len = count;
        }
        printk("len: %d\n", len);
        copy_to_user(buf, k_buf, len);
        read_count++;
        return len;
}

static ssize_t kure_write(struct file *file, char __user *buf, size_t count,loff_t *f_pos){
        printk("kure_write, count = %d\n", count);
        copy_from_user(k_buf, buf, count);
        data_size = count;

        gpio_set();
        return count;
}

struct file_operations kure_fops = {
        .owner = THIS_MODULE,
        .read = kure_read,
        .write = kure_write,
        .open = kure_open,
        .release = kure_release
};

static int kure_init(void){
        dev_t dev = MKDEV(major_num, 0);//★
        alloc_chrdev_region(&dev, 0, minor_num, NODE_NAME);//★
        major_num = MAJOR(dev);//★
        cdev_init(&kure_cdev, &kure_fops);//★
        kure_cdev.owner = THIS_MODULE;//★
        cdev_add(&kure_cdev, MKDEV(major_num, 0), minor_num);//★

        printk("kure_init\n");
        return SUCCESS;
}

static void kure_exit(void){
        gpio_clear();
        dev_t dev = MKDEV(major_num, 0);//★
        cdev_del(&kure_cdev);//★
        unregister_chrdev_region(dev, minor_num);//★

        printk("kure_exit\n");
}


module_init(kure_init);
module_exit(kure_exit);

Makefile


HOME ?= /home/pi
ARCH := arm
KPATH := $(HOME)/raspberry/linux

obj-m := driver.o

all:
        make ARCH=$(ARCH) -C $(KPATH) M=$(PWD)  modules

clean:
        make ARCH=$(ARCH) -C $(KPATH) M=$(PWD) clean

Lauf

$ make
$ sudo insmod driver.ko
$ sudo mknod -m 666 /dev/kuredev c 242 0
$ echo 0 > /dev/kuredev ★ Ausgabe
$ sudo rm -rf /dev/kuredev
$sudo rmmod Treiber ★ Ausgabe endet

Bei Ausgabe mit ↓ [Raspberry Pi] Ein kleines Memo zur Steuerung von GPIO vom Benutzerland über das Register --Qiita

Recommended Posts

[Raspberry Pi] Minimales Memo zur Erstellung von Gerätetreibern zur Ausgabe von GPIO
Ausgabe von Raspberry Pi an Line
Einfaches Memo zur Erstellung von Zeichengerätetreibern (cdev)
Raspberry Pi 4 Setup-Hinweise
Einfaches Memo zur Erstellung von Zeichengerätetreibern (Lese- / Schreibimplementierung)
Ich habe mit Raspberry Pi gesprochen
Einführung von PyMySQL in Himbeer-Pi3
Raspeye + Python + OpenGL-Memo
Hinweise zum Verbinden von Bluetooth von einem Smartphone / PC mit Raspeye 4
Port FreeRTOS auf Raspberry Pi 4B
Installieren Sie ghoto2 auf Raspberry Pi (Hinweis)
[Raspberry Pi] Python wurde standardmäßig in Python3 geändert
Ein Memo zur einfachen Verwendung des Beleuchtungsstärkesensors TSL2561 mit Raspberry Pi 2
Schließen Sie zwei USB-Kameras an Raspberry Pi 4 an
So installieren Sie NumPy auf Raspeye