Из документации ядра 2.6.28 взял пример работы с SPI - spidev_test.c
В конфигурации ядра сделал все как описывали на форуме. Все подключилось.
В /dev появилось устройство spidev. Пример заработал - обращения к драйверу проходят.
Передача вроде должна идти.А вот данных осцилографом не вижу.
Распечатал на консоль значения портов и регистров SPI - режимы вроде установлены верно.
А передачи нет. При этом датафлэш висящая на SPI работает отлично, и когда идет
обращение к ней, то осцилографом все прекрасно видно.
появилось три девайса : spidev1.0,spidev0.1,spidev1.1
посмотрел ссылку.....в конфиге у меня
CONFIG_SPI=y
# CONFIG_SPI_DEBUG is not set
CONFIG_SPI_MASTER=y
#
# SPI Master Controller Drivers
#
CONFIG_SPI_ATMEL=y
# CONFIG_SPI_BITBANG is not set
#
# SPI Protocol Masters
#
# CONFIG_SPI_AT25 is not set
CONFIG_SPI_SPIDEV=y
# CONFIG_SPI_TLE62X0 is not set
# CONFIG_W1 is not set
# CONFIG_POWER_SUPPLY is not set
# CONFIG_HWMON is not set
# CONFIG_THERMAL is not set
# CONFIG_THERMAL_HWMON is not set
# CONFIG_WATCHDOG is not set
CONFIG_SSB_POSSIBLE=y
распечать из ядра на консоль инициализацию SPI попробую вечером....отпишусь..
Эксперименты привели к следующему: вызовы write и read прекрасно работают. А если через ioctl вызывать spidev_ioctl(для полнодуплексного обмена), то из драйвера SPI (atmel_spi.c) идет возврат с ошибкой опций устновленного протокола. И естественно передачи никакой нет. По исходнику посмотрел - там где анализ на нулевую скорость передачи и ноль бит в слове. В уровень spidev.c структура с параметрами доходит нормально(параметры ставятся в верхнем юзерском слое в самой проге). А потом где-то теряются/затираются/обнуляются и до дравера SPI не доходят. Вот счас пробую проследить всю цепочку...
Мда....вот уж не ожидал таких плясок с бубном....не покидает ощущение, что ну не может быть таких ошибок в ядре и я не совсем правильно пользуюсь вызовами ioctl(). Но ведь все взято из примера в документации которая идет с самим ядром. Хотя с другой стороны в этом самом примере сходу нашел одну описку/опечатку/ошибку.
Может кто сталкивался с таким и подскажет что-нибудь дельное? Уж больно не хочется лезть в потроха ядра, править его и с ужасом думать о следущих "танцах", когда придется браться за сокеты и шину I2C
Может стоит под себя переписать atmel_spi? - как это сделал достопочтенный sasa, он уже не раз ругался на реализацию atmel_spi в linux. Я пока сам туда не нырял.
Похоже что atmel_spi худо-бедно работает. А вот spidev каким-то образом теряет данные при передаче их от пользовательской программы к atmel_spi, причем только в режиме полнодуплексного обмена. Как я выше написал, зарегенные функции write/read работают...что и проверено осцилографом. Все передется/принимается, все сигналы красивые...А вот фуллдуплекс...
На разбор "кухни" и перепись уровня spidev времени нету. Были мечты - вот...готовая рабочая ось...все есть, сеть, протоколы, поддержка всевозможных шин...бери и пиши сразу прикладное ПО....мда....реалии пока говорят немного о другом...
Не спешите с выводами - spi у атмела в linux работает в дуплексе "из коробки", почему spidev не работает - нужно разбираться. С удовольствием бы занялся вашей проблемой но я далеко от дома, нет ни времени ни платы под рукой. Я бы погуглил тщательней и начал бы поиск с архива форума www.at91.com