Проверил на SK-iMX6S-SODIMM - это почти аналог OEM с таким же процессором SOLO. Чуда не произошло, все работает штатно - SPI никак не влияет на GPIO. Кстати, чтобы мой пример работал правильно на SOLO надо исправлять так
#define CONFIG_MX6DL #undef CONFIG_MX6Q
Проверял светодиодом с резистором 2 кОм - там сразу видно что пин включен как выход и 1, иначе он не горит - внутренней подтяжки у пина светодиоду недостаточно когда пин вход.
Что у вас не так не могу сказать - не экстрасенс :) возможно с питанием что-то.
Попробуйте еще вместо коментариев в DTS удалить ненужные секции - может там что-то некорректно срабатывает.
Понимаю, что ситуация нестандартная. У меня она повторяется и на своих платах, там ее и увидели. Там мы используем-buildroot-2014.08. Спасибо за оказанную поддержку, направления поиска вроде бы ясны.
вы зря приписываете imx свойства ИИ - их там нет..
наиболее вероятная причина - косяки в вашем софте.
чтобы получить внятную помощь требуется выложить максимально короткий исходник для одного пина и кратко описать суть происходящего, а то из ваших пяти опытов не поймешь "кто кому чего должен"
могу предположить, что либо маску не так накладываете, либо выходите криво..
как ранее справедливо написали, работать через mmap очень плохая идея - ядро знать не знает о вашей самодеятельности и имеет полное право рулить регистрами на свое усмотрение
вывод - любым доступным методом - через dts, либо через echo > export объяснить ядру, что пин занят и тогда у вас не будет конфликтов, мистики и барабашек..
Полностью с Вами согласен. Пять примеров как раз и должны были показать, что система рулит этими регистрами по-своему. Возможно они лишние здесь, я не хотел никого ими запутать. При использовании sysfs этого не происходит. Для меня непонятен этот эффект,я хочу в этом разобраться, понять что на что влияет, ведь использование mmap, насколько помню, нигде не запрещено. Вся исходная информация, софт и суть происходящего кратко были описаны в первом посте. Обратился сюда в надежде что что-то у кого-то такое уже было. Так как ситуация больше ни у кого не повторялась, то мне и разбираться. У меня к sasamy просьба выложить dts системы на SK-iMX6S-SODIMM из эксперимента, если он остался. Спасибо!
Спасибо! Это точно тот файл, с которым пробовали? Разве ниже gpio в описании ipu1 выход 5.19 не переопределяется на MX6QDL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC 0x80000000 ? Понимаю, что в Вашем примере IOMUX затем выставляется правильно и со стороны контроллера все работает, а вот система то этот выход как воспринимает? Или ошибаюсь?
точнее не бывает - прямо из собранных исходников ядра
нет - смотрите внимательно, эти пины никем в DTS не используются, просто описаны в секции pinctrl_ipu1_csi_sodimm. Пины которые переключатся даже если никем не используются описаны в специальной секции hog
Я понимаю, что ошибка где-то у меня, не в контроллере, не в системе. Но если говорить о коде программы, которой выставляются выходы, то я ведь использую для этого в том числе и Вашу программу, которая априори у Вас работает. Да и моей программой состояние регистра меняется, состояние выхода тоже меняется. В том то и проблема, что регистры программой меняются, выход выставляется, но при определенных действиях с системой самой системой они сбрасываются.
В документации на GPIO imx все просто, описаны два пункта по три действия для входов и выходов. Там нет ничего особенного и обе программы и Ваша и моя эти действия выполняют. В вашей программе дополнительно производится конфигурация IOMUX, которая уже и без того выполняется в dts. Чтение этих регистров сразу после загрузки это подтверждает. Думаю, вопрос об ошибке в этом ПО пора бы снять. Если там и есть ошибка, то только в том что что-то еще надо сделать дополнительно, чтобы система поняла, что этот выход используется. Но из userspace этого скорее всего не сделать.
Если говорить о файле dts, то я не могу понять почему в ядре нет информации о том, что эти выводы используются. Тому много подтверждений. Вывод команды cat /sys/kernel/debug/gpio дает информацию о gpio, используемые системой. Там есть пин 5.17 CS ecspi, есть другие пины, но пинов 5.19 и 5.20 нет. Может у меня на данный момент еще недостаточно информации и это ни о чем не говорит... Или вот если я через mmap определяю эти пины как выходы и потом через sysfs определяю один из них, система при этом переопределяет второй как вход(для него сбрасывается бит в регистре GDIR). SPI выход опять же у меня сбрасывает.
Но когда я смотрю на Ваш dts и свой, то разницы не вижу. Тем не менее у Вас все работает.
Вы говорите у меня в коде ошибка. Но весь мой код у Вас перед глазами. Buildroot с сайта starterkit(завтра попробую скачать заново и все с нуля повторить), изменена на свою только плата и dts, dts привел, программу для тестирования использую фактически Вашу(перекомпилировал под свой контроллер).
Ну и про sysfs, система в этом случае точно знает, что для нее конкретно этот пин значит. Скорее всего, потому и влияния нет, имхо. В исходниках на драйвер gpio imx при беглом осмотре используются те же регистры что мы используем, плюс регистры прерываний. Плюс регистрация в системе в драйвере выше.
У меня не настолько богатый опыт конфигурирования dts, видите ли Вы там ошибки? Может есть какие-то средства отладки, контроля dts. Пробовал отобразить dts в sysfs, но полезного для себя там не нашел(может не знаю где смотреть).
Насколько понимаю, в dts этого ядра можно явно сконфигурировать пин как выход и явно задать уровень, этого еще не пробовал.
Может есть какие-то средства отладки, контроля dts.
Как понимаю, информация в pinctrl debugfs полностью отображает назначение и использование пинов в системе. Не знаете, насколько этим данным можно доверять?