Драйвер устройства на основе дерева устройств Hello Word

Я прочитал и почти прошел через всю документацию ядра linux на дереве устройств и наложениях дерева устройств.Я не могу понять, нужно ли создавать новый entree в дереве устройств платформы или создавать новый overlay для устройства для нового драйвера на основе дерева устройств. Я ищу простой пример драйвера LED glowing, где led подключен к GPIO pin, и его конфигурация упоминается в наложении дерева устройств или фрагменте дерева устройств на плате платформа.Как его можно построить / нажать и протестировать с помощью приложения пользовательского пространства.

2 ответов


  1. Я создал пользовательское устройство в дереве устройств:

    my_device@ffdf0000 {
        compatible = "my_driver";
        reg = <0xffdf0000 0x1000> 
        /* 
         * reg = address of device and size 
         * (Minimum is System's Pagesize = 0x1000 Byte in my case
         */
    }
    
  2. Я написал заглушку ядра для этого устройства:

    (здесь я взял kernel_src/drivers/uio/uio_pdrv_genirq.c и Hans J. Koch: Userspace I/O drivers in a realtime context (учебник драйвера устройства) в качестве основы.)

    этот заглушка имеет следующие две структуры:

    структура of_device_id:

    static struct of_device_id my_match_table[] = {
         {
                 .compatible = "my_driver",
         },
         {0}
    };
    MODULE_DEVICE_TABLE(of, my_match_table);
    

    и структура драйвера:

    static struct platform_driver my_platform_driver = {
            .probe = my_probe,
            .remove = my_remove,
            .driver = {
                    .name = "my_driver",
                    .owner = THIS_MODULE,
                    .of_match_table = of_match_ptr(my_match_table),
            },
    };
    
  3. теперь у меня есть доступ к свойствам устройства дерево в моей функции зонда:

    static int my_probe(struct platform_device *dev)
    {
            struct uio_info *uioinfo;
            struct resource *r = &dev->resource[0];
            [...]
            uioinfo->name = dev->dev.of_node->name /* name from device tree: "my_device" */
            uioinfo->mem[0].addr = r->start; /* device address from device tree */
            uioinfo->mem[0].size = resource_size(r); /* size from device tree */
            [...]
    }
    

когда есть матч в compatible С помощью записи заглушки ядра и дерева устройств вызывается функция probe.


используйте QEMU с минимальным пользовательским аппаратным устройством

Я рекомендую вам кодировать свое собственное минимальное платформенное устройство, а также управлять оборудованием и иметь полное представление.

Я предоставил полный запускаемый пример Buildroot QEMU с исходным кодом на GitHub, как подробно описано в этом ответе:как программировать Linux .файлы дерева устройств dts?

пример также задокументирован на репозитории GitHub.