LINUX.ORG.RU

Порядок загрузки ядра


0

0

Суть вопроса такая - есть кпк с процессором pxa270, ядро 2.6.11 и ядро 2.6.27. С первого украден и подправлен драйвер АЦП. И все бы хорошо, да только две проблемы.
Первая - в 2.6.11 инициализация АЦП была прописана в _init для кпк, и все прекрасно грузилось. А в 2.6.27 то же самое приводит к ошибке, т.к. ssp, на котором висит АЦП, подгружаться стал уже после АЦП, и тот пытается схватиться за воздух, что плохо получается. Приходится вызывать эту функцию из _probe драйвера.
Вторая, которая возможно следует из первой - если грузить АЦП из _probe, вылетает reciever overrun (значит что FIFO заполнен), а эта радость вместо всяких значений возвращает 0xffff.
Вопросы сами такие - кто-нибудь знает почему в 2.6.11 все грузилось? Ну, или может флаг в конфиге ядра есть который отвечает за это. И откуда может выплывать overrun напару с такими значениями?

★★★★★

>т.к. ssp, на котором висит АЦП, подгружаться стал уже после АЦП

Для начала, чтобы драйвер ssp стартовал до ацп поправь linux-2.6.32.5/drivers/Makefile чтобы строчка с тем где собирается ssp оказалась до строчки где находится драйвер ацп начиная с начала файла.

zlovred
()
Ответ на: комментарий от zlovred

Как то криво объяснил наверно :) В общем при статической линковке модулей порядок инициализации задается именно порядком следования в этом Makefile. Если посмотреть на самое начало

# Rewritten to use lists instead of if-statements.
#

obj-y += gpio/
obj-$(CONFIG_PCI) += pci/

это означает что сначала будет проинициализирована подсистема gpio, потом pci и тд. Если поменять местами

obj-$(CONFIG_PCI) += pci/
obj-y += gpio/

то наоборот - pci, потом gpio.

zlovred
()
Ответ на: комментарий от zlovred

Спс, но я имел ввиду немного другое - инициализация АЦП висела в MACHINE_START, то есть он начинал работать сразу после добавления board-устройств. А в 2.6.27 сначала добавляются все девайсы, а только потом они начинают включаться. То есть инициализация шла после добавления, но до включения. Видимо это уже не лечится, только перенос места включения ;)

upcFrost ★★★★★
() автор топика

Кстати странность - если ему указать порт ssp не сразу 3 (у меня АЦП висит на SSP3), а скажем первый, то он последовательно тыкается в каждый порт, находит третий, и ему все нравится, overrun не вылезает... Значения сейчас проверю

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от upcFrost

Ты меня запутал :) MACHINE_START - передается управление на board-файл, там производится начальная инициализация устройств имеющихся в системе, тех которые нужны сразу после включения - например отладочная консоль, плюсом регистрируются драйверы платформы, настраиваются порты ввода-вывода (например переключение с gpio на периферию), могут настраиваться и режим работы как ssp, ssc, usart и тд, внешние накопители типа nandflash, таблицы spi/i2c slave устройств. Потом в процессе загрузки инициализируются модули - в цикле вызываются ф-ции init соответствующих модулей (порядок их как раз зависит от порядка Makefile о котором я говорил). После инициализации мастер-контроллеров вызываются ф-ции probe для подчиненных устройств которые зарегистрированы для мастеров (spi/i2c например).

zlovred
()
Ответ на: комментарий от zlovred

Именно в настройке режима ssp вся соль - функция ssp_init возвращает что ssp с таким портом нету. При том для любого порта. И она продолжает так делать если пытаться настроить режим работы ssp в board-файле.

upcFrost ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.