Jump to content

    
TigerSHARC

Драйвер АЦП

Recommended Posts

Хочу прикрутить драйвер АЦП AD7606 к Linux на AT91SAM9260.

На сайте AD нашёл драйвер, интсрукцию по применению

=ad7606]http://wiki.analog.com/resources/tools-software/linux-drivers/iio-adc/ad7606?s[]=ad7606

 

вопросы:

1) нужно использовать файлы *.c и *.h (файлы драйвера по ссылке выше) как подключаемый модуль ядра (как по книге "Linux Device Driver")?

2) По ссылке выше сказано, что нужно добавить в конфигурацию ядра "Industrial I/O support", но у меня в меню конфигурации такой графы просто нет

У меня ядро 2.6.24. Старое для таких целей? или что-то нужно добавить предварительно?

3) встречаю пример применения драйвера:

static struct ad7606_platform_data ad7606_pdata = {
.default_os = 0,
.default_range = 10000,
.gpio_convst = GPIO_PF9,
.gpio_reset = GPIO_PF10,
.gpio_range = GPIO_PH0,
.gpio_os0 = GPIO_PH1,
.gpio_os1 = GPIO_PH2,
.gpio_os2 = GPIO_PH3,
.gpio_frstdata = -1,
.gpio_stby = GPIO_PF12,
};

 

правильно ли я понимаю что дефайны ног процессора (вроде GPIO_PF9) нужно искать в библиотеке компилятора (arm-none-eabi в моём случае) как для обычного ногодрыга.

Edited by TigerSHARC

Share this post


Link to post
Share on other sites

Нет.

Если вы хотите написать драйверы, то все "стандартные" дефайны следует искать в исходниках ядра.

В случае с МК AT91SAM9260 пины задефайнены в файле arch/arm/mach-at91/include/mach/gpio.h. Линк

Share this post


Link to post
Share on other sites

Судя по Linux Kernel Driver DataBase поддержка industrial i/o появилась в 2.6.32. Файлы драйвера АЦП судя по той же статье поставляются с ядром, который поддерживается analogом, так как есть опция в ядре которая позволяет собрать его как модуль, в этом случае с исходниками драйвера вам ничего делать не надо.

Share this post


Link to post
Share on other sites

