Перейти к содержанию
    

BKV

Участник
  • Постов

    27
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о BKV

  • Звание
    Участник
    Участник
  1. BSP на Olimex EP930X

    Доброго дня! Откопал плату Olimex EP930X, к сожалению диск к ней, думаю был, отсутсвует. Собственно интересует toolchain, BSP и документация на эту плату. Может быть у кого-либо имеется? Спасибо
  2. SPI: DM365 and VITA1300

    Я понимаю, что 16 битный регистр не может принять за раз 26 бит, поэтому и разбиваю при записи посылку на две. Основная идея понятна - надо посылать данные в виде 16 битного числа, буду пробовать.
  3. SPI: DM365 and VITA1300

    Вы не совсем правы: - при чтении генерируются 26 clock, что подтверждается осцилографом и значением регистра SPIFMT - что касается смутивших Вас нескольких вызовов davinci_spi_setup_transfer, то видно, что передача начинается только после настройки корректного значения А вот за последнее замечание спасибо, но не затруднит ли Вас чуть более его расшифровать, к какому виду я должен привести свои данные для корректной записи? Спасибо.
  4. SPI: DM365 and VITA1300

    Доброго дня! Необходимо по SPI управлять матрицей VITA1300, на плате стоит процессор DM365, используется linux-2.6.18. Технические особенности SPI на устройствах: DM365: сдвиговый регистр 16 бит VITA1300: адрес 9 бит, данные 16 бит В качестве программы используется пример идущий в составе ядра. Чтение регистра: uint8_t tx[] = {0, 8}; uint8_t rx[ARRAY_SIZE(tx)] = {0, 0}; struct spi_ioc_transfer tr = { .tx_buf = (unsigned long)tx, .rx_buf = (unsigned long)rx, .len = ARRAY_SIZE(tx), .delay_usecs = delay, .speed_hz = speed, .bits_per_word = 26, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); Запись в регистр: uint8_t trv[] = {1, 8}; uint8_t twv[] = {7, 9}; struct spi_ioc_transfer wr[2] = { [0] = { .tx_buf = (unsigned long)trv, .rx_buf = (unsigned long)NULL,//rx, .len = ARRAY_SIZE(trv), .delay_usecs = delay, .speed_hz = speed, .bits_per_word = 10 }, [1] = { .tx_buf = (unsigned long)twv, .rx_buf = (unsigned long)NULL,//rx, .len = ARRAY_SIZE(twv), .delay_usecs = delay, .speed_hz = speed, .bits_per_word = 16 } }; ret = ioctl(fd, SPI_IOC_MESSAGE(2), wr); К чтению вопросов нет, возвращаемые значения соответствуют указанным в документации. А вот с записью проблема, сама команда проходит без ошибок, но следующая команда чтения возвращает не изменённое значение. В драйвер были вставлены отладочные сообщения, вывод следующий: starting davinci_spi_setup davinci_spi_setup_transfer: bits_per_word 8, hz 2500000 davinci_spi_setup_transfer: bits_per_word 8 starting davinci_spi_setup davinci_spi_setup_transfer: bits_per_word 8, hz 2500000 davinci_spi_setup_transfer: bits_per_word 8 starting spidev_message txbuf: [0] 0, [1davinci_spi_setup_transfer: bits_per_word 8, hz 2500000 ] 0x8 davinci_spi_setup_transfer: bits_per_word 10 davinci_spi_chipselect: value 1 starting davinci_spi_bufs_pio davinci_spi_bufs_pio, conv 2, count 1, len 2 starting davinci_spi_bufs_prep davinci_spi_bufs_pio: data1_reg_val 268435456, cs_hold 1 << chhold_shift 28, davinci_spi_bufs_pio: t->tx_buf davinci_spi_bufs_pio: SPIINT 0x0, SPIFLG 0x1000200 ############################# davinci_spi_tx_buf_u16: tx 0x801 davinci_spi_bufs_pio, bits_per_word 8 davinci_spi_bufs_pio: data1_reg_val |= (mask & tx_data) 0x10fe0801 |= (0xFFFF & 0x801) davinci_spi_bufs_pio: buf_val 0x80ff00c0 davinci_spi_bufs_pio: SPIFMT0 val 0x300a davinci_spi_bufs_pio: SPIFMT1 val 0x300a davinci_spi_bufs_pio: SPIFMT2 val 0x300a davinci_spi_bufs_pio: SPIFMT3 val 0x300a davinci_spi_bufs_pio: buf_val 0x80ff00c0 & SPI_SPIBUF_TXFULL_MASK 0x20000000 = 0x0 davinci_spi_bufs_pio: SPIFLG 0x1000200, count 0 ####################### davinci_spi_bufs_pio: int_status 0x1000200 starting davinci_spi_check_error davinci_spi_check_error: ret 0 davinci_spi_bufs_pio: davinci_spi->count 2, t->len 2 davinci_spi_setup_transfer: bits_per_word 8, hz 2500000 davinci_spi_setup_transfer: bits_per_word 16 starting davinci_spi_bufs_pio davinci_spi_bufs_pio, conv 2, count 1, len 2 starting davinci_spi_bufs_prep davinci_spi_bufs_pio: data1_reg_val 268435456, cs_hold 1 << chhold_shift 28, davinci_spi_bufs_pio: t->tx_buf davinci_spi_bufs_pio: SPIINT 0x0, SPIFLG 0x1000200 ############################# davinci_spi_tx_buf_u16: tx 0x907 davinci_spi_bufs_pio, bits_per_word 8 davinci_spi_bufs_pio: data1_reg_val |= (mask & tx_data) 0x10fe0907 |= (0xFFFF & 0x907) davinci_spi_bufs_pio: buf_val 0x80fe0000 davinci_spi_bufs_pio: SPIFMT0 val 0x3010 davinci_spi_bufs_pio: SPIFMT1 val 0x3010 davinci_spi_bufs_pio: SPIFMT2 val 0x3010 davinci_spi_bufs_pio: SPIFMT3 val 0x3010 davinci_spi_bufs_pio: buf_val 0x80fe0000 & SPI_SPIBUF_TXFULL_MASK 0x20000000 = 0x0 davinci_spi_bufs_pio: SPIFLG 0x1000200, count 0 ####################### davinci_spi_bufs_pio: int_status 0x1000200 starting davinci_spi_check_error davinci_spi_check_error: ret 0 davinci_spi_bufs_pio: davinci_spi->count 2, t->len 2 davinci_spi_setup_transfer: bits_per_word 8, hz 2500000 davinci_spi_setup_transfer: bits_per_word 8 davinci_spi_chipselect: value 0 transfer: ret = 4 00 00 Видно, что в драйвер попадают все данные которые я ему отправляю. Обработка всех данных происходит за одну транзакцию, chip-select не меняет своего состояния. Под первый данные выделено 10 clock-в, что подтверждается значением SPIFMT, последнее значение A, под вторые данные выделено 16 clock-в, последнее значение 10 в SPIFMT. Таким образом суммарная посылка составляет 26 бит, 9 бит адрес + 1 бит команда + 16 бит данные. К сожалению на осцилограффе удаётся отловить только вторую посылку и данные там корректны. Но увы, запись значения в регистр не происходит. В чём ошибка? Спасибо.
  5. DM365 и RTL8201

    Решил проблему. Оказалось, что RTL8201 не очень хорошо воспринимает установку рестарта автоопределения (регистр 0, бит 9). Убрал его установку и палата сразу соединилась с NFS-сервером, правда, судя по индикации, на 10 Мб. Но с этим буду разбираться попозже.
  6. DM365 и RTL8201

    Нет, проблема не в NFS, специально перепроверил с другой платой у которой стоит Davicom DM9000.
  7. DM365 и RTL8201

    /home/kirill/nfs/rootfs 192.168.10.254(rw,no_root_squash,no_all_squash,subtree_check,sync)
  8. У меня используется такой Make для сборки самодельного драйвера MSP430: obj-m := msp430.o driverioctl-objs := msp430.o KDIR := /home/kirill/mv_pro_4.0.1/kernel #kernel directory PWD := $(shell pwd) #current directory default: $(MAKE) -C $(KDIR) M=$(PWD) modules
  9. DM365 и RTL8201

    Читал я этот файл. Повторю ещё раз - не работает в любом случае, добавлю я свой драйвер или нет. Некоторые странности в поведении наводят на мысль о ошибке в разводке, для чего выложил схему, или сбой железа. Странности заключаются в следующем: - при питании от 12В индикатор линка гаснет при попытке подсоединится по NFS, индикатор активно не горит, соединение по NFS не устанавливается - при питании по POE когда идёт подсоединение по NFS, индикатор линка гаснет, но через секунду зажигается снова, также зажигается индикатор активности и даже слегка подмигивает, соединение по NFS не устанавливается. Вставив отладку в драйвер производителя выяснил следующее - устанавливается скорость в 100 Мб/с, режим дуплекса UNKNOW, состояние чипа READY (функция emac_phy_init). После этого запускается функция phy_start, которая переводи чип в состояние PHY_UP. Разбираюсь дальше. P.S. Неужто никто не применяет RTL8201? Или у меня так загрязнены чакры? ;)
  10. DM365 и RTL8201

    Уважаемые, не сочтите за труд, посмотрите на правильность схемы. BP.pdf
  11. DM365 и RTL8201

    #define PHY_ID_MASK 0xfffffff0 #define LXT971_ID 0x001378e0 #define KSZ8893MQL_ID 0x00221430 #define RTL8201_ID 0x8201 static int emac_phy_init(struct emac_dev *dev, u8 phy_num, u8 *phy_cnt, u8 *phy_max) { char phy_id[BUS_ID_SIZE]; snprintf(phy_id, BUS_ID_SIZE, PHY_ID_FMT, 1, phy_num); dev->phydev[phy_num] = phy_connect(dev->owner, phy_id, &emac_update_phy_status, 0, PHY_INTERFACE_MODE_MII); if (IS_ERR(dev->phydev[phy_num])) { if (dev->phydev[phy_num] == ERR_PTR(-ENODEV)) dev->phydev[phy_num] = NULL; return PTR_ERR(dev->phydev[phy_num]); } dev->phydev[phy_num]->supported = PHY_BASIC_FEATURES; if (dev->init_cfg.gigabit) dev->phydev[phy_num]->supported |= SUPPORTED_1000baseT_Full; dev->phydev[phy_num]->advertising = dev->phydev[phy_num]->supported; if ((dev->phydev[phy_num]->phy_id & PHY_ID_MASK) == LXT971_ID) { /* * CRITICAL: Fix for increasing PHY signal drive strength for * TX lockup issue. On DaVinci EVM, the Intel LXT971 PHY * signal strength was low causing TX to fail randomly. The * fix is to Set bit 11 (Increased MII drive strength) of PHY * register 26 (Digital Config register) on this phy. */ int control; pr_info("applying Intel LTX971 workaround..\n"); control = phy_read(dev->phydev[phy_num], 26); phy_write(dev->phydev[phy_num], 26, (control | 0x800)); phy_read(dev->phydev[phy_num], 26); } else if ((dev->phydev[phy_num]->phy_id & PHY_ID_MASK) == KSZ8893MQL_ID) { /* * KSZ8893MQL is a layer 2 switch that connects to EMAC via * MII. The MII setting is required to be fixed with autoneg * off, 100Mbps, and full duplex. This happens to be the * settings and behavior when phy_mode is set to SNWAY_NOPHY. * Therefore, we set the phy_mode to SNWAY_NOPHY whenever * KSZ8893MQL is detected. */ dev->init_cfg.phy_mode = SNWAY_NOPHY; /* The third phy is used for MII, so only expect 2 phys */ *phy_max = 2; } else if ((dev->phydev[phy_num]->phy_id & 0xffff) == RTL8201_ID) { pr_info("found Realtek RTL8201 PHY\n"); //dev->init_cfg.phy_mode = SNWAY_NOPHY; } *phy_cnt = *phy_cnt + 1; phy_start(dev->phydev[phy_num]); return 0; } PHY обнаруживается, при загрузке я вижу строку "found Realtek RTL8201 PHY".
  12. DM365 и RTL8201

    Я разве утверждаю, что в драйвере делаю что-то сложное? ;) #include <linux/module.h> #include <linux/phy.h> char debug = 1; #define DBG(format, args...) if (debug) printk("RTL8201PHY: " format "\n", ##args) static int rtl8201_config_init(struct phy_device *phydev) { DBG("Starting %s.", __func__); phydev->irq = PHY_POLL; //phydev->interrupts = PHY_INTERRUPT_DISABLED; return 0; } static int rtl8201_ack_interrupt(struct phy_device *phydev) { DBG("Starting %s.", __func__); return 0; } static int rtl8201_config_interrupt(struct phy_device *phydev) { DBG("Starting %s.", __func__); return 0; } static struct phy_driver rtl8201_driver = { .phy_id = 0x8201, .phy_id_mask = 0xffff, .name = "Realtel RTL8201", .features = (SUPPORTED_10baseT_Half | \ SUPPORTED_10baseT_Full | \ SUPPORTED_100baseT_Half | \ SUPPORTED_100baseT_Full | \ SUPPORTED_Autoneg | \ SUPPORTED_MII), .flags = 0, .config_init = rtl8201_config_init, .config_aneg = genphy_config_aneg, .read_status = genphy_read_status, .ack_interrupt = rtl8201_ack_interrupt, .config_intr = rtl8201_config_interrupt, .driver = {.owner = THIS_MODULE}, }; static int __init realtek_init(void) { int ret; DBG("Starting %s.", __func__); ret = phy_driver_register(&rtl8201_driver); if (ret) { printk("Can't registered driver for Realtek RTL8201.\n"); phy_driver_unregister(&rtl8201_driver); } return ret; } static void __exit realtek_exit(void) { DBG("Starting %s.", __func__); phy_driver_unregister(&rtl8201_driver); } module_init(realtek_init); module_exit(realtek_exit); MAC я передаю в параметрах загрузки. Пробовал ядро с моим драйвером и без него, результат одинаковый - нет соединения по NFS. Может действительно проблема в железе? Но проверка тестом из CodeComposer прошла, правда там там тупо шлют некоторое количество байтов и пожалуй это доказывает только то, что процессор видит сетевой чип.
  13. DM365 и RTL8201

    В U-Boot без драйвера не работало ничего, сейчас хоть ping заработал. А насчёт нужности драйвера http://www.google.com/search?q=linux+rtl8201 Да и что-то не работает.
  14. DM365 и RTL8201

    Абсолютно. $ ps aux | grep nfs | grep -v grep root 1106 0.0 0.0 0 0 ? S Nov29 0:00 [nfsiod] root 1387 0.0 0.0 0 0 ? S Nov29 0:00 [nfsd4] root 1388 0.0 0.0 0 0 ? S Nov29 0:00 [nfsd] root 1389 0.0 0.0 0 0 ? S Nov29 0:00 [nfsd] root 1390 0.0 0.0 0 0 ? S Nov29 0:00 [nfsd] root 1391 0.0 0.0 0 0 ? S Nov29 0:00 [nfsd] root 1392 0.0 0.0 0 0 ? S Nov29 0:00 [nfsd] root 1393 0.0 0.0 0 0 ? S Nov29 0:00 [nfsd] root 1394 0.0 0.0 0 0 ? S Nov29 0:00 [nfsd] root 1395 0.0 0.0 0 0 ? S Nov29 0:00 [nfsd] $ ps aux | grep portmap | grep -v grep daemon 1076 0.0 0.0 1796 444 ? Ss Nov29 0:00 /sbin/portmap У меня создаётся впечатление, что в момент подключения к серверу сетевой чип выключают. Косвенно это подтверждает выключение светодиода на сетевом разъёме. Поддерживаемые в ядре 2.6.18 PHY: $ ls drivers/net/phy | grep c broadcom.c cicada.c davicom.c fixed.c icplus.c Kconfig lxt.c marvell.c mdio_bus.c phy.c phy_device.c phy_device.o qsemi.c realtek.c smsc.c vitesse.c Файл realtek.c - это моя попытка добавить поддержку RTL8201, на данный момент неудачная.
  15. DM365 и RTL8201

    Доброго дня! Имеется самодельная плата с процессором DM365 и сетевой Realtek RTL8201, в работе используется linux-2.6.18_pro500, из состава SDK, и u-boot 1.3.4. Слегка модифицировав u-boot я добился работающего ping-а, к сожалению tftp пока не работает. Но более приоретным является работоспособность сети в Linux, драйвер davinci_emac от TI видит чип, но смонтировать файловую систему по NFS не может, NFS-сервер в это время работает. Из странного в работе - постоянно горит индикатор линка, но при попытке монтирования файловой сети он тухнет. Привожу лог загрузки, касающейся сети: Linux version 2.6.18_pro500-davinci_evm-arm_v5t_le-gb43d9841-dirty (kirill@kirill) (gcc version 4.2.0 (MontaVista 4.2.0-16.0.32.0801914 2008-08-30)) #1 PREEMPT Mon Nov 29 12:55:40 MSK 2010 CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177 Machine: DaVinci DM365 EVM ............................................... Kernel command line: console=ttyS0,115200n8 noinitrd rw eth=00:01:02:03:04:05 ip=192.168.10.254:192.168.10.3:::arm:eth0:off root=/dev/nfs nfsroot=192.168.10.3:/home/kirill/nfs/rootfs,nolock TI DaVinci EMAC: kernel boot params Ethernet address: 00:01:02:03:04:05 .................................................... Generic PHY: Registered new driver ...................................................... RTL8201PHY: Starting realtek_init. Realtel RTL8201: Registered new driver Davinci EMAC MII Bus: probed i2c_davinci i2c_davinci.1: timeout waiting for bus ready i2c_davinci i2c_davinci.1: timeout waiting for bus ready i2c_davinci i2c_davinci.1: timeout waiting for bus ready i2c_davinci i2c_davinci.1: timeout waiting for bus ready MAC address is 02:00:10:00:00:00 TI DaVinci EMAC Linux version updated 4.0 ............................................... IPv4 over IPv4 tunneling driver TCP bic registered NET: Registered protocol family 1 NET: Registered protocol family 17 ........................................... RTL8201PHY: Starting rtl8201_config_init. found Realtek RTL8201 PHY IP-Config: Guessing netmask 255.255.255.0 IP-Config: Complete: device=eth0, addr=192.168.10.254, mask=255.255.255.0, gw=255.255.255.255, host=arm, domain=, nis-domain=(none), bootserver=192.168.10.3, rootserver=192.168.10.3, rootpath= Looking up port of RPC 100003/2 on 192.168.10.3 portmap: server 192.168.10.3 not responding, timed out Root-NFS: Unable to get nfsd port number from server, using default Looking up port of RPC 100005/1 on 192.168.10.3 portmap: server 192.168.10.3 not responding, timed out Root-NFS: Unable to get mountd port number from server, using default mount: server 192.168.10.3 not responding, timed out Root-NFS: Server returned error -5 while mounting /home/kirill/nfs/rootfs VFS: Unable to mount root fs via NFS, trying floppy. VFS: Cannot open root device "nfs" or unknown-block(2,0) Please append a correct "root=" boot option Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0) Строки начинающиеся на RTL8201PHY являются выводом из моей попытки дописать работу с RTL8201 к Generic PHY. Может кто-нибудь решил эту проблему? Спасибо.
×
×
  • Создать...