Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:4
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:8
Форум » starterkit.ru » Embedded Linux
SPI на AT91SAM9XE512
OHara
Добавлено 12.07.2010 10:15
0
Сообщение: 1
OHara
0

Пункты: 84
Регистрация: 25.12.2009
День добрый!
Подскажите, как получить доступ к устройству по SPI. Почитал Documentation/spi. В /dev никаих устройств с именем spi нет. Ядро 2.6.27. В конфиге ядра atmel spi включен, звуковое устройство at73c213 тоже. В board-sam9260ek.c все по-умолчанию:
static struct spi_board_info ek_spi_devices[] = {
#if !defined(CONFIG_MMC_AT91)
{ /* DataFlash chip */
.modalias = "mtd_dataflash",
.chip_select = 1,
.max_speed_hz = 15 * 1000 * 1000,
.bus_num = 0,
},
#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
{ /* DataFlash card */
.modalias = "mtd_dataflash",
.chip_select = 0,
.max_speed_hz = 15 * 1000 * 1000,
.bus_num = 0,
},
#endif
#endif
#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
{ /* AT73C213 DAC */
.modalias = "at73c213",
.chip_select = 0,
.max_speed_hz = 10 * 1000 * 1000,
.bus_num = 1,
.mode = SPI_MODE_1,
.platform_data = &at73c213_data,
},
#endif
};

Выхлоп:
Linux version 2.6.30 (yura@yurawork) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) ) #3 Thu Mar 4 15:50:39 MSK 2010
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: Atmel AT91SAM9260-EK
Memory policy: ECC disabled, Data cache writeback
On node 0 totalpages: 16384
free_area_init_node: node 0, pgdat c0308af0, node_mem_map c031f000
Normal zone: 128 pages used for memmap
Normal zone: 0 pages reserved
Normal zone: 16256 pages, LIFO batch:3
Clocks: CPU 198 MHz, master 99 MHz, main 18.432 MHz
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
Kernel command line: mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2
NR_IRQS:192
AT91: 96 gpio irqs in 3 banks
PID hash table entries: 256 (order: 8, 1024 bytes)
Console: colour dummy device 80x30
console [ttyS0] enabled
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 61700KB available (2732K code, 230K data, 104K init, 0K highmem)
Calibrating delay loop... 99.12 BogoMIPS (lpj=495616)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 296 bytes
NET: Registered protocol family 16
AT91: Power Management
AT91: Starting after power-restored wakeup
tcb_clksrc: tc0 at 12.916 MHz
bio: create slab <bio-0> at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
NET: Registered protocol family 1
NetWinder Floating Point Emulator V0.97 (double precision)
JFFS2 version 2.2. (NAND) (SUMMARY) © 2001-2006 Red Hat, Inc.
msgmni has been set to 120
alg: No test for stdrng (krng)
io scheduler noop registered
io scheduler anticipatory registered (default)
atmel_usart.0: ttyS0 at MMIO 0xfefff200 (irq = 1) is a ATMEL_SERIAL
atmel_usart.1: ttyS1 at MMIO 0xfffb0000 (irq = 6) is a ATMEL_SERIAL
atmel_usart.2: ttyS2 at MMIO 0xfffb4000 (irq = 7) is a ATMEL_SERIAL
brd: module loaded
loop: module loaded
ssc ssc.0: Atmel SSC device at 0xc4870000 (irq 14)
Driver 'sd' needs updating - please use bus_type methods
MACB_mii_bus: probed
eth0: Atmel MACB at 0xfffc4000 irq 21 (3e:36:65:ba:6f:be)
eth0: attached PHY driver [Davicom DM9161A] (mii_bus:phy_addr=ffffffff:00, irq=-1)
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
AT91 NAND: 8-bit, Software ECC
Scanning device for bad blocks
Creating 3 MTD partitions on "atmel_nand":
0x000000000000-0x000000400000 : "Bootstrap"
0x000000400000-0x000004000000 : "Partition 1"
0x000004000000-0x000010000000 : "Partition 2"
atmel_spi atmel_spi.1: Atmel SPI Controller at 0xfffcc000 (irq 13)
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
at91_ohci at91_ohci: AT91 OHCI
at91_ohci at91_ohci: new USB bus registered, assigned bus number 1
at91_ohci at91_ohci: irq 20, io mem 0x00500000
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
udc: at91_udc version 3 May 2006
mice: PS/2 mouse device common for all mice
input: gpio-keys as /class/input/input0
rtc-at91sam9 at91_rtt.0: rtc core: registered at91_rtt as rtc0
IRQ 1/rtc0: IRQF_DISABLED is not guaranteed on shared IRQs
Registered led device: ds5
Registered led device: ds1
Advanced Linux Sound Architecture Driver Version 1.0.20.
at73c213 spi1.0: at73c213: supported bitrate is 48500 (64 divider)
ALSA device list:
#0: AT91SAM9260-EK external DAC on irq 14
TCP cubic registered
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
rtc-at91sam9 at91_rtt.0: setting system clock to 2010-07-12 09:43:43 UTC (1278927823)
VFS: Mounted root (jffs2 filesystem) on device 31:1.
Freeing init memory: 104K
udevd version 124 started

Скорее всего истина где-то рядом :)
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 12.07.2010 12:58 Сообщение: 2
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
я не силен в программирование, но вот выдержка из /Documentation/spi/spidev:
Код
When you do that, the sysfs node for the SPI device will include a child
device node with a "dev" attribute that will be understood by udev or mdev.
(Larger systems will have "udev". Smaller ones may configure "mdev" into
busybox; it's less featureful, but often enough.) For a SPI device with
chipselect C on bus B, you should see:

/dev/spidevB.C ... character special device, major number 153 with
a dynamically chosen minor device number. This is the node
that userspace programs will open, created by "udev" or "mdev".

/sys/devices/.../spiB.C ... as usual, the SPI device node will
be a child of its SPI master controller.

/sys/class/spidev/spidevB.C ... created when the "spidev" driver
binds to that device. (Directory or symlink, based on whether
or not you enabled the "deprecated sysfs files" Kconfig option.)


в /dev у меня тоже ничего нет, но например вот вывод команды:
Код
armets:~# ls /sys/class/spi_master/spi1/device/spi1.1/graphics\:fb0
bits_per_pixel console dev mode name rotate stride uevent
blank cursor device modes pan state subsystem virtual_size

еще имеет смысл покопаться на сайте Атмела, там есть масса примеров по работе с железом..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
OHara
Добавлено 12.07.2010 14:37 Сообщение: 3
OHara
0

Пункты: 84
Регистрация: 25.12.2009
Все правильно, в /sys следы присутствуют, это класс устройства, на основании этого зарегистрированного класса udev (как и написано в вашей цитате) должен создать само устройство вида /dev/spiB.C, где B-это шина, С-чип селект, то есть для описанного случая, должно быть что-то вроде /dev/spi1.0, как я понимаю. Но этого-то нет.
Спуститься к концу Подняться к началу
Персональная информация
Strijar
Добавлено 12.07.2010 15:04 Сообщение: 4
Strijar
Ранг
5

Группа: Клиенты
Пункты: 1618
Регистрация: 21.04.2009
Пол: Мужчина
Самое простое:

1) spidev включите в ядре "User mode SPI device driver support"
2.1) поправьте cs в at91sam9260_devices.c

static const unsigned spi0_standard_cs[4] = {...
и
static const unsigned spi1_standard_cs[4] = {...

2.2) жестко включите spi там же

short enable_spi0 = 1;
short enable_spi1 = 1;

3) после запуска mdev -s появятся /dev/spi* с котрыми можно работать из userspace
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 12.07.2010 15:24 Редактировалось 12.07.2010 15:25 Сообщение: 5
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
чисто для проверки попробовал
в логе проскакивает
Код
atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffc8000 (irq 12)
atmel_spi atmel_spi.1: Atmel SPI Controller at 0xfffcc000 (irq 13)
fb0: pcf8833 frame buffer device, 33K of video memory
ALSA device list:
#0: AT91SAM9260-EK external DAC on irq 14

пробовал и mdev -s и udev stop/start

устройства работают как и должны а вот /dev/spiX не создаются..

предполагаю, что где-то в правилах надо разрешить/прописать поиск и создание spidevХ, хотя на каждом углу написано "не создавайте spi руками - низзя!"
#define DEV_SPI "/dev/spi0" /* Create device with 'mknod /dev/spi0 c 228 0' */

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
OHara
Добавлено 12.07.2010 15:51 Сообщение: 6
OHara
0

Пункты: 84
Регистрация: 25.12.2009
[quote]чисто для проверки попробовал
в логе проскакивает
Код
atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffc8000 (irq 12)
atmel_spi atmel_spi.1: Atmel SPI Controller at 0xfffcc000 (irq 13)
fb0: pcf8833 frame buffer device, 33K of video memory
ALSA device list:
#0: AT91SAM9260-EK external DAC on irq 14

