реклама на сайте
подробности

 
 
> Драйвера в Linux для периферии Microblaze, Примеры, общие вопросы и рекомендации
xor.kruger
сообщение Nov 17 2011, 18:24
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



Доброго времени суток!
В данный момент времени приходится разбираться с программированием драйверов для периферии Microblaze (до этого имел небольшой опыт в программировании драйверов для ARM9 семейства AT91).
Суть данной темы (как мне кажется rolleyes.gif ) на этом форуме в том, чтобы любой желающий кому нужна и/или интересна подобная тематика (примеры, общие вопросы и рекомендации программирования драйверов с учетом аппаратных особенностей IP-COREs Microblaze) смог задать вопрос, найти готовый рабочий кусок кода и т.д. К сожалению просидев неделю в гугле, ничего подобного и полезного в таком же духе не нашел sad.gif

Как водится, начал я с мигания светодиодом. Вот пример кода драйвера который засвечивает третий светодиод в линейке:

Код
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>

static int __init kruger_driver_init(void)
{
  struct device_node *root_dn;
  struct device_node *kruger_gpio;
  struct gpio_chip *kruger_gc;
  int ret;

  printk(KERN_ALERT "Kruger driver init...\n");
  root_dn = of_find_node_by_path("/");
  kruger_gpio = of_find_node_by_name(root_dn, "ledss");
  if (!kruger_gpio)
  {
    printk(KERN_ALERT "LEDs not found in DTF\n");
    return -ENODEV;
  }
  printk(KERN_ALERT "LEDs find\n");
  kruger_gc = of_node_to_gpiochip(kruger_gpio);
  printk(KERN_ALERT "%s: gpio controller %s \n", root_dn->full_name, kruger_gpio->full_name);
  if(!kruger_gc)
  {
    printk(KERN_ALERT "gc not register\n");
    ret = -ENODEV;
  }
  ret = kruger_gc->direction_output(kruger_gc, 2, 1);
  if (ret < 0)
  {
    printk(KERN_ALERT "LEDs output error\n");
    return -ENODEV;
  }
  kruger_gc->set(kruger_gc, 2, 1);
  return 0;    
}

static void __exit kruger_driver_exit(void)
{
  printk(KERN_ALERT "Kruger driver exit\n");
}

module_init(kruger_driver_init);
module_exit(kruger_driver_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Kruger");
MODULE_DESCRIPTION("Gpio example driver");


Кусок dts-файла, соответствующий светодиодной линейке:

Код
LEDs_8Bit: ledss@81420000 {
            compatible = "xlnx,xps-gpio-2.00.a", "xlnx,xps-gpio-1.00.a";
            reg = < 0x81420000 0x10000 >;
            xlnx,all-inputs = <0x0>;
            xlnx,all-inputs-2 = <0x0>;
            xlnx,dout-default = <0x0>;
            xlnx,dout-default-2 = <0x0>;
            xlnx,family = "spartan3adsp";
            xlnx,gpio-width = <0x8>;
            xlnx,gpio2-width = <0x20>;
            xlnx,interrupt-present = <0x0>;
            xlnx,is-dual = <0x0>;
            xlnx,tri-default = <0xffffffff>;
            xlnx,tri-default-2 = <0xffffffff>;
        };

Для работы с gpio я использовал структуру gpio_chip.
Все подробности о ней можно узнать из комментариев в файле include/asm-generic/gpio.h

Очень многое я почерпнул из исходников самого ядра, в частности, из "фирмовых" драйверов Xilinx.

Так что, если есть желающие поделится примерами - прошу выкладывать wink.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 22:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01333 секунд с 7
ELECTRONIX ©2004-2016