|
|
  |
Прикрутить стандарный драйвер к новой шине |
|
|
|
Feb 19 2013, 05:02
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Hoodwin @ Feb 19 2013, 00:57)  3) Автоматическое связывание устройства и драйвера делается в рамках шины одного типа. То есть, для того, чтобы UART завелся на шине VLYNQ, должен быть написан специальный драйвер, который зарегистрируется на шине VLYNQ и найдет там свое устройство. Исходный вопрос как раз и сводился к тому, есть ли какой-нибудь стандартный способ связывания имеющихся драйверов от старых шин с новыми шинами. Ну в общем я не так понял исходные данные. Я понял вопрос в том, чтобы поднимать на шине стандартные драйверы, написав ТОЛЬКО драйвер шины, и не трогая код "стандартных" драйверов девайсов, и не делая новых драйверов девайсов (и это основное в вопросе - не трогать ничего, связанного с девайсами, а писать только драйвер шины). Поэтому предложил статическое объявление, которое это позволяет, по крайней мере с драйвером уарта. А так да, выход один, писать некие "врапперы" на стандартные драйверы, которые пробуют себя на шине VLYNQ, зная, как с этой шиной работать, и патчить те драйверы, которые не умеют работать через функции ввода-вывода, заданные снаружи, чтобы они этому научились.
|
|
|
|
|
Feb 19 2013, 09:14
|
Знающий
   
Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107

|
Да я думаю, что написать маленький минидрайвер не будет большой проблемой.
С драйвером UART вляпался в дурацкую проблему. Прерывания в VLYNQ передаются пакетом из одного 32-битного слова, которое предлагается писать в регистр установки флагов прерывания. То есть, реально можно только взвести прерывание, если соответствующий ему бит принятого слова установлен. Сейчас у меня слово передается только если произошло изменение в каком-либо сигнале прерывания внутри ПЛИС. Но реально работают только единички, они взводят биты в регистре VLYNQ контроллера внутри SOC. А драйвер UART 8250.c написан так, что он не пытается разгрести все прерывания порта за один раз. Он отрабатывает определенную последовательность действий и выходит, видимо рассчитывая, что если она не отобьет прерывание, то он снова зайдет в обработчик и его обработает. В итоге получается, что после первого захода он все не отрабатывает, прерывание от кора UART внутри ПЛИС не снимается, кор vlynq не видит изменения статуса и не шлет пакет в SOC. В итоге второго прерывания уже не возникает. Ну и много интересных эффектов возникает на этой почве... Теперь вот думаю, как это залечить наиболее грамотно. То ли прерывание от UART передергивать после чтения регистра статуса прерывания, чтобы фронт второй возник, то ли думать, как научить VLYNQ транслировать именно состояние линии прерывания.
|
|
|
|
|
Feb 20 2013, 16:45
|
Знающий
   
Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107

|
А вот еще совсем простой вопрос. Если я хочу собирать модуль для ядра, но в отдельном проекте, в отдельном каталоге (не в ядре). Но при этому у меня сам проект ядра есть уже развернутый. Как наиболее правильно настроить среду для сборки модуля? Ну, например, нужно прикрутить kernel headers и какие-то объектные модули ядра, которые линкуются в модуль .ko. Как правильно указать ссылку на это все? Просто тупо в каталоге проекта сделать симлинк, или можно как-нибудь "официально" разместить (экспортировать) все эти штуки в какой-нибудь общий путь рядом с кросс-компилятором? Подозреваю, что можно сделать и так и так, лишь бы Makefile правильно под это написать, но хочется сделать это так, чтобы можно было в одной машине в SCM положить, на другой достать и собрать. А из этого следует, что патчить ручками содержимое Makefile-ов (путей там всяких) - неправильно. Есть у кого-нибудь опыт подобного?
|
|
|
|
|
Feb 20 2013, 18:46
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Hoodwin @ Feb 20 2013, 20:45)  какие-то объектные модули ядра, которые линкуются в модуль .ko это какие и зачем? Цитата(Hoodwin @ Feb 20 2013, 20:45)  Есть у кого-нибудь опыт подобного? external modules, редко у кого нет - не патчами же держать
|
|
|
|
|
Feb 21 2013, 11:18
|
Знающий
   
Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107

