Github Page

레이블이 IF-MII인 게시물을 표시합니다. 모든 게시물 표시
레이블이 IF-MII인 게시물을 표시합니다. 모든 게시물 표시

5/31/2020

MII Interface 기반의 ETH 과 udevd 사용 및 테스트

 1. MII interface 기반의 ETH 사용 

요즘 대체적으로 systemd-udevd 기반으로 동작

systemd-udevd   


1.1 udevadm 사용법 


systemd-udevd를 사용을 하면 기본의 udev와 다르게 udevadm으로 쉽게 제어가 가능하므로 우선 본인의 systemd-udevd 사용여부를 파악 
ps로 systemd-udevd가 동작 중인 확인 

  • udevadm 사용법 
$ udevadm -h
udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS]

Send control commands or test the device manager.

Commands:
  info          Query sysfs or the udev database
  trigger       Request events from the kernel
  settle        Wait for pending udev events
  control       Control the udev daemon
  monitor       Listen to kernel and udev events
  test          Test an event run
  test-builtin  Test a built-in command 

  • udevadm 기본사용법 및 옵션 
  1.  udevadm [--debug] [--version] [--help] 
  2.  udevadm info [options] [devpath] 
  3.  udevadm trigger [options] [devpath] 
  4.  udevadm settle [options] 
  5.  udevadm control option 
  6.  udevadm monitor [options] 
  7.  udevadm test [options] devpath 
  8.  udevadm test-builtin [options] command devpath   

1.2  ETH의 분석 (MII Interface기반)


network driver는 예전처럼 /dev가 존재하지 않는 것으로 보이며, 어쩔 수 없이 /sys 파일시스템에서 확인을 해야하 하는 것으로 보인다. 

- MII Interface기반이므로 PHY 와 같이 확인 

$ SYSTEMD_LOG_LEVEL=debug udevadm info /sys/class/net/eth0 
or 
$ udevadm info /sys/class/net/eth0   // ETH0 의 세부 정보  
P: /devices/soc0/soc/2100000.aips-bus/2188000.ethernet/net/eth0     // sys filesystem path 
E: DEVPATH=/devices/soc0/soc/2100000.aips-bus/2188000.ethernet/net/eth0
E: ID_NET_DRIVER=fec
E: ID_NET_NAME_MAC=enx26e12cc4c7c6
E: ID_PATH=platform-2188000.ethernet
E: ID_PATH_TAG=platform-2188000_ethernet
E: IFINDEX=2
E: INTERFACE=eth0
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/eth0
E: TAGS=:systemd:
E: USEC_INITIALIZED=6203956



$ udevadm info /sys/class/net/eth0/phydev  // MII Interface PHY 정보 
P: /devices/soc0/soc/2100000.aips-bus/2188000.ethernet/mdio_bus/2188000.ethernet-1/2188000.ethernet-1:01
E: DEVPATH=/devices/soc0/soc/2100000.aips-bus/2188000.ethernet/mdio_bus/2188000.ethernet-1/2188000.ethernet-1:01
E: DEVTYPE=PHY
E: DRIVER=Generic PHY
E: MODALIAS=of:Nethernet-phyT
E: OF_COMPATIBLE_N=0
E: OF_FULLNAME=/soc/aips-bus@2100000/ethernet@2188000/mdio/ethernet-phy@1
E: OF_NAME=ethernet-phy
E: SUBSYSTEM=mdio_bus

이전의 MMC와 동일하게 분석하며 항상 uevent를 찾아 분석하자 
  • N: is for device Name in /dev (e.g /dev/ttyAMA0)
  • S: is for Symlinks to that device name in /dev  (추후 udev/rules/에서 SYMLINK)
  • P: is for device Path in /sys
  • E: is for device properties in udev

1.3 ETH0 의 속성분석 


MII Interface 의 경우, Phy와 Host 사이에 Interrupt를 사용하지 않고 Polling으로 사용하며, udev Hotplug가 미지원으로 파악 
Link 부분을 세부변화 관찰(주의, MII Phy의 Interrupt부분 재확인)  
- WOL_INT(Wake-On-Lan) Interrupt (미사용)
- INT Interrupt(Open Drain) (미사용)

  https://ahyuo79.blogspot.com/2015/02/blog-post_4.html

  • RJ45 연결시 속성값
$ udevadm info -a /sys/class/net/eth0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/soc0/soc/2100000.aips-bus/2188000.ethernet/net/eth0':       // sys file system 기준이며, 상위 P: Node와 동일 
    KERNEL=="eth0"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{addr_assign_type}=="0"
    ATTR{addr_len}=="6"
    ATTR{address}=="26:e1:2c:c4:c7:c6"
    ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"
    ATTR{carrier}=="0"      // 현재 Not Connect 
    ATTR{carrier_changes}=="2"
    ATTR{carrier_down_count}=="1"
    ATTR{carrier_up_count}=="1"
    ATTR{dev_id}=="0x0"
    ATTR{dev_port}=="0"
    ATTR{dormant}=="0"
    ATTR{duplex}=="full"
    ATTR{flags}=="0x1003"
    ATTR{gro_flush_timeout}=="0"
    ATTR{ifalias}==""
    ATTR{ifindex}=="2"
    ATTR{iflink}=="2"
    ATTR{link_mode}=="0"
    ATTR{mtu}=="1500"
    ATTR{netdev_group}=="0"
    ATTR{operstate}=="down"   // 현재 Not Connect 
    ATTR{proto_down}=="0"
    ATTR{speed}=="100"
    ATTR{tx_queue_len}=="1000"
    ATTR{type}=="1"

  looking at parent device '/devices/soc0/soc/2100000.aips-bus/2188000.ethernet':
    KERNELS=="2188000.ethernet"
    SUBSYSTEMS=="platform"
    DRIVERS=="fec"
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/soc0/soc/2100000.aips-bus':
    KERNELS=="2100000.aips-bus"
    SUBSYSTEMS=="platform"
    DRIVERS==""
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/soc0/soc':
    KERNELS=="soc"
    SUBSYSTEMS=="platform"
    DRIVERS==""
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/soc0':
    KERNELS=="soc0"
    SUBSYSTEMS=="soc"
    DRIVERS==""
    ATTRS{family}=="Freescale i.MX"
    ATTRS{revision}=="1.4"
    ATTRS{soc_id}=="i.MX6SX"    

  • RJ45 비연결할 경우 
$ udevadm info -a /sys/class/net/eth0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/soc0/soc/2100000.aips-bus/2188000.ethernet/net/eth0':
    KERNEL=="eth0"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{addr_assign_type}=="0"
    ATTR{addr_len}=="6"
    ATTR{address}=="26:e1:2c:c4:c7:c6"
    ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"
    ATTR{carrier}=="1"               // 현재 Connect(up) 상태 
    ATTR{carrier_changes}=="3"      // 현재 Connect(up/down) 상태 변환 Count
    ATTR{carrier_down_count}=="1"  // down count
    ATTR{carrier_up_count}=="2"    // up count 
    ATTR{dev_id}=="0x0"
    ATTR{dev_port}=="0"
    ATTR{dormant}=="0"
    ATTR{duplex}=="full"
    ATTR{flags}=="0x1003"
    ATTR{gro_flush_timeout}=="0"
    ATTR{ifalias}==""
    ATTR{ifindex}=="2"
    ATTR{iflink}=="2"
    ATTR{link_mode}=="0"
    ATTR{mtu}=="1500"
    ATTR{netdev_group}=="0"
    ATTR{operstate}=="up"  // 현재 Connect 상태 
    ATTR{proto_down}=="0"
    ATTR{speed}=="100"
    ATTR{tx_queue_len}=="1000"
    ATTR{type}=="1"

  looking at parent device '/devices/soc0/soc/2100000.aips-bus/2188000.ethernet':
    KERNELS=="2188000.ethernet"
    SUBSYSTEMS=="platform"
    DRIVERS=="fec"
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/soc0/soc/2100000.aips-bus':
    KERNELS=="2100000.aips-bus"
    SUBSYSTEMS=="platform"
    DRIVERS==""
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/soc0/soc':
    KERNELS=="soc"
    SUBSYSTEMS=="platform"
    DRIVERS==""
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/soc0':
    KERNELS=="soc0"
    SUBSYSTEMS=="soc"
    DRIVERS==""
    ATTRS{family}=="Freescale i.MX"
    ATTRS{revision}=="1.4"
    ATTRS{soc_id}=="i.MX6SX"

  • sys filesystem에서 Ethernet Link 확인 
fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
$ cat /sys/class/net/eth0/carrier        // sys filesystem의 상태 확인 
1

fec 2188000.ethernet eth0: Link is Down
$ cat /sys/class/net/eth0/carrier        // sys filesystem 의 상태확인 
0    

$ networkctl list  // networkctl에서도 감지 
2 eth0         ether    routable    configured

$ networkctl list  // networkctl에서도 감지 
2 eth0         ether    no-carrier    configured

$ networkctl status eth0


/etc/systemd/network/eth0.network에서 DefaultRouteOnDevice=yes 설정하여 상위에서 routable 가능 


1.4 udevadm 으로 uevent 감시 


세부적으로 SUBSYSTEM 값이 "net"이므로, 이를 기반으로 세부적으로 감시했으나, ETH0의 변화가 없음 

$ udevadm -d monitor -p -k -u --subsystem-match=net   // eth0 Hotplug 포인트를 못찾음
calling: monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

fec 2188000.ethernet eth0: Link is Down
fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx



KERNEL[44684.453030] remove   /devices/virtual/net/ppp0 (net)     // 오직 ppp만 찾음 
ACTION=remove
DEVPATH=/devices/virtual/net/ppp0
DEVTYPE=ppp
IFINDEX=9
INTERFACE=ppp0
SEQNUM=2191
SUBSYSTEM=net

UDEV  [44684.474359] remove   /devices/virtual/net/ppp0 (net)
ACTION=remove
DEVPATH=/devices/virtual/net/ppp0
DEVTYPE=ppp
IFINDEX=9
INTERFACE=ppp0
SEQNUM=2191
SUBSYSTEM=net
SYSTEMD_ALIAS=/sys/subsystem/net/devices/ppp0
TAGS=:systemd:
USEC_INITIALIZED=26876345

KERNEL[44690.852770] add      /devices/virtual/net/ppp0 (net)
ACTION=add
DEVPATH=/devices/virtual/net/ppp0
DEVTYPE=ppp
IFINDEX=10
INTERFACE=ppp0
SEQNUM=2192
SUBSYSTEM=net

UDEV  [44690.883719] add      /devices/virtual/net/ppp0 (net)
ACTION=add
DEVPATH=/devices/virtual/net/ppp0
DEVTYPE=ppp
IFINDEX=10
INTERFACE=ppp0
SEQNUM=2192
SUBSYSTEM=net
SYSTEMD_ALIAS=/sys/subsystem/net/devices/ppp0
TAGS=:systemd:
USEC_INITIALIZED=44690865786

$ udevadm monitor /sys/class/net/eth0
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
fec 2188000.ethernet eth0: Link is Down
fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx

2. udev Rule 설정 


아래와 같이 넣어 동작확인을 했지만, 동작되지 않으며 세부감시를 위해서 udev monitor에서 감시했지만, 감시가 안됨 (udev로 control 이 안됨)

$ vi /etc/udev/rules.d/30-eth.rules  // 동작테스트 (실패)
KERNEL=="eth0", SUBSYSTEM=="net", ATTR{carrier}=="0", RUN+="echo hello world" 

$ vi /etc/udev/rules.d/30-eth.rules  // 동작테스트 (실패)
ACTION=="add" KERNEL=="eth0", SUBSYSTEM=="net", ATTR{carrier}=="1", RUN+="echo 11111111" 
ACTION=="remove" KERNEL=="eth0", SUBSYSTEM=="net", ATTR{carrier}=="0", RUN+="echo 22222222" 

// 상위 두개 다 동작이 안됨  udev로 보고가 안됨 MII Phy의 연결된 Interrupt가 udev와 같이 동작되지 않는 것으로 추측
// ATTR{operstate} 로 해도 동일 


/sys/class/net/eth0/operstate  Application C언어 예제 
(Kernel의 rtnetlink.h 사용)
  https://stackoverflow.com/questions/26672414/inotify-add-watch-fails-on-sys-class-net-eth0-operstate#26674239

GPIO의 경우 /sys/class/gpio 로 fopen or open으로 직접 control 하자 
  https://infoarts.tistory.com/21


udev write rules 관련사항
  http://www.reactivated.net/writing_udev_rules.html

udev network rules 관련사항
  https://alwaystinkering.wordpress.com/2016/05/15/udev-network-interface-renaming-with-no-reboot/

3. udev TEST 


$ udevadm control --reload-rules  // 상위에서 만든 Rules 적용했지만 Trigger에서 미동작함 
$ udevadm test /sys/class/net/eth0  //TEST를 진행을 해보면 쉽게 우선순위를 확인가능
calling: test
version 239
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

Load module index
Skipping empty file: /etc/systemd/network/99-default.link
Created link configuration context.
Reading rules file: /etc/udev/rules.d/10-imx.rules
Reading rules file: /etc/udev/rules.d/30-mmc.rules
Reading rules file: /etc/udev/rules.d/40-eth.rules
Reading rules file: /lib/udev/rules.d/50-firmware.rules
Reading rules file: /etc/udev/rules.d/50-ttyACM.rules
Reading rules file: /lib/udev/rules.d/50-udev-default.rules
Reading rules file: /lib/udev/rules.d/60-block.rules
Reading rules file: /lib/udev/rules.d/60-cdrom_id.rules
Reading rules file: /lib/udev/rules.d/60-drm.rules
Reading rules file: /lib/udev/rules.d/60-evdev.rules
Reading rules file: /lib/udev/rules.d/60-input-id.rules
Reading rules file: /lib/udev/rules.d/60-persistent-alsa.rules
Reading rules file: /lib/udev/rules.d/60-persistent-input.rules
Reading rules file: /lib/udev/rules.d/60-persistent-storage-tape.rules
Reading rules file: /lib/udev/rules.d/60-persistent-storage.rules
Reading rules file: /lib/udev/rules.d/60-persistent-v4l.rules
Reading rules file: /lib/udev/rules.d/60-sensor.rules
Reading rules file: /lib/udev/rules.d/60-serial.rules
Reading rules file: /lib/udev/rules.d/64-btrfs.rules
Reading rules file: /lib/udev/rules.d/70-joystick.rules
Reading rules file: /lib/udev/rules.d/70-mouse.rules
Reading rules file: /lib/udev/rules.d/70-power-switch.rules
Reading rules file: /lib/udev/rules.d/70-touchpad.rules
Reading rules file: /lib/udev/rules.d/70-uaccess.rules
Reading rules file: /lib/udev/rules.d/71-seat.rules
Reading rules file: /lib/udev/rules.d/73-seat-late.rules
Reading rules file: /lib/udev/rules.d/75-net-description.rules
Reading rules file: /lib/udev/rules.d/75-probe_mtd.rules
Reading rules file: /lib/udev/rules.d/78-sound-card.rules
Reading rules file: /lib/udev/rules.d/80-drivers.rules
Reading rules file: /lib/udev/rules.d/80-net-setup-link.rules
Reading rules file: /lib/udev/rules.d/90-alsa-restore.rules
Reading rules file: /lib/udev/rules.d/90-vconsole.rules
Reading rules file: /lib/udev/rules.d/97-hid2hci.rules
Reading rules file: /lib/udev/rules.d/99-systemd.rules
Reading rules file: /etc/udev/rules.d/touchscreen.rules
rules contain 24576 bytes tokens (2048 * 12 bytes), 11301 bytes strings
1619 strings (19672 bytes), 1047 de-duplicated (8944 bytes), 573 trie nodes used
IMPORT builtin 'net_id' /lib/udev/rules.d/75-net-description.rules:6
IMPORT builtin 'path_id' /lib/udev/rules.d/80-net-setup-link.rules:5
IMPORT builtin 'net_setup_link' /lib/udev/rules.d/80-net-setup-link.rules:9
No matching link configuration found.
RUN '/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/$name --prefix=/net/ipv4/neigh/$name --prefix=/net/ipv6/conf/$name --prefix=/net/ipv6/neigh/$name' /lib/udev/rules.d/99-systemd.rules:60
ACTION=add
DEVPATH=/devices/soc0/soc/2100000.aips-bus/2188000.ethernet/net/eth0
ID_NET_DRIVER=fec
ID_NET_NAME_MAC=enx26e12cc4c7c6
ID_PATH=platform-2188000.ethernet
ID_PATH_TAG=platform-2188000_ethernet
IFINDEX=2
INTERFACE=eth0
SUBSYSTEM=net
SYSTEMD_ALIAS=/sys/subsystem/net/devices/eth0
TAGS=:systemd:
USEC_INITIALIZED=6371280
run: '/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/eth0 --prefix=/net/ipv4/neigh/eth0 --prefix=/net/ipv6/conf/eth0 --prefix=/net/ipv6/neigh/eth0'
Unload module index
Unloaded link configuration context.




$ udevadm trigger -c change -a carrier=0 /sys/class/net/eth0   // 변경이 안됨 
$ udevadm trigger -c change -a carrier=1 /sys/class/net/eth0     // 변경이 안됨


6/17/2019

STM32CubeMX 와 TrueStudio

1. STM32관련 부분개발 IDE 환경

현재 ST에서는 STM32CubeMX 제공하고 있으며, Atolic에서는 TrueStudio 개발환경을 제공을 해주고 있다.
STM32CubeMX는 GUI을 이용하여 쉽게 PLL 설정 부터 PIN 설정을 쉽게가능하고 관련 SW를 쉽게 소스를 설치 및 설정할수 있도록 지원하고, 소스를 생성가능하다.
TrueStudio는 이클립스 CDT 기반으로 GCC를 이용하여 구현되어있으며, 이클립스를 사용을 해본사람이면, 쉽게 사용이 가능하다.


  • Download 
STM32CubeMX
  https://www.st.com/en/development-tools/stm32cubemx.html

TrueStudio
  https://atollic.com/truestudio/

STM32CubeIDE
  https://www.st.com/en/development-tools/stm32cubeide.html


현재 ST사에서 상위 두개 프로그램 합쳐서 제공
STM32CubeIDE 1.0.0  ( STM32 CubeMX 와 TrueStudio 합쳐진 것으로 생각하면됨)

1.1  STM32CubeMX 

STM32CubeMX의 역할은 쉽게 GUI로 PIN 및 Clock 을 설정 하고,  관련 Package를 선택을 하면, 쉽게 코드가 생성이되는 Tool 이다.

처음 해야할 일이 회로도 기반으로 PINOUT를 설정하고, 그 다음에, PLL 관련 설정 일 것이다.
그리고, 사용할 Driver 부터 Middleware를 선택하여, 기본 사용법을 익히자.

  • PinOut&Configuration (전체 PINOUT 보기 )




  • PinOut&Configuration->RCC 설정 
PLL의 입력 Clock 과 Clock 관련 핀설정



  • Clock Configuration 
현재 STM32F104F 는 내부에 오실레이터 8MHz 와 외부 오실레터를 별도로 둘 수 가 있다.
회로도를 보고, 내부 오실레이터 사용할지, 외부 오실레이터를 사용할지 잘 보자.
그리고, 최종 APB PCLK 과 Datasheet의 권고사항을 잘 보자.
이 Chip에는 MCO라는 것이 있는데, 이는 Ethernet PHY 칩에게 공급되는 Clock으로 정확하게 이해하자.



  • PinOut&Configuration->SYS (JTAG의 SW모드 설정)
STM의 JTAG or SWD(Serial Wired Debug)설정부분이며, 이 부분을 제대로 설정하지 않는다면 다음에 제대로 쓸수가 없다.
현재 나의 경우는 SWD모드로 사용.


JTAG에서 SWD모드를 사용하고 있으며, 상위에서 그 부분을 설정해줘야 한다. 그리고, ST-Link Utility를 비롯하여 연결되는 Interface는 JTAG 대신 SWD로 설정해줘야한다.


  • JTAG과 SWD 모드 
  1. JTAG 4Pin
  2. JTAG 5Pin
  3. SWD (SWDIO,SWCLK ) 


  https://www.st.com/resource/en/user_manual/dm00026748.pdf


  • STM32F10x기본구조 



JTAG 관련정보
  http://forum.falinux.com/zbxe/index.php?document_srl=796669&mid=lecture_tip


  • PinOut&Configuration->Timers
Timer를 기본적으로 하나를 반드시 사용해야하는 줄 알았는데,  내부의 SysTick 라는 것이 존재하여 리눅스처럼, Jiffies 설정을 위해서 별도로 사용할 필요가 없다.
HW 적으로 필요하다면, RTC/TIM를 설정해서 사용하자.



  • PinOut&Configuration->Connectvity
UART부분 설정으로, Consol의 역할로 나의 경우는 TX만 설정하고, RX는 Pull -down으로 설정
대신, Interrupt는 사용한다.



  • Ethernet의 PIN 및 Interface 설정(MII) 
MII Interface로 설정하고, NVIC의 Interrupt는 별도로 사용하지는 않았다.
관련 PHY는 설정은 Default로 사용해도 무방할 것이다.



Auto-Negotiation 과 RX Mode의 Polling은  While 무한루프 함수를 사용하여, 이더넷을 살펴봐서 이벤트가 발생하며, 이를 알려주는 방식이다.



  • PinOut&Configuration->Middleware->LWIP
LWIP에서 필요한 부분 설정을 하며, 기본으로 체크해야 할 부분이 Checksum은 Hardware 지원변경하고, General Setting에서 필요한 기능을 사용설정

옵션으로 SNMP 멀티캐스트 필요하다면 설정, SNTP시간설정필요하다면 설정.




  • PinOut&Configuration->GPIO 설정
GPIO를 인터럽트로 사용하고 싶다면, 아래의 설정을 이해를 하자.

  1. Nested vectored interrupt controller (NVIC)
  2. External interrupt/event controller (EXTI)

아래와 같이 GPIO를 External Interrupt Mode 설정 


GPIO->NVIC에서 EXTI line 을 설정 선점 우선순위도 설정가능



  • PinOut&Configuration->NVIC

사용할 Interrupt 및 Exception 을 설정하고 Priorioty도 설정



1.2 TrueStudio 사용방법

다른 이클립스와 동일하며, 확인해야할 것은 Compiler인 GCC 이다.
처음 코드가 생성되면 제대로 동작이 된다면, 아래와 같이 쉽게 동작인된다.



기본적으로 Linux 커널처럼 weak를 사용하며, 이미 Function들은 정의가 되어있지만, 구현되지 않은 것이 많다.
그래서, 그런부분은 필요에 따라 본인이 구현을 해서 넣으면, 관련부분은 동작이 된다.


  • GPIO Interrupt

상위 GPIO에서 설정한대로 설정하고, ISR만 아래처럼 구현을 하면된다.

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  
{
  if (GPIO_Pin == GPIO_PIN_14)
  {
  }
}

  • UART의 Printf사용방법
UART를 설정을 했다면, 아래와 같이 GCC에서 아래의 함수를 추가하면 printf가 동작한다.
만약 UART의 scanf도 사용하고 싶다면,  __io_getchar(void) 를 이용하면 될것이다.


  • Linker Script
GCC 기반이므로, Linker Script 관련부분은 아래 참조
  https://ahyuo79.blogspot.com/2018/04/link-script.html

Flash Write
  https://m.blog.naver.com/PostView.nhn?blogId=gauya&logNo=220936982058&proxyReferer=https%3A%2F%2Fwww.google.com%2F
  http://blog.naver.com/PostView.nhn?blogId=wararat&logNo=220761212163&parentCategoryNo=&categoryNo=71&viewDate=&isShowPopularPosts=true&from=search
  https://community.st.com/s/question/0D50X00009XkfIOSAZ/stm32f0-help-with-flash-to-read-and-write-hal-libraries

UART 관련사항
  https://mul-ku.tistory.com/entry/STM32-UART-%EC%88%98%EC%8B%A0-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%98%88%EC%A0%9CHAL-DRIVER


TrueStudio  SVN
  https://mobilegen.tistory.com/38


2/10/2015

U-boot MII 와 NAND 기본명령

1. Uboot의 기본정보

  • 메뉴얼 
http://www.denx.de/wiki/DULG/Manual
http://www.denx.de/wiki/U-Boot/Documentation

  • 소스확인 
http://git.denx.de/?p=u-boot.git;a=summary


  • Uboot Command 
  http://skywheel.tistory.com/entry/uboot-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%B0%8F-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%A0%95%EB%A6%AC


1.1 Uboot Config 확인 

  • Uboot 기본설정확인
include/config.h  
include/configs/xxxx   //board name 

#define CONFIG_CMD_xxx         // Command 지원확인
#define CONFIG_ENV_OFFSET      // ENV 저장부분  
#define CONFIG_ENV_ADDR


SoC에따른 Uboot
  http://www.denx.de/wiki/U-Boot/Custodians


1.2 Uboot Env NFS 설정 


  • TI-NFS SETTING EXAMPLE
setenv ethaddr 00:11:22:33:04:55
setenv ipaddr 192.168.1.4
setenv serverip 192.168.1.100
setenv netmask 255.255.255.0
setenv broadcast 192.168.1.255
setenv gateway 192.168.1.1 

setenv bootargs 'console=ttyS1,115200n8 rw mem=48M root=/dev/nfs nfsrootdebug rootdelay=4 nfsroot=192.168.1.100:/home/jhlee/dm368/mt5/Source/ipnc_rdk/target/filesys_dm368,nolock mem=48M cmemk.phys_start="0x83000000" cmemk.phys_end="0x88000000" cmemk.phys_start_1="0x00001000" cmemk.phys_end_1="0x00008000" cmemk.pools_1="1x28672" cmemk.allowOverlap=1 eth=00:0C:0C:A0:04:22 ip=192.168.1.168 nohz=off highres=off clocksource=acpi_pm lpj=1077248 earlyprintk'

안에들어가는 옵션은 Filesystem에 따라 다양하며, 위에서 보는거와 같이 디버깅을 위해서,
earlyprintk , nfsrootdebug 를 추가 가능하다.
또한, mount 시점을 delay를 주는 것도 가능하다.
quiet


2. Uboot의 MII 명령

MII는 Media indepenent interface로 LAN에서 사용하는 표준 Interface이며, 이를 이용하여 일반적으로 사용되어지는 Register 값들을 확인가능하다.

  • Uboot시 아래 mii phy 발견확인 
In:    serial
Out:   serial
Err:   serial
ARM Clock :- 432MHz
DDR Clock :- 340MHz
Ethernet PHY: GENERIC @ 0x01
Hit any key to stop autoboot:  0 

  • MII Device의 갯수 및 주소 파악 
현재 사용되어지는 MII Device 갯수와 주소를 파악가능 (현재 1개만사용)

DM368 IPNC :>mii device
MII devices: 'GENERIC @ 0x01' 
Current device: 'GENERIC @ 0x01'

2.1 Uboot MII 명령어

  • Uboot MII 명령어 
- mii device Lists available devices.  // 사용가능한 MII Device 보여줌
- mii device Set current device.      // MII Device 설정 
- mii read Reads register 'reg' from MII PHY 'addr'.  // MII Device의 Register Read
- mii write Writes 'data' to register 'reg' at MII PHY 'addr'.    // MII Device의 Register Write
- mii dump Displays data of register 'reg' from MII PHY 'addr'.   // MII Device Register Dump 


  • 관련소스
MII에서 MDIO설정하는 부분확인
drivers/net/stmmac/mdio.c

  • Offset Register Name
  1. 00 Basic Mode Configuration
  2. 01 Basic Mode Status
  3. 02 PHY ID #1
  4. 03 PHY ID #2
  5. 04 AutoNegotation Advertisement
  6. 05 Link Partner Ability
  7. 06 AutoNegotation Expansion

  • The bits of the MII status 
  1. 0x8000 Capable of 100baseT4.
  2. 0x7800 Capable of 10/100 HD/FD (most common).
  3. 0x0040 Preamble suppression permitted.
  4. 0x0020 Autonegotiation complete.
  5. 0x0010 Remote fault.
  6. 0x0008 Capable of Autonegotiation.
  7. 0x0004 Link established ("sticky"* on link failure)
  8. 0x0002 Jabber detected ("sticky"* on transmit jabber)
  9. 0x0001 Extended MII register exist.

  https://en.wikipedia.org/wiki/Media-independent_interface

2.2 Uboot MII 사용방법 및 확인


  • Basic Mode Configuration

DM368 IPNC# mii write 1 0 0  // addr reg data
DM368 IPNC# mii read 1 0   // addr reg data 
0000
DM368 IPNC# mii write 1 0 3100     // default setting (Basic Mode Configuration)
DM368 IPNC# mii read 1 0
3100
DM368 IPNC# mii write 1 0 B100    // + Reset 
DM368 IPNC# mii read 1 0
3100


  • 상위 Register 들 점검
DM368 IPNC :>mii read 1 0  // Basic Mode Configuration
3100
DM368 IPNC :>mii read 1 1  // Basic Mode Status 
7849
DM368 IPNC :>mii read 1 2  // PHY ID #1
0181
DM368 IPNC :>mii read 1 3  // PHY ID #2
B8B0
DM368 IPNC :>mii read 1 4  // AutoNegotation Advertisement
01E1
DM368 IPNC :>mii write 1 0 1000
DM368 IPNC :>mii read 1 0


  • MII Dump로 쉽게 분석

# mii dump 1 0  // Basic Mode Configuration
0.     (3100)                 -- PHY control register --
  (8000:0000) 0.15    =     0    reset
  (4000:0000) 0.14    =     0    loopback
  (2040:2000) 0. 6,13 =   b01    speed selection = 100 Mbps
  (1000:1000) 0.12    =     1    A/N enable   // Auto Nego
  (0800:0000) 0.11    =     0    power-down
  (0400:0000) 0.10    =     0    isolate
  (0200:0000) 0. 9    =     0    restart A/N
  (0100:0100) 0. 8    =     1    duplex = full
  (0080:0000) 0. 7    =     0    collision test enable
  (003f:0000) 0. 5- 0 =     0    (reserved)

# mii dump 1 1 // Basic Mode Status 
1.     (786d)                 -- PHY status register --
  (8000:0000) 1.15    =     0    100BASE-T4 able
  (4000:4000) 1.14    =     1    100BASE-X  full duplex able
  (2000:2000) 1.13    =     1    100BASE-X  half duplex able
  (1000:1000) 1.12    =     1    10 Mbps    full duplex able
  (0800:0800) 1.11    =     1    10 Mbps    half duplex able
  (0400:0000) 1.10    =     0    100BASE-T2 full duplex able
  (0200:0000) 1. 9    =     0    100BASE-T2 half duplex able
  (0100:0000) 1. 8    =     0    extended status
  (0080:0000) 1. 7    =     0    (reserved)
  (0040:0040) 1. 6    =     1    MF preamble suppression
  (0020:0020) 1. 5    =     1    A/N complete  //Auto Nego 
  (0010:0000) 1. 4    =     0    remote fault
  (0008:0008) 1. 3    =     1    A/N able
  (0004:0004) 1. 2    =     1    link status
  (0002:0000) 1. 1    =     0    jabber detect
  (0001:0001) 1. 0    =     1    extended capabilities


# mii dump 1 2 // PHY ID #1
2.     (0243)                 -- PHY ID 1 register --
  (ffff:0243) 2.15- 0 =   579    OUI portion


# mii dump 1 3 // PHY ID #2
3.     (0c54)                 -- PHY ID 2 register --
  (fc00:0c00) 3.15-10 =     3    OUI portion
  (03f0:0050) 3. 9- 4 =     5    manufacturer part number
  (000f:0004) 3. 3- 0 =     4    manufacturer rev. number


# mii dump 1 4 // AutoNegotation Advertisement
4.     (01e1)                 -- Autonegotiation advertisement register --
  (8000:0000) 4.15    =     0    next page able
  (4000:0000) 4.14    =     0    reserved
  (2000:0000) 4.13    =     0    remote fault
  (1000:0000) 4.12    =     0    reserved
  (0800:0000) 4.11    =     0    asymmetric pause
  (0400:0000) 4.10    =     0    pause enable
  (0200:0000) 4. 9    =     0    100BASE-T4 able
  (0100:0100) 4. 8    =     1    100BASE-TX full duplex able
  (0080:0080) 4. 7    =     1    100BASE-TX able
  (0040:0040) 4. 6    =     1    10BASE-T   full duplex able
  (0020:0020) 4. 5    =     1    10BASE-T   able
  (001f:0001) 4. 4- 0 =     1    selector = IEEE 802.3

# mii dump 1 5  //Link Partner Ability
5.     (45e1)                 -- Autonegotiation partner abilities register --
  (8000:0000) 5.15    =     0    next page able
  (4000:4000) 5.14    =     1    acknowledge
  (2000:0000) 5.13    =     0    remote fault
  (1000:0000) 5.12    =     0    (reserved)
  (0800:0000) 5.11    =     0    asymmetric pause able
  (0400:0400) 5.10    =     1    pause able
  (0200:0000) 5. 9    =     0    100BASE-T4 able
  (0100:0100) 5. 8    =     1    100BASE-X full duplex able
  (0080:0080) 5. 7    =     1    100BASE-TX able
  (0040:0040) 5. 6    =     1    10BASE-T full duplex able
  (0020:0020) 5. 5    =     1    10BASE-T able
  (001f:0001) 5. 4- 0 =     1    selector = IEEE 802.3

# mii info  // MII PHY 관련정보
PHY 0x01: OUI = 0x90C3, Model = 0x05, Rev = 0x04, 100baseT, FDX

  https://en.wikipedia.org/wiki/Management_Data_Input/Output
  https://en.wikipedia.org/wiki/Autonegotiation
  http://lostintransit.se/tag/autonegotiation/
  http://units.folder101.com/cisco/sem1/Notes/ch6-ethernet/autonegotiation.htm


3. Uboot I2C 와 USB 명령어 

  • Uboot에서 USB 명령어

# usb dev 0
USB device 0:
    Device 0: Vendor: General  Rev: 5.00 Prod:              
            Type: Removable Hard Disk
            Capacity: 3950.0 MB = 3.8 GB (8089600 x 512)
... is now current device

# usb part 0
Partition Map for USB device 0  --   Partition Type: DOS
Partition     Start Sector     Num Sectors     Type
    1            778135908      1141509631      72
    2            168689522      1936028240      65
    3           1869881465      1936028192      79
    4           -1409286144          55499       d

  • Uboot에서 I2C명령어

imd {i2c_chip} {addr}{.0, .1, .2} {len}
imm{.b, .w, .l} {i2c_chip} {addr}{.0, .1, .2}
imw {i2c_chip} {addr}{.0, .1, .2} {data} [{count}]


4. Uboot NAND 명령어

CPU마다 기본적으로 지원되는 Command는 많이 다르며, 특정 CPU에서만 지원되는 CMD도 있다.
본인이 원하면 CMD를 추가하여 설정을 하고 포팅을 해서 사용을 해야 하며 관련내용은 Command Config에서 확인하자.

nand write 관련 command

nand write       : 일반적인 raw data를 기록한다.
nand write.e     : NAND의 ecc block을 사용하여 기록을 한다.
nand write.jffs2 : jffs2 filesystem을 기록한다.


nandecc hw 2
nandecc hw 0   : ecc 변경

  https://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/100/t/210595


nand scrub : bbt까지 다 없애고 초기화
nand erase : nand erase 진행

세부설명은 이곳을 봐도 될 것 같음
  http://wiki.openmoko.org/wiki/U-Boot_commands#Loading_Kernel_from_NAND
  http://wiki.openmoko.org/wiki/NAND_bad_blocks


  http://www.aesop.or.kr/index.php?mid=Board_Community_QandA&page=41&listStyle=webzine&document_srl=77412

2/04/2015

Media Independent Interface (L2 와 L1 Interface)

1. MII Interface

일반적으로 SoC를 보면 EMAC/MAC 과 PHY Chip 분리되어 동작이 되는 것을 알 수가 있으며, 그 구조를 보면, Ethernet 의 L2와 L1의 구성이라고 생각하면 되겠다. 

처음 MII (Media Independent Interface)를 접한 것은 MPC850T을 사용할 때 FAST Ethernet을 사용하면서 이것을 처음 접했는데, 그 때는 왜 사용하는 지 궁금했다.
하지만, 매번 SoC를 접하면서 각 종류별로 매번 MII를 접하다보니, 이것에 대해 정리를 하고자 아래와 같이 간단히 서술만 하기로 한다. 
사실 MII 개념은 어렵지 않기 때문에, 한번 이해하면 다음에도 다른 MII 도 쉽게 이해한다. 
그리고, Linux에서도 설정도 쉽게 하므로 자세한 설명은 모두 생략한다. 

MII를 사용하는 이유는 뻔하다 SoC와 Phy Chip간의 중간 Interface로 사용하는 것으로 USB를 비롯하여 각 다른 고속 Serial Interface에서도 많이 볼 수있는 현상이다.
즉, Phy 칩의 표준 Interface라고 생각하면 될 꺼 같다. 


1.1 MII(Media Independent Interface)의 종류들 

MII(Media Independent Interface)만 알면 나머지도 쉽게 이해가 가면 어렵지가 않지만, 요즘은 거의 GMII기반으로 사용하기에 간단히 설명 
위키에 설명이 너무 잘되어 있어 관련 세부설명은 생략한다.
  1. EMAC: 실제 MAC Data 전송  
    1. MAT To PHY  (일반적인 구성이며, 아래 그림과 동일)
    2. MAC To MAC (TX, RX를 Cross로 연결 구성)
  2. MDIO: Phy 칩 Control  
    1. Master/Slave 개념으로 동작  
    2. AP의 MDIO가 Master가 되어 , PHY의 제어와 기능확인 

https://www.ti.com/lit/ug/sprugx8b/sprugx8b.pdf (6.2.3)


TI의 EMAC 과 일반 PHY가 아닌 Switch (RTL8370M) 외부와 연결시,아래의 그림 MAC To MAC으로 연결한다.
처음 이부분 때문에 조금 혼동이 되었으며, 아래와 같은 구성으로 연결이 된다.


1.3 MII와 GMII 다른점 

TI Community 문의사항
TI 계정은 각 회사 계정도 있고해서, 블로그용은  별도로 내 개인 TI 계정도 별도 만들었음 
  https://e2e.ti.com/support/processors-group/processors/f/processors-forum/391695/gmii-clock-gmtclk-pin-doesn-t-work-on-dm8167

MII : 2.5 MHz or 25 MHz
GMII : 2.5 MHz or 25MHz or 125MHz

MII 일 경우, TX, RX Clock을 모두 PHY에서 제공하는 Sync 방식
GMII 일 경우,  TX Clock Host가, RX은 PHY가 제공한다. Async 방식 (Giga bit 일 경우)


Ref.
  http://www.ti.com/lit/ug/sprugx8b/sprugx8b.pdf  (EMAC)


1.4  ERROR Report 

MII 이든, GMII 이든, 에러가 발생을 하며 이를 보고를 한다. 보통이를 EMAC Driver에서 제공하며,
Linux Device Driver에서는 이를 다시 /proc/net/dev로 연결을 해놓는다.


RX_ER, CRS, COL

관련 정보

# cat  /proc/net/dev



2 How To Connect it with Host 

각 Host 의 MAC->  MAC or PHY 연결하는 방법으로 간단하게 그림으로 설명 


2.1 MAC to PHY(GMII/MII)

가장 일반적인 구성으로 MAC 과 PHY 칩을 직접 연결하여, RJ45 나가는 구성  
다만 각 GMII/MII/RGMII/SGMII/XGMII 조금 씩 차이는 있지만, 그 구성은 거의 다 비슷하다. 

Host에서 PHY로 연결을 했기때문에, PHY의 정보를 읽어 올 수 있다. 그리고, PHY에서
발생하는 ERR 및 및 CRS, COL을 연결한다.


  • 상위 EMAC은 연결 구성도 (MDIO는 생략)


Host에서 MDIO Interface를 사용하여 PHY를 제어를 하며, CLK을 모두, PHY에서 얻어오는
Sync 방식이다.

  • 상위 EMAC은 연결 구성도 (MDIO는 생략)



2.2 MAC to MAC  (GMII)

일반적인 구성은 아니며, Host의 MAC to MAC 직접 연결(1:1 Mapping) 했기 때문에, 
정확히 PHY가 없기 때문에, PHY 정보를 얻어 올수 없으며, 아래와 같이 HW 구성도 달라진다.
즉, TX, RX를 Cross 로 연결해주는 것이다. 

가장 쉬운 예로 
  1. AP의 MAC 과 SWITCH 의 MAC 연결 
  2. AP의 MAC 과 AP 의 MAC 연결 

정확히 말해, PHY 정보를 얻어오는 MDIO Interface를 사용할 수가 없다.
그래서, SWITCH 인 RTL8370M은 SMI Interface를 별도로 제공한다.

RX_ER, CRS, COL은  GR로 연결을 된다.

  • 상위 EMAC은 연결 구성도 (MDIO는 생략)




3. Timing 

GMII Interface Timing 도를 구하지 못해, 아래와 같이, RGMII Timing도를 구함.


http://www.cnblogs.com/shengansong/archive/2012/01/04/2311894.html



GTX_CLK의 Rising Edge에 가 Setup Time이며, 뒤는 Hold Time이다.
그래서, Data는 Setup Time 약간 뒤에 있는 것이 좋다.

http://www.cnblogs.com/shengansong/archive/2012/01/04/2311894.html


GMII Interface 관련자료
  http://hearlink.tripod.com/CandCDB/GMII_REPORT.pdf