Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Embedded Linux
LAN9303i + at91sam9g20
Maxizar
Добавлено 21.07.2011 15:00
0
Сообщение: 1
Maxizar
0

Пункты: 424
Регистрация: 04.07.2011
Всем привет.
на плате стоит АРМ9 а именно at91sam9g20, при этом на плате имеется свитч LAN9303i двухпортовый. Задача загрузить на плату линукс, при этом линукс будет цеплять файловую систему по сети (nfs). Так вот на отладочной плате at91sam9g20-ek я это дело смог запустить и все такое... а на рабочей плате нет, u-boot не грузит по tftp и собственно вопрос каким образом научить u-boot работать с LAN9303i я так понимаю нужно что-то в виде драйвера чтоли написать или что?
Потому что я так понимаю затык именно в LAN9303i, потому что если приконектить плату, то она вешает всю сетку.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 21.07.2011 18:18 Сообщение: 2
sasamy
4.70

Пункты: 78115
Регистрация: 14.08.2009
Нужно проинициализировать правильно, например есть в uboot готовое

board/bct-brettl2/smsc9303.c

взять за пример.
Спуститься к концу Подняться к началу
Персональная информация
rw9uao
Добавлено 22.07.2011 08:14 Сообщение: 3
rw9uao
Ранг
5

Группа: Клиенты
Пункты: 6973
Регистрация: 26.03.2009
а кто мешает взять целиком атмеловский убут? если железо совпадает.
Спуститься к концу Подняться к началу
Персональная информация
Maxizar
Добавлено 25.07.2011 14:27 Сообщение: 4
Maxizar
0

Пункты: 424
Регистрация: 04.07.2011
Цитата
а кто мешает взять целиком атмеловский убут? если железо совпадает.

Всмысле совподает? Вы не так меня поняли...
У меня есть плата (устройство) на котором установлен проц at91sam9g20, но к нему присобачен свитч smsc LAN9303i. Так вот я не могу запустить элементарно команду tftpboot потому что сети нет. Я подумал, что нужно инициализировать этот самый свитч, если следовать совету sasamy, то вот что я сделал:
1. Скачал новый U-Boot2011.06, потому что в старом небыло даже папки bct-brettl2.
2. Попробывал скомпилить залил на плату тю-тю, каким то макаром допетрил, что нужно сменить аддрес, а именно вот это:
В файле u-boot_2011.06/include/configs/at91sam9260ek.h
Код
#define CONFIG_SYS_TEXT_BASE 0x23f00000//0x21f00000 сделал как для U-boot 2010.06 иначе не грузит

Компилим при помощи вот этого скрипта:
Код
#!/bin/sh

export PATH=/home/xxx/buildroot-2011.05/output/host/usr/bin:${PATH}

rm u-boot.bin
rm u-boot


make ARCH=arm distclean
make at91sam9g20ek_nandflash_config
make -j4 ARCH=arm CROSS_COMPILE=arm-unknown-linux-uclibcgnueabi-

echo == Compiled ==

Компилим грузим, убут работает.
Переходим к драйверу если так можно его так назвать.
Смотрим на board/bct-brettl2/smsc9303.c нууу. копируем h и c файл в папку board/atmel/at91sam9260ek
Подключаем заголовочный файл в at91sam9260ek.c:
Код

#include "smsc9303.h"

Потом, я попытался понять содержание и смысл функций из smsc9303.с.
1. Подключаем файл пинов для нашей платы и закоментируем файл (который как я понял нужен только для другой платы)
Код

//#include <asm/blackfin.h>
#include <asm/arch-at91/gpio.h>

Пины нужны как я смог понять вот тут:
Было так (старый код из board/bct-brettl2/smsc9303.c):
Код

gpio_request(GPIO_PG10, "smsc9303");
gpio_direction_output(GPIO_PG10, 0);
udelay(10000);
gpio_direction_output(GPIO_PG10, 1);
udelay(10000);

gpio_free(GPIO_PG10);


Почитал даташит, поменял вот так:
Код

gpio_request(AT91_PIN_PA27, "smsc9303");
gpio_direction_output(AT91_PIN_PA27, 0);
udelay(10000);
gpio_direction_output(AT91_PIN_PA27, 1);
udelay(10000);