Добавить драйвер можно так(http://dmilvdv.narod.ru/AT91SAM9260/index.html?linux.html):

 

Добавление видеодрайвера с поддержкой кадрового буфера

Скопировать файлы драйвера дисплея в /linux-2.6.xx/drivers/video/.

Добавить в файл /linux-2.6.xx/drivers/video/Makefile компиляцию драйвера после  строки # Hardware specific drivers go first:



obj-$(CONFIG_FB_MYDISPLAY) += mydisplay.o



Отредактировать файл /linux-2.6.xx/drivers/video/Kconfig, добавив свой драйвер, например, после config FB_ATMEL:



config FB_MYDISPLAY

tristate "my display Framebuffer support"

depends on FB && ARCH_AT91SAM9260

select FB_SYS_FILLRECT

select FB_SYS_COPYAREA

select FB_SYS_IMAGEBLIT

default y

help

   This is a framebuffer device for my display.



Вместо FB_SYS_XXX могут быть выбраны FB_CFB_XXX, в зависимости от функций, используемых кодом драйвера.



Патч для добавления драйвера mydisplay в Makefile и Kconfig.

 

Или можно добавить как подключаемый компонент ядра (как по книге Linux Device Driver)

 

Если делать как в первом случае, то послесоотвествующих манипуляций я смогу увидеть драйвер AD7606 через menuconfig?

Edited by TigerSHARC

Share this post


Link to post
Share on other sites

Да, после добавления (правки) файлов Kconfig и Makefile, Вы уведите свой драйвер во вкладке DeviceDrivers->Video->Имя_драйвер (судя по приведенному Вами примеру)

Share this post


Link to post
Share on other sites
Да, после добавления (правки) файлов Kconfig и Makefile, Вы уведите свой драйвер во вкладке DeviceDrivers->Video->Имя_драйвер (судя по приведенному Вами примеру)

 

Отлично, значит такой же подход справедлив и для АЦП.

Share this post


Link to post
Share on other sites
Добавить драйвер можно так(http://dmilvdv.narod.ru/AT91SAM9260/index.html?linux.html):

 

Добавление видеодрайвера с поддержкой кадрового буфера

Скопировать файлы драйвера дисплея в /linux-2.6.xx/drivers/video/.

Добавить в файл /linux-2.6.xx/drivers/video/Makefile компиляцию драйвера после  строки # Hardware specific drivers go first:



obj-$(CONFIG_FB_MYDISPLAY) += mydisplay.o



Отредактировать файл /linux-2.6.xx/drivers/video/Kconfig, добавив свой драйвер, например, после config FB_ATMEL:



config FB_MYDISPLAY

tristate "my display Framebuffer support"

depends on FB && ARCH_AT91SAM9260

select FB_SYS_FILLRECT

select FB_SYS_COPYAREA

select FB_SYS_IMAGEBLIT

default y

help

   This is a framebuffer device for my display.



Вместо FB_SYS_XXX могут быть выбраны FB_CFB_XXX, в зависимости от функций, используемых кодом драйвера.



Патч для добавления драйвера mydisplay в Makefile и Kconfig.

 

Или можно добавить как подключаемый компонент ядра (как по книге Linux Device Driver)

 

Если делать как в первом случае, то послесоотвествующих манипуляций я смогу увидеть драйвер AD7606 через menuconfig?

Оказалось что AD7606 уже включён в стандартную поставку ядра. Пришлось включить поддержку GPIO для его активации.

 

Но я заметил что в драйверах нигде не встречается конструкция, служащая для "инициализации" управляющих ног для АЦП, типа

static struct ad7606_platform_data ad7606_pdata = {
    .default_os = 0,
    .default_range = 10000,
    .gpio_convst = GPIO_PF9,
    .gpio_reset = GPIO_PF10,
    .gpio_range = GPIO_PH0,
    .gpio_os0 = GPIO_PH1,
    .gpio_os1 = GPIO_PH2,
    .gpio_os2 = GPIO_PH3,
    .gpio_frstdata = -1,
    .gpio_stby = GPIO_PF12,
};

эта контсрукция описана на сайте: http://wiki.analog.com/resources/tools-sof...io-adc/ad7606?s[

НО! непоянтно куда её применить

где долнжа присутствовать эта конструкция и вообще где должна происходить инициализация АЦП, что нужно добавить кроме самого драйвера, который уже есть в ядре ?

или пристарте системы должен запускаться некий скрипт, который и производит инициализацию....

Вобщем тут путаюсь и несовсем понятно(((

Edited by TigerSHARC

Share this post


Link to post
Share on other sites

Попытаюсь вкратце ответить на Ваш вопрос.

 

В меню-конфигураторе (menuconfig) ядра GNU/Linux указывается используемый процессор, поддержка его интерфейсов, периферии и прочего.

К примеру Вы включи в ядре поддержку GPIO и кнопок которые висят на "этом самом" GPIO, только есть не задача, ядро "сходу" не знает на каких конкретно пинах находятся кнопки. Сообщить ему об этом можно в так называемом файле платформ (platform). Файл платформ - это файл, в котором описана периферия которая подключена к Вашему процессору.

Для процессора AT91SAM9260 это файл

arch/arm/mach-at91/board-sam9260ek.c

.

 

Вот пример как описано подключение в нем кнопок к пинам AT91_PIN_PA30 и AT91_PIN_PA31:

 

#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
static struct gpio_keys_button ek_buttons[] = {
         {
                 .gpio           = AT91_PIN_PA30,
                 .code           = BTN_3,
                 .desc           = "Button 3",
                 .active_low     = 1,
                 .wakeup         = 1,
         },
         {
                 .gpio           = AT91_PIN_PA31,
                 .code           = BTN_4,
                 .desc           = "Button 4",
                 .active_low     = 1,
                 .wakeup         = 1,
         }
};

 

Опции CONFIG_KEYBOARD_GPIO и CONFIG_KEYBOARD_GPIO_MODULE выставляются в меню конфигураторе.

 

Реально по умолчанию на один процессор может быть несколько платформов. Конкретный используется в зависимости от выбора отладочной платы (например для файла board-sam9260ek.c нужно выбрать SystemType->AtmelAT91SystemOnChip->AtmelAT91SAM9260-EK).

 

Точно также, по аналогии с кнопками необходимо поступить и с Вашим АЦП. По приведенной Вами ссылке на сайт аналоговцев уже все описано и Вам остается только скопировать и правильно указать желаемые ножки. Не забудьте, там же, в функции ek_board_init вставить добавление АЦП

platform_add_devices(board_devices, ARRAY_SIZE(board_devices));

 

 

 

Share this post


Link to post
Share on other sites
Попытаюсь вкратце ответить на Ваш вопрос.

 

В меню-конфигураторе (menuconfig) ядра GNU/Linux указывается используемый процессор, поддержка его интерфейсов, периферии и прочего.

К примеру Вы включи в ядре поддержку GPIO и кнопок которые висят на "этом самом" GPIO, только есть не задача, ядро "сходу" не знает на каких конкретно пинах находятся кнопки. Сообщить ему об этом можно в так называемом файле платформ (platform). Файл платформ - это файл, в котором описана периферия которая подключена к Вашему процессору.

Для процессора AT91SAM9260 это файл

arch/arm/mach-at91/board-sam9260ek.c

.

 

Вот пример как описано подключение в нем кнопок к пинам AT91_PIN_PA30 и AT91_PIN_PA31:

 

#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
static struct gpio_keys_button ek_buttons[] = {
         {
                 .gpio           = AT91_PIN_PA30,
                 .code           = BTN_3,
                 .desc           = "Button 3",
                 .active_low     = 1,
                 .wakeup         = 1,
         },
         {
                 .gpio           = AT91_PIN_PA31,
                 .code           = BTN_4,
                 .desc           = "Button 4",
                 .active_low     = 1,
                 .wakeup         = 1,
         }
};

 

Опции CONFIG_KEYBOARD_GPIO и CONFIG_KEYBOARD_GPIO_MODULE выставляются в меню конфигураторе.

 

Реально по умолчанию на один процессор может быть несколько платформов. Конкретный используется в зависимости от выбора отладочной платы (например для файла board-sam9260ek.c нужно выбрать SystemType->AtmelAT91SystemOnChip->AtmelAT91SAM9260-EK).

 

Точно также, по аналогии с кнопками необходимо поступить и с Вашим АЦП. По приведенной Вами ссылке на сайт аналоговцев уже все описано и Вам остается только скопировать и правильно указать желаемые ножки. Не забудьте, там же, в функции ek_board_init вставить добавление АЦП

platform_add_devices(board_devices, ARRAY_SIZE(board_devices));

Спасибо огромное!

В том то и дело что на сайте аналоговцев показано:

file: trunk/drivers/staging/iio/adc/ad7606.h

struct ad7606_platform_data {
unsigned			default_os;
unsigned			default_range;
unsigned			gpio_convst;
unsigned			gpio_reset;
unsigned			gpio_range;
unsigned			gpio_os0;
unsigned			gpio_os1;
unsigned			gpio_os2;
unsigned			gpio_frstdata;
unsigned			gpio_stby;
};
static struct ad7606_platform_data ad7606_pdata = {
.default_os = 0,
.default_range = 10000,
.gpio_convst = GPIO_PF9,
.gpio_reset = GPIO_PF10,
.gpio_range = GPIO_PH0,
.gpio_os0 = GPIO_PH1,
.gpio_os1 = GPIO_PH2,
.gpio_os2 = GPIO_PH3,
.gpio_frstdata = -1,
.gpio_stby = GPIO_PF12,
};

и можо подумать что пины задаются в ad7606.h

 

Попытаюсь вкратце ответить на Ваш вопрос.

 

В меню-конфигураторе (menuconfig) ядра GNU/Linux указывается используемый процессор, поддержка его интерфейсов, периферии и прочего.

 

Это простите где?

Я делаю по этой инструкции и ничего такого делать не надо (но предлагается скачать конфигурационный файл)

http://dmilvdv.narod.ru/AT91SAM9260/index.html

 

Реально по умолчанию на один процессор может быть несколько платформов. Конкретный используется в зависимости от выбора отладочной платы (например для файла board-sam9260ek.c нужно выбрать SystemType->AtmelAT91SystemOnChip->AtmelAT91SAM9260-EK).

 

"SystemType" - это вкладка в menuconfig? нету такой(

 

Непонятно стало как конфигурирвать вообще (порылся в конфиге в качестве процессора Intel указан, а на ARM нигде даже намёка нет) и вообще судя по:

http://belgorod.lug.ru/wiki/index.php/%D0%...0%BB%D1%8F_ARM9

 

Надо только частоту кварца руками в исходнике сменить...

 

Опыта тут нет. Подскажите, возможо где-то расписано как конфиг править ?

 

 

Edited by TigerSHARC

Share this post


Link to post
Share on other sites
В том то и дело что на сайте аналоговцев показано:

Вам нужно добавить в платформ:

#if defined(CONFIG_AD7606) || defined(CONFIG_AD7606_MODULE)
static struct resource ad7606_resources[] = {
    [0] = {
        .start    = 0x20100000,            /* SDP: AMS1 / CS_B */
        .end    = 0x20100000,
        .flags    = IORESOURCE_MEM,
    },
    [1] = {    /* general IRQ */
        .start    = IRQ_PH6,       /* SDP: GPIO6 */
        .end    = IRQ_PH6,
        .flags    = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
    },
};

static struct platform_device ad7606_device = {
    .name        = "ad7606-8",
    .dev = {
        .platform_data = &ad7606_pdata,
    },
    .num_resources    = ARRAY_SIZE(ad7606_resources),
    .resource    = ad7606_resources,
};
#endif
static struct platform_device *board_devices[] __initdata = {
#if defined(CONFIG_AD7606) || \
    defined(CONFIG_AD7606_MODULE)
    &ad7606_device,
#endif
};

 

А в файле в котором описано

static struct ad7606_platform_data ad7606_pdata = {
    .default_os = 0,
    .default_range = 10000,
    .gpio_convst = GPIO_PF9,
    .gpio_reset = GPIO_PF10,
    .gpio_range = GPIO_PH0,
    .gpio_os0 = GPIO_PH1,
    .gpio_os1 = GPIO_PH2,
    .gpio_os2 = GPIO_PH3,
    .gpio_frstdata = -1,
    .gpio_stby = GPIO_PF12,
};

необходимо переназначить пины. Только пины в для arm'ов от атмела именуются немного по другому, например AT91_PIN_PA5

 

Я делаю по этой инструкции и ничего такого делать не надо (но предлагается скачать конфигурационный файл)

По умолчанию когда Вы делаете make menuconfig, то вызывается меню опций для архитектуры x86, именно поэтому Вы и видите только список интеловских процессоров.

Полный список поддерживаемых архитектур можно посмотреть в каталоге arch/

Для того что бы конфигурировать ядро для arm выполните:

make ARCH=arm menuconfig

После этого Вы сможете увидеть тот список меню что я приводил выше.

Опыта тут нет.

Базовые понятие по Embedded Linux для семейства AT91SAM9 можно подчерпнуть тут

Если есть неделька лишнего времени, то советую для понимая вручную самостоятельно пройти все этапы:

1. Toolchain

2. Bootstrap

3. Das U-Boot

4. Kernel

5. RootFS

Edited by xor.kruger

Share this post


Link to post
Share on other sites

На аналоге не указано в каком файле описано

static struct ad7606_platform_data ad7606_pdata = {
    .default_os = 0,
    .default_range = 10000,
    .gpio_convst = GPIO_PF9,
    .gpio_reset = GPIO_PF10,
    .gpio_range = GPIO_PH0,
    .gpio_os0 = GPIO_PH1,
    .gpio_os1 = GPIO_PH2,
    .gpio_os2 = GPIO_PH3,
    .gpio_frstdata = -1,
    .gpio_stby = GPIO_PF12,
};

 

и можно понять что это файл ad7606.h , но это не так. Поэтому затрудняюсь с пониманием.

если я вас правильно понял, то после конфигурации дефайны для AD7606 пределяются автоматически, а вот структуры, описывающие параметры АЦП нужно писать самому...

спасибо большое за наставления.

Edited by TigerSHARC

Share this post


Link to post
Share on other sites

Непонятно, как задать требуемую частоту дискретизации(

частота дискретизации устанавливается частотой на ноге CONVST (.gpio_convst = pin_num). Но как программно задаётся эта частота - ума не приложу(

 

И ещё хотелось бы сделать что-то вроде этого

http://wiki.analog.com/software/linux/docs/iio/iio_netscope

, но на ARM9(АЦП подключен к нему). Что для этого нужно?

Edited by TigerSHARC

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.