пробовал и mdev -s и udev stop/start

устройства работают как и должны а вот /dev/spiX не создаются..

предполагаю, что где-то в правилах надо разрешить/прописать поиск и создание spidevХ, хотя на каждом углу написано "не создавайте spi руками - низзя!"
#define DEV_SPI "/dev/spi0" /* Create device with 'mknod /dev/spi0 c 228 0' */[/quote]

Так вот и я о том же... В логе у меня тоже похожие строчки есть. udev все равно автоматом создаст что ей надо, если, конечно, этого не сделать руками, только не 228, а 135 (в драйверах такой старший номер для spi устройств используется). Сейчас перекомпилю адро по совету strijar, хотя
по большому счету там так и делается:
1. user mode в конфигу ядра стоит,
2.cs не трогал как были

static const unsigned spi0_standard_cs[4] = { AT91_PIN_PA3, AT91_PIN_PC11, AT91_PIN_PC16, AT91_PIN_PC17 };
static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB3, AT91_PIN_PC5, AT91_PIN_PC4, AT91_PIN_PC3 };

3.enable_spi0 и enable_spi1 выставляются в коде процедуры в зависимоти от установленной шины для устройства (для at73с213 это 1), но не трудно поставить и принудительно сразу для всех шин
Спуститься к концу Подняться к началу
Персональная информация
OHara
Добавлено 12.07.2010 16:12 Сообщение: 7
OHara
0

Пункты: 84
Регистрация: 25.12.2009
Итак, с новым ядром:
включилась, естественно, 0 шина (в логах atmel_spi.0 на 12 IRQ0)
atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffc8000 (irq 12)
atmel_spi atmel_spi.1: Atmel SPI Controller at 0xfffcc000 (irq 13)

появились устройства sequencer и sequencer2. После mdev -s добавилось еще устройство seq. Кстати, перегрузил после этого предыдущее ядро, те же устройства присутствуют, ходя раньше не было, наверное что-то проинициализировалось :)
Но /dev/spi так и нет.

Еще настораживает в логе вот что, чего не было в начале (см. выше):
No state is present for card at73c213_0
/usr/sbin/alsactl: parse:1620: Unable to open file '/usr/share/alsa/init/00main': No such file or directory
No state is present for card at73c213_0
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 12.07.2010 16:59 Сообщение: 8
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
по поводу udev
покопался в инете, наткнулся на примитивную статейку
http://www.opennet.ru/base/sys/udev_review.txt.html
вот выдержка оттуда

Цитата
Первым делом, перед написанием правила udev, вы должны убедиться что
ядро видит ваше устройство, для которого будет применено это правило.
Для этого используйте udevinfo. Пример команды, формирующей дамп всех
устройств в базе udev:
$ udevinfo -e

так вот команда udevinfo -e |grep spi
ничего не находит, т.о. можно предположить, что чего то не хватает, то ли в настройках ядра, то ли в структурах девайсов..
помнится, я в каких-то более старых ядрах видел мелькание spi0.1 spi1.2.. увы за давностью не помню..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Strijar
Добавлено 12.07.2010 17:35 Сообщение: 9
Strijar
Ранг
5

Группа: Клиенты
Пункты: 1618
Регистрация: 21.04.2009
Пол: Мужчина
Запамятовал! ;) Еще нужно добавить

Код

/*
* SPI devices.
*/
static struct spi_board_info ek_spi_devices[] = {

..................

{
.modalias = "spidev",
.chip_select = 2,
.controller_data = AT91_PIN_PC5,
.max_speed_hz = 1 * 1000 * 1000,
.bus_num = 1,
},
{
.modalias = "spidev",
.chip_select = 3,
.controller_data = AT91_PIN_PC4,
.max_speed_hz = 1 * 1000 * 1000,
.bus_num = 1,
}
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 12.07.2010 17:51 Сообщение: 10
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
я об этом днем вычитал, но подмена "влоб" на spidev тогда не помогла..

а теперь стало чуть лучше :)

Код
armets:~# ls /dev/sp* -l
crw-rw---- 1 root root 153, 0 Jul 12 09:40 /dev/spidev1.0
crw-rw---- 1 root root 153, 1 Jul 12 09:40 /dev/spidev1.1


и казалось бы, цель достигнута, но.. сами железяки теперь отсохли (так было и раньше как в первой строке), теперь видимо надо еще в драйверах имена менять :)))

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux