Перейти к содержанию
    

Хочу прикрутить драйвер АЦП 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 в моём случае) как для обычного ногодрыга.

Изменено пользователем TigerSHARC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавить драйвер можно так(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?

Изменено пользователем TigerSHARC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавить драйвер можно так(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[

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

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

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

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

Изменено пользователем TigerSHARC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В меню-конфигураторе (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));

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В меню-конфигураторе (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

 

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

 

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

 

 

Изменено пользователем TigerSHARC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

#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

Изменено пользователем xor.kruger

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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 пределяются автоматически, а вот структуры, описывающие параметры АЦП нужно писать самому...

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

Изменено пользователем TigerSHARC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Структура (платформ дата) должна быть описана в файле соответствующей борды. ./arch/arm/mach-at91/board-<ваша борда>.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

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

Изменено пользователем TigerSHARC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...