Доброго времени суток!
В данный момент времени приходится разбираться с программированием драйверов для периферии Microblaze (до этого имел небольшой опыт в программировании драйверов для ARM9 семейства AT91).
Суть данной темы (как мне кажется

) на этом форуме в том, чтобы любой желающий кому нужна и/или интересна подобная тематика (примеры, общие вопросы и рекомендации программирования драйверов с учетом аппаратных особенностей IP-COREs Microblaze) смог задать вопрос, найти готовый рабочий кусок кода и т.д. К сожалению просидев неделю в гугле, ничего подобного и полезного в таком же духе не нашел
Как водится, начал я с мигания светодиодом. Вот пример кода драйвера который засвечивает третий светодиод в линейке:
Код
#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.
Так что, если есть желающие поделится примерами - прошу выкладывать