Ник:
Пароль:

Контакты

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

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Embedded Linux
MAC address
Pegase
Добавлено 13.08.2012 13:35
0
Сообщение: 1
Pegase
0

Пункты: 2484
Регистрация: 10.11.2010
Доброго времени суток.
Есть некое устройство на базе Nuc950 и Linux 2.6.35. Нужно сгенерировать для каждого устройства уникальный MAС адрес. Как это сделать? Первое что приходит на ум то передать из uboot в Linux как bootargs. Как считать данные из cmdline?
Спуститься к концу Подняться к началу
Персональная информация
dx
Добавлено 13.08.2012 13:46 Сообщение: 2
dx
3.5

Пункты: 7618
Регистрация: 26.10.2010
Пол: Мужчина
Из: Ukraine, Kiev city
"Как считать данные из cmdline?"
cat /proc/cmdline?
Спуститься к концу Подняться к началу
Персональная информация
alll2005
Добавлено 13.08.2012 16:05 Сообщение: 3
alll2005
0

Пункты: 2116
Регистрация: 23.08.2009
если устройство еще не собранно , то юзай это 24AA02E48 - более правильно
Спуститься к концу Подняться к началу
Персональная информация
Pegase
Добавлено 13.08.2012 19:05 Сообщение: 4
Pegase
0

Пункты: 2484
Регистрация: 10.11.2010
Цитата
"Как считать данные из cmdline?"
cat /proc/cmdline?

Спасибо за информацию, но таким методом можно достучаться до cmdline с userspace. В моем случае нужно достучаться из драйвера ethenet (т.е. из ядра).
Чтобы достучаться до cmdline нашел функцию __setup(str, fn)
Код

static int __init nuc900_set_cpufreq(char *str)
{
unsigned long cpufreq, val;

if (!*str)
return 0;
...
return 1;
}

__setup("cpufreq=", nuc900_set_cpufreq);

Спуститься к концу Подняться к началу
Персональная информация
Pegase
Добавлено 13.08.2012 19:39 Сообщение: 5
Pegase
0

Пункты: 2484
Регистрация: 10.11.2010
Цитата
если устройство еще не собранно , то юзай это 24AA02E48 - более правильно

Может такой метод и более правильний. Но и более проблемный, требует поднять шину I2C, подправить драйвер, запаять дополнительную микросхему, запрограммировать. И это все ради нескольких байт. В это время когда в nandflash места валом. Единственное плюс при полном обновлении ПО, но я не планирую обновлять загрущик, а ядро ​​с файловой в случае необходимости можно обновить с uboot
Спуститься к концу Подняться к началу
Персональная информация
alll2005
Добавлено 14.08.2012 00:20 Редактировалось 14.08.2012 09:45 Сообщение: 6
alll2005
0

Пункты: 2116
Регистрация: 23.08.2009
Цитата
Цитата
если устройство еще не собранно , то юзай это 24AA02E48 - более правильно

Может такой метод и более правильний. Но и более проблемный, требует поднять шину I2C, подправить драйвер, запаять дополнительную микросхему, запрограммировать. И это все ради нескольких байт. В это время когда в nandflash места валом. Единственное плюс при полном обновлении ПО, но я не планирую обновлять загрущик, а ядро ​​с файловой в случае необходимости можно обновить с uboot


поднимать i2c не надо - оно и так уже поднято , программировать микросхему тоже не надо - читай внимательно документацию - мас адресс там вшит а 2 кб свободно , а вообше если с тебе лень запаять 5 ног
сделай mac адрес с привязкой к ID микроконтроллера (он должен быть уникальным)
Спуститься к концу Подняться к началу
Персональная информация
vibic
Добавлено 30.08.2012 02:37 Редактировалось 30.08.2012 22:59 Сообщение: 7
vibic
5

Пункты: 940
Регистрация: 23.01.2012
Пол: Мужчина
Цитата
Доброго времени суток.
Есть некое устройство на базе Nuc950 и Linux 2.6.35. Нужно сгенерировать для каждого устройства уникальный MAС адрес. Как это сделать? Первое что приходит на ум то передать из uboot в Linux как bootargs. Как считать данные из cmdline?


Если есть SD card бессменная, то можно к ней привязаться, например:
CID_SDCARD="$(find /sys/devices -iname cid -exec cat {} \;|head -n 1)" - поиcком поймете почему :D
В CID_SDCARD будет ее CID, а из него я например брал:
for INDEX1 in $(seq 26 2 30|sort -r)
do
INDEX2="$((INDEX1-12))"
PATTERN1="${CID_SDCARD:INDEX1:2}"
PATTERN2="${CID_SDCARD:INDEX2:2}"
NEW_MAC0="$NEW_MAC0:$PATTERN1"
NEW_MAC1="$NEW_MAC1:$PATTERN2"
done

NEW_MAC0 и NEW_MAC1 - константы от производителя например, то есть 3 байта первых.

А настройку делать надо в initrd до монтирования основной системы, по моему через ifconfig busyboxа делал. Не помню, могу найти как, если надо, но это можно и в гугл всегда подсмотреть.
Спуститься к концу Подняться к началу
Персональная информация
Pegase
Добавлено 23.10.2012 14:17 Сообщение: 8
Pegase
0

Пункты: 2484
Регистрация: 10.11.2010
Доброго времени суток.
Со временем к плате NUC950 по i2c довелось присоединить еще один вспомогательный контроллер (stm32f1). Соответственно было бы логично получать MAC с stm32f1 (96 bit unique ID). На stm32f1 я эмулирую работу EEPROM (at24c8) т.е. с 8-битная адресация и 8-битной страницей. В борд добавил следующее:
Код

void at24_setup(struct memory_accessor *iface,void * context)
{
char mac_addr[6];
at24_if= iface;
printk("at24c8");
if (at24_if-> read(at24_if, mac_addr, 0x00, 6 == 6)) {
printk("Read MAC addr from EEPROM: %x:%x:%x:%x:%x:%x \n",
mac_addr[5], mac_addr[4], mac_addr[3], mac_addr[2], mac_addr[1], mac_addr[0]);
}
else printk("Bad read");
}

static struct at24_platform_data eeprom_info = {
.byte_len = 128,
.page_size = 8,
.flags = AT24_FLAG_TAKE8ADDR,
.setup = at24_setup,
};
/* I2C clients */
static struct i2c_board_info __initdata nuc900_i2c_clients[] = {
{
I2C_BOARD_INFO("24c8", 0x18),
.platform_data= &eeprom_info,
},
};

static void __init nuc950evb_init(void)
{
writel(readl(REG_CLKEN) | (1<<13) |(1<<12), REG_CLKEN);
nuc950_board_init();
printk("I2C register stm32f1");
i2c_register_board_info(0, nuc900_i2c_clients, sizeof(nuc900_i2c_clients)/sizeof(struct i2c_board_info));
}


При этом в логе загрузки видно следующее:
Код

Linux version 2.6.35.4 (root@vitaly-F5N) (gcc version 4.2.0 20070413 (prerelease) (CodeSourcery Sourcery G++ Lite 2007q1-10)) #66 PREEMPT Fri Oct 5 11:23:25 EEST 2012
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: W90P950EVB
Warning: bad configuration page, trying to continue
Memory policy: ECC disabled, Data cache writeback
CPU type 0x02900910 is NUC910
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 8128
Kernel command line: mem=32M console=ttyS0,115200n8 cpufreq=200 root=/dev/mtdblock1 rootfstype=jffs2 rw nuc950mac=00:00:FF:11:11:00
PID hash table entries: 128 (order: -3, 512 bytes)
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 32MB = 32MB total
Memory: 28844k/28844k available, 3924k reserved, 0K highmem
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc2800000 - 0xe0000000 ( 472 MB)
lowmem : 0xc0000000 - 0xc2000000 ( 32 MB)
modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.init : 0xc0008000 - 0xc001d000 ( 84 kB)
.text : 0xc001d000 - 0xc0341000 (3216 kB)
.data : 0xc0342000 - 0xc0360340 ( 121 kB)
Hierarchical RCU implementation.
RCU-based detection of stalled CPUs is disabled.
Verbose stalled-CPUs detection is disabled.
NR_IRQS:32
Console: colour dummy device 80x30
Calibrating delay loop... 99.53 BogoMIPS (lpj=497664)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
devtmpfs: initialized
NET: Registered protocol family 16
I2C register stm32f1: 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
cfg80211: Calling CRDA to update world regulatory domain
Switching to clocksource nuc900-timer1
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
TCP reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
JFFS2 version 2.2. (NAND) В© 2001-2006 Red Hat, Inc.
ROMFS MTD (C) 2007 Red Hat, Inc.
msgmni has been set to 56
alg: No test for stdrng (krng)
io scheduler noop registered (default)
Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO 0xb8000000 (irq = 7) is a 16550
console [ttyS0] enabled
serial8250.0: ttyS1 at MMIO 0xb8000100 (irq = 8) is a 16550
serial8250.0: ttyS2 at MMIO 0xb8000200 (irq = 9) is a 16550
brd: module loaded
physmap platform flash device: 00400000 at a0000000
physmap-flash physmap-flash.0: map_probe failed
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 225 at 0x000001c20000
Bad eraseblock 479 at 0x000003be0000
Bad eraseblock 576 at 0x000004800000
Bad eraseblock 577 at 0x000004820000
Bad eraseblock 638 at 0x000004fc0000
Bad eraseblock 1235 at 0x000009a60000
Bad eraseblock 1856 at 0x00000e800000
Creating 2 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000800000 : "NAND-boot and kernel"
0x000000800000-0x000010000000 : "NAND FS"
nuc900-emc nuc900-emc: MAC address read from command line
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
nuc900-ehci nuc900-ehci: Nuvoton nuc900 EHCI Host Controller
nuc900-ehci nuc900-ehci: new USB bus registered, assigned bus number 1
nuc900-ehci nuc900-ehci: irq 15, io mem 0xb0005000
nuc900-ehci nuc900-ehci: USB 2.0 started, EHCI 0.95
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: Nuvoton nuc900 EHCI Host Controller
usb usb1: Manufacturer: Linux 2.6.35.4 ehci_hcd
usb usb1: SerialNumber: nuc900-ehci
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
nuc900-ohci nuc900-ohci: Nuvoton nuc900 ohci Host Controller
nuc900-ohci nuc900-ohci: new USB bus registered, assigned bus number 2
nuc900-ohci nuc900-ohci: irq 15, io mem 0xb0007000
usb usb2: New USB device found, idVendor=1d6b, idProduct=0001
usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb2: Product: Nuvoton nuc900 ohci Host Controller
usb usb2: Manufacturer: Linux 2.6.35.4 ohci_hcd
usb usb2: SerialNumber: nuc900-ohci
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 2 ports detected
usbcore: registered new interface driver cdc_wdm
ep 0
ep 1
ep 2
ep 3
ep 4
ep 5
ep 6
mice: PS/2 mouse device common for all mice
i2c /dev entries driver
nuc900-i2c-p0 nuc900-i2c-p0: bus frequency set to 100 KHz
nuc900-i2c-p0 nuc900-i2c-p0: Add nuc900 I2C port0 adapter
nuc900-i2c-p1 nuc900-i2c-p1: bus frequency set to 100 KHz
nuc900-i2c-p1 nuc900-i2c-p1: Add nuc900 I2C port1 adapter
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
TCP cubic registered
NET: Registered protocol family 17
lib80211: common routines for IEEE802.11 drivers

Функция at24_setup почему-то не вызывается. С чем это может быть связано? Кто имеет примеры чтения MAC с еепром сбросьте пожалуйста.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux