Светодиод мигает через драйвер устройства Rpi Linux - PullRequest
0 голосов
/ 04 октября 2019

В программировании драйвера устройства мы используем 1. код драйвера устройства, 2. файл устройства, 3. код приложения пользовательского пространства и 4. фактическое физическое оборудование.

  • Я могу написать код драйвера, код приложения пользовательского пространства и вручную создать файл устройства, но я хочу попробовать подключить аппаратное обеспечение (по крайней мере, мигание светодиода через драйвер устройства в Raspberry Pi)и мне это кажется немного сложным.

  • И если я могу мигать светодиодом, значит, происходит связь между всеми четырьмя перечисленными выше пунктами.

Я взял онлайн-код мигающего светодиода и проверил, но он не работает.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019
Driver Application code:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
    char buf[30];
    int fd, retread, retwrite, retlseek, retclose;

    fd = open("MyTestDevice", O_CREAT | O_RDWR, 0666);
    printf("Value of file descriptor:%d\n", fd);

    retwrite = write(fd, "welcome to embedded system", 27);
    printf("return value of write:%d\n", retwrite);

    retlseek = lseek(fd, 11, SEEK_SET);
    printf("return value of lseek:%d\n", retlseek);

    retread = read(fd, buf, 27);
    printf("return value of read:%d\n", retread);

    printf("Data read from driver is:%s\n", buf);

    retclose = close(fd);
    printf("return value of close:%d\n", retclose);

    return 0;
}

Я успешно могу связываться с кодом приложения из пространства пользователя до драйвера в пространстве ядра. И используя эти базовые знания, я хочу мигать светодиодом и узнать, что мне нужно изучать после этой программы.

0 голосов
/ 04 октября 2019
Driver code:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>

#define BUF_MAX_SIZE 1024

int major_num;
char driver_buf[BUF_MAX_SIZE];

int myopen(struct inode *inodep, struct file *filep)
{
    printk(KERN_INFO "Bhaskar: Open function called.\n");
    return 0;
}

int myclose(struct inode *indoep, struct file *filep)
{
    printk(KERN_INFO "Bhaskar: Close function called.\n");
    return 0;
}

ssize_t myread(struct file *filep, char *ubuf, size_t nbytes, loff_t *offset)
{
    printk(KERN_INFO "Bhaskar: Read function called.\n");
    copy_to_user(ubuf, driver_buf + filep->f_pos, nbytes);
    filep->f_pos += nbytes;
    return 0;
}

ssize_t mywrite(struct file *filep, const char *ubuf, size_t nbytes, loff_t *offset)
{
    printk(KERN_INFO "Bhaskar: Write function called.\n");
    copy_from_user(driver_buf + filep->f_pos, ubuf, nbytes);
    filep->f_pos += nbytes;
    return 0;
}

loff_t mylseek(struct file *filep, loff_t offset, int whence)
{
    int newpos;
    printk(KERN_INFO "Bhaskar: llseek function called.\n");
    switch(whence)
    {
        case SEEK_SET: 
            newpos = offset;
            printk(KERN_INFO "llseek called with SEEK_SET.\n");
            break;

        case SEEK_CUR:
            newpos = filep->f_pos + offset;
            printk(KERN_INFO "llseek called with SEEK_CUR.\n");
            break;

        case SEEK_END:
            newpos = BUF_MAX_SIZE + offset;
            printk(KERN_INFO "llseek called with SEEK_END.\n");
            break;
    }
    filep->f_pos = newpos;
    printk(KERN_INFO "new position of file pointer is:%d\n", newpos);
    return newpos;
}

struct file_operations fops = {
    .open = myopen,
    .release = myclose,
    .read = myread,
    .write = mywrite,
    .llseek = mylseek
};

static int hello_init(void)
{
    printk(KERN_INFO "Bhaskar: Module loaded successfully.\n");
    major_num = register_chrdev(0, "MyCharDriver", &fops);
    printk(KERN_INFO "Char driver registered with major num is:%d\n", major_num);
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_INFO "Bhaskar: Module unloaded successfully.\n");
    unregister_chrdev(major_num, "MyCharDriver");
}

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Bhaskar <bhaskarauvsp@gmail.com>");
MODULE_DESCRIPTION("Its a dummy char driver");

module_init(hello_init);
module_exit(hello_exit);
...