|
SMЦитата там именно в makefile первой строчкой идут пути к хидерам ядра. А чтобы это стало официальным - об этом надо написать в README Ну, так именно этого то хочется избежать. Хочется сделать так, чтобы в тех файлах, что попадут в архив (source control), не было никаких путей. У одного пользователя они одни, у другого другие. Нужно, чтобы в README было написано: настройте N переменных окружения: путь к кросс-компилятору, путь к ядру, путь, куда его собирать, путь к ..., и все. Дальше просто берем из репозитория срез и делаем make. sasamyСпасибо, почитал. Попробую-что-то слепить. К сожалению, сборка ядра от linux-c6x несколько отличается от того, что там написано. Несколько драйверов из родного дерева я собирал в виде модулей. Ни разу нет ничего похожего на /lib/modules/'uname -r'/extra. Зато нашел их примерно тут: Код ./Build/rootfs/kernel-modules-c6x/lib/modules/2.6.34-MORS8.el-20120628-jffs2/build Пробовал искать по файлам проекта (Makefile искал) слово kernel-modules-c6x, так не нашел. Как так вышло, что они именно в rootfs залетают? Зато заголовки живут прямо в Build: Код ./Build/kernel-headers IdleНу, я грешным делом подумал, что для оптимизации таблиц для динамического связывания на каждый вызов внешней функции геренрируется специальный код вида 'jmp <addr>', который статически линкуется с проектом, и в итоге в рантайме нужно править только один адрес. Так во всяком случае раньше делали с динамическими библиотеками. Или с .ko никто подобным не занимается, и тупо нужно править каждый конкретный вызов внешней функции? Добавление. Не, нашел kernel-modules. В главном Makefile'е: Код # install kernel modules here MOD_DIR = $(BLD)/rootfs/kernel-modules-$(ARCHe)
# install kernel headers here HDR_DIR = $(BLD)/kernel-headers KHDR_DIR = $(HDR_DIR)/usr
|
|
|
|
|
Feb 21 2013, 11:40
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Hoodwin @ Feb 21 2013, 15:18)  SM
Ну, так именно этого то хочется избежать. Хочется сделать так, чтобы в тех файлах, что попадут в архив (source control), не было никаких путей. У одного пользователя они одни, у другого другие. Нужно, чтобы в README было написано: настройте N переменных окружения: путь к кросс-компилятору, путь к ядру, путь, куда его собирать, путь к ..., и все. Дальше просто берем из репозитория срез и делаем make. так makefile понимает переменные окружения, ну или типа: make KERNEL_HEADERS=/xx/xx/xx CROSS_COMPILE=arm-unknown-linux-gnueabi make install DESTDIR=/куды/впихнуть хотя это тоже грубо переменные окружения просто лично я предпочитаю вписать все в макефиле в таком случае, чтобы не вспоминать, что же там за переменные.
|
|
|
|
|
Feb 21 2013, 13:08
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(Hoodwin @ Feb 21 2013, 15:18)  Как так вышло, что они именно в rootfs залетают? Например так Код TOP_DIR ?= $(HOME) KERN_DIR = $(TOP_DIR)/imx233/linux-2.6.35.3-11.09.01-sk RFS_DIR = $(TOP_DIR)/imx233/rootfs ARCH ?=arm GCC ?=arm-none-linux-gnueabi-
obj-m += tstdrv.o
all: $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(GCC) -C $(KERN_DIR) M=$(PWD) modules install: $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(GCC) -C $(KERN_DIR) M=$(PWD) INSTALL_MOD_PATH=$(RFS_DIR) modules_install clean: $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(GCC) -C $(KERN_DIR) M=$(PWD) clean
|
|
|
|
|
Feb 21 2013, 13:36
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Hoodwin @ Feb 21 2013, 15:18)  Ну, я грешным делом подумал, что для оптимизации таблиц для динамического связывания на каждый вызов внешней функции геренрируется специальный код вида 'jmp <addr>', который статически линкуется с проектом, и в итоге в рантайме нужно править только один адрес. Так во всяком случае раньше делали с динамическими библиотеками. Или с .ko никто подобным не занимается, и тупо нужно править каждый конкретный вызов внешней функции? А, это не - не знаю как работает.
|
|
|
|
|
Feb 21 2013, 14:05
|
Знающий
   
Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107

|
А еще дурацкий вопрос. Как узнать строчку OS release для текущего собираемого ядра, если я делаю через кросс-компиляцию? Добрые дяденьки из TI придумали вставлять в название ядра текущую дату сборки, в итоге у меня драйвер собрался с сегодняшней датой, и на вчерашнем ядре работать отказался. Пришлось ядро пересобрать и залить на TFTP. Я, наверное, этот идиотизм порежу и уберу дату из названия ядра. Но все же даже если даты в названии не будет, то как получить то название целиком? uname -r не прокатит, а полное имя там составное, из названия архитектуры, платы, размещения rootfs (initramfs vs jffs2) и endian. При таком раскладе как его узнать? И еще, KERN_DIR в примере выше - это путь к сборке ядра или к исходникам? Цитата Там .fixup секция, она архитектурно-зависимая, где хранится весь список релокейшенов и внешних связей. Короче линковка как линковка... А как линкер отличает, какие символы считать правильными unresolved external и помещать в .fixup, а какие - нет? Я так понимаю, что отличие .ko от .o только в том и состоит, что в нем должны остаться только правильные unresolved externals, которые объявлены как внешние, линкуемые при загрузке.
|
|
|
|
|
Feb 21 2013, 16:13
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Hoodwin @ Feb 21 2013, 18:05)  А как линкер отличает, какие символы считать правильными unresolved external и помещать в .fixup, а какие - нет? Я так понимаю, что отличие .ko от .o только в том и состоит, что в нем должны остаться только правильные unresolved externals, которые объявлены как внешние, линкуемые при загрузке. Как я понимаю, все unresolved external там есть. А правильный он или нет, разбирается insmod, и ругается, если что. А отличие от ".o" лишь в одной букве расширения. А как это Вы такого добились, чтобы оно даты сравнивало? Я периодически вот собираю TI-шные powervr дрова как модули, никакой привязки. Даже как правило пересборка ядра при незначительных изменениях не приводит к тому, чтобы пересобирать модули. Это наверное какая-то особая доп. фича при сборке модуля.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|