gpio_free(AT91_PIN_PA27);

Правильно?

2. Также в файле есть целые таблицы, который хронят дефолтные настройки, но есть одно НО
скажем
Код

{0x01, 0x1e, 0x0000}, /* Port0 PHY Interrupt Source Flags Register */

В датошите написано, что
13.3.2.11
Port x PHY Interrupt Source Flags Register (PHY_INTERRUPT_SOURCE_x)
Index (decimal): 29 Size: 16 bits
29d = 1Dh, тогда почему 1e ??. Тогда как скажем для
{0x01, 0x11, 0x0000}, /* Port0 PHY Mode Control/Status Register */
все сходится с датошитом.

3. Потом при компиляции мы получаем такое:
Код

board/atmel/at91sam9260ek/libat91sam9260ek.o: In function `init_smsc9303i_mii':
/home/xxx/u-boot_2011.06/board/atmel/at91sam9260ek/smsc9303.c:135: undefined reference to `gpio_request'
/home/xxx/u-boot_2011.06/board/atmel/at91sam9260ek/smsc9303.c:136: undefined reference to `gpio_direction_output'
/home/xxx/u-boot_2011.06/board/atmel/at91sam9260ek/smsc9303.c:138: undefined reference to `gpio_direction_output'
/home/xxx/u-boot_2011.06/board/atmel/at91sam9260ek/smsc9303.c:141: undefined reference to `gpio_free'


Тоесть я понимаю для at91sam9260ek таких функций нет? тогда как мне переписать этот кусок кода...

4. Если же мы закоментим этот код, то все компилится, при заливке на плату, мы доходим только до
Код

printf(" write SMSC LAN9303i configuration\n");

if (!smc9303i_read_reg(0x50, &data))
return 0;

и происходит выход, тоесть мы не прочитали регистр и все приплыли :(
U-boot дальше работает, но сети нет, ну по идее правильно мы же непроинициализировали свитч

Как быть?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 25.07.2011 16:35 Редактировалось 25.07.2011 16:37 Сообщение: 5
sasamy
4.70

Пункты: 78115
Регистрация: 14.08.2009
Цитата

Тоесть я понимаю для at91sam9260ek таких функций нет? тогда как мне переписать этот кусок кода...


Там есть аналоги - просто замените на аналоги для at91 отсюда
drivers/gpio/at91_gpio.c


gpio_request можно убрать - главное удостовериться что пины не конфликтуют.
Спуститься к концу Подняться к началу
Персональная информация
Maxizar
Добавлено 26.07.2011 17:28 Сообщение: 6
Maxizar
0

Пункты: 424
Регистрация: 04.07.2011
Чет я запутался.
Не подскажите, каким образом можно прочитать и записать регистры в smsc Lan9303i в U-boot.
Вот скажем регистр:
Код
13.2.6.2
Virtual PHY Basic Status Register (VPHY_BASIC_STATUS)
Offset: 1C4h Index (decimal): 1 Size: 32 bits

Я читаю так:
Код

unsigned short tmp1;
miiphy_read("macb0",0x00,0x1C4,&tmp1);
printf("Identification Lan = %d \n", tmp1);

Но выдает одни нули :(
Потом регистр 32 битный а читаем мы только 16 бит, как быть?
Или я вообще не так читаю все это дело?
И еще все функции работы с mii требуют devname и addr, имя я так понимаю macb0, а адрес? это адрес чего PHY порта типа 0,1,2 ?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 26.07.2011 20:44 Сообщение: 7
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
а переменные окружения в юбуте для сети прописаны?
что выдает printenv?
посмотрите в конфиге платы (которая поддерживает ваш чип) все что касается сети и инита чипа..
в целом, цепочка непростая:
сначала надо проинтить пины для поддержки сетки
потом разрешить работу модуля сети в АРМе
потом разрешить тактирование
потом прописать в конфиге своей платы правильные настройки для сети и переменные окружения для Uboot
все это обильно сдобрить диагностическими printf и поэтапно проверять выполнение..
MAC-адрес не забыть и тыпы..
зы я сам сетку не поднимал в юбуте, так что только теоретизирую..

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

Пункты: 424
Регистрация: 04.07.2011
Цитата
а переменные окружения в юбуте для сети прописаны?
что выдает printenv?

да там все путем, я же на такой плате (отладочной) проверял. я эти параметры еще в файле at91sam9g20ek задаю вот так:
Код

#else /* CONFIG_SYS_USE_NANDFLASH */

/* bootstrap + u-boot + env + linux in nandflash */
#define CONFIG_ENV_IS_IN_NAND 1
#define CONFIG_ENV_OFFSET 0x60000
#define CONFIG_ENV_OFFSET_REDUND 0x80000
#define CONFIG_ENV_SIZE 0x20000 /* 1 sector = 128 kB */
#define CONFIG_BOOTCOMMAND "nand read 0x22000000 0xA0000 0x200000; bootm"
/*
#define CONFIG_BOOTARGS "console=ttyS0,115200 " \
"root=/dev/mtdblock5 " \
"mtdparts=atmel_nand:128k(bootstrap)ro," \
"256k(uboot)ro,128k(env1)ro," \
"128k(env2)ro,2M(linux),-(root) " \
"rw rootfstype=jffs2"
//*/
#define CONFIG_BOOTARGS "noinitrd " \
"ip=192.168.150.170:192.168.150.90:::video:eth0:off" \
"root=/dev/nfs rw nfsroot=192.168.150.90:/home/xxx/Temp/Lin/,nolock mem=64M"
#define CONFIG_EXTRA_ENV_SETTINGS \
"Run=tftpboot 20000000 uImage; bootm 20000000\0" \
"ipaddr=192.168.150.170\0" \
"netmask=255.255.255.0\0" \
"ethaddr=04:25:fe:ed:00:18\0" \
"serverip=192.168.150.90\0"
#endif

На отладочной плате at91sam9g20-ek, U-boot грузится и сразу определяет Ethernet из-за чего можно грузить ядро и ФС по сети.
Тогда как если взять процессор at91sam9g20 и добавить свитч Lan9303 (ну плюс кварц и все такое тобишь конечное устройство) то когда заливаем U-boot то сеть он определил как macb0, но ничего не грузится, пишет что
Код

Starting autonegotiation
Autonegotiation timed out

Типа превышен лимит и все :(.
Что касается самого лан9303, я изночально думал, что его нужно мол инициализировать, но почитав датошит на него и посмотрев на плату получается, мы при резете его конфигурируем на нужный нам режим посредствам подтягивующих резисторов. (может этого не достаточно?) и нужно инициализировать дополнительно записав в его регистры. Но если так, то каким макаром мне в его регистры записать? скажем есть функция macb_mdio_read
Код

status = macb_mdio_read(&macb, 0x50);
printf("Lan = %d \n", status);

по адресу 50 лежит ID свитча тобишь статус должен быть равен 9303, но если использовать эту функцию то мы просто зависаме на ней и все.

Если посмотреть на функцию то получается что висим вот в этом куске кода:
Код

do {
netstat = macb_readl(macb, NSR);
} while (!(netstat & MACB_BIT(IDLE))); //висимт тут :(

Получается, мы в U-boot не подняли интерфейс MII почему MDIO не работает. скажем просто читать регистры из U-boot-a я научился скажем читаем регистр
ну например:
Код

temp = readl((ATMEL_BASE_EMAC0+0x30)); //Interrupt Mask Register EMAC_IMR Read-only 0x0000_3FFF

printf("EMAC_IMR = %d \n", temp);

Может я не правильно использую функцию macb_mdio_read или что?.
Просто получается если мы не можем прочитать ID свитча, то получается мы не можем до него достучатся...
В конфиг файле (/u-boot_2011.06/include/configs/at91sam9260ek.h)
Пробывал закоментировать вот это:
Код
//#define CONFIG_RMII 1

И так и эдок ничего не изменяется (касательно сети) ее как бы нет и все :(
уже какой день сижу и не могу понять как подружить Lan9303 и at91sam9g20 посредстовм U-boot.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux