4.7 Media Local Bus
4.7.1 Introduction
MediaLB는 공통된 하드웨어 인터페이스와 소프트웨어 API 라이브러리를 표준화하도록 특별히 설계된 on-PCB 또는 inter-chip 통신 버스이다.
이 표준화를 통해 하나의 애플리케이션이나 여러 애플리케이션이 MOST Network 데이터에 액세스하거나 최소한의 노력으로 다른 애플리케이션과 통신할 수 있다. 동기 스트림 데이터, 비동기 패킷 데이터, 컨트롤 메시지 데이터와 같은 모든 MOST Network 데이터 전송 방법을 MediaLB는 지원한다. MediaLB는 등시성(같은 시간, 동시) 데이터 전송 방식도 지원한다. MediaLB에 대한 자세한 내용은 Media Local Bus Specification를 참조한다.
MediaLB 모듈은 MediaLB 사양의 Physical Layer와 Link Layer를 구현하여 i.MX를 MediaLB 컨트롤러에 연결한다.
MLB는 3핀 MediaLB 모드를 구현하며 최대 1024Fs의 속도로 실행할 수 있다. MediaLB 컨트롤러 기능은 구현하지 않는다. 모든 MediaLB 디바이스는 MediaLB를 통해 데이터를 보내기 위한 물리 채널의 집합을 지원한다. 각 물리 채널은 길이가 4바이트(quadlet:쿼드렛)이고 각 논리 채널에 할당된 하나 이상의 물리 채널과 함께 논리 채널로 그룹화된다. 이러한 논리 채널은 채널 유형(동기, 비동기, 컨트롤이나 등시)와 방향(전송이나 수신)의 조합이 될 수 있다.
MLB는 최대 64개의 논리 채널과 최대 64개의 물리 채널을 지원한다. 각 논리 채널은 고유한 채널 주소를 사용하여 참조되고 데이터를 전송하는 MediaLB 디바이스와 데이터를 수신하는 MediaLB 디바이스 사이의 단방향 데이터 경로를 나타낸다.
지원되는 기능은 아래와 같다.
- 동기, 비동기, 컨트롤과 등시 채널.
- 최대 64개의 논리 채널과 64개의 물리 채널은 최대 1024Fs의 속도로 실행.
- 논리 채널 주소와 연관된 전송 디바이스로 기능을 하면, 명령 및 데이터 전송과 수신 상태를 수신.
- 논리 채널 주소와 연관된 수신 디바이스로 기능을 하면, 명령 및 데이터 수신과 응답으로 수신 상태를 전송.
- MediaLB 잠금 감지.
- 시스템 채널 명령 처리.
- 256Fs, 512Fs, 1024Fs 프레임 속도.
- 비동기, 컨트롤, 동기와 등시 채널 유형.
- MLB 디바이스 모듈에 대한 아래 구성을 지원 :
- 프레임 속도
- 디바이스 주소
- 채널 주소
- MLB 채널 예외 가져오기 인터페이스. 모든 채널 예외는 애플리케이션에 의해 전송되고 처리.
4.7.2 MLB Driver Overview
MLB 드라이버는 Linux OS에서 일반적인 문자(character) 드라이버로 설계되어 있다. Ping-Pong 버퍼링 작동 모드로 하나의 비동기와 하나의 컨트롤 채널 디바이스를 구현한다. 지원되는 프레임 속도는 256, 512, 1024Fs이다. MLB 드라이버는 공통의 read/write 인터페이스를 사용하여 패킷을 receive/send하고 ioctl 인터페이스를 사용하여 MLB 디바이스 모듈을 구성한다.
MLB 드라이버 아키텍처는 아래 그림과 같다.
MLB 드라이버는 4개의 보조(minor) 디바이스를 생성한다. 이 4개의 디바이스는 컨트롤 Tx/Rx 채널, 비동기 Tx/Rx 채널, 동기 Tx/Rx 채널, 등시 Tx/Rx 채널을 지원한다. 이들의 디바이스 파일은 /dev/ctrl, /dev/async, /dev/sync, /dev/isoc이다. 각 보조 디바이스는 동일한 인터페이스를 가지고 Tx와 Rx 작업 모두 처리한다. 아래 설명은 컨트롤과 비동기 디바이스에 대한 것이다.
드라이버는 IRAM을 MLB 디바이스 모듈의 Tx/Rx 버퍼로 사용한다. 모듈과 IRAM 사이에 모든 전송과 수신 데이터는 MLB 모듈의 DMA에서 처리한다. 드라이버는 MLB 모듈에 대한 버퍼의 시작과 마지막 포인터를 구성하는 역할을 한다.
수신에 대해, 드라이버는 수신된 패킷을 읽기 위한 버퍼로 보내기 위해 링 버퍼를 사용한다. 패킷이 도착하면, MLB 모듈은 IRAM Rx 버퍼에 수신된 패킷을 넣고, 인터럽트로 드라이버에 알린다. 그런 다음 드라이버는 IRAM의 패킷을 쓰기 위치가 가리키는 하나의 링 버퍼 노드에 복사하고, 다음 비어있는 노드로 쓰기 위치를 업데이트한다. 마지막으로 패킷 리더인 애플리케이션은 알림을 받고, 링 버퍼의 읽기 위치가 가리키는 노드에서 하나의 패킷을 가져간다. 읽기가 완료되면, 사용 가능한 다음 버퍼 노드로 읽기 위치를 업데이트한다. 읽기와 쓰기 위치가 동일한 경우에는 링 버퍼에 수신된 패킷이 없는 것이다.
전송에 대해, 드라이버는 라이터인 애플리케이션에서 제공한 패킷을 IRAM Tx 버퍼에 쓰고 Tx 상태를 업데이트하고 MLB 디바이스 모듈의 Tx 버퍼 포인터를 설정하여 전송을 시작한다. 전송이 완료된 후, 드라이버는 인터럽트로 알림을 받고 애플리케이션에서 다음 패킷을 받을 수 있도록 Tx 상태를 업데이트한다.
드라이버는 NON BLOCK I/O를 지원한다. 사용자 애플리케이션은 패킷이나 예외 이벤트를 읽을 수 있는지 확인하기 위해 폴링을 할 수 있고 패킷을 보낼 수 있는지 여부도 확인할 수 있다. 예외 이벤트가 있으면, 애플리케이션은 ioctl을 호출하여 이벤트를 가져올 수 있다. 또한 ioctl은 프레임 속도, 디바이스 주소, 채널 주소를 구성하기 위한 인터페이스도 제공한다.
4.7.3 Software Operation
MLB 드라이버는 애플리케이션에 공통된 인터페이스를 지원한다.
- Packet read/write - BLOCK과 NONBLOCK Packet I/O 모드가 지원된다. 한번에 하나의 패킷만 읽거나 쓸 수 있다. d읽기 위한 최소 길이는 수신된 패킷 길이보다 크거나 같아야 하고, 쓰기 위한 길이는 1024 바이트보다 짧아야 한다.
- Polling - MLB 드라이버는 세 가지 상태를 폴링하는 폴링 인터페이스를 제공하고, 애플리케이션은 현재 I/O 상태를 가져오기 위해 select를 사용할 수 있다.
- 읽을 수 있는 패킷. (읽기 위한 준비)
- 드라이버가 다음 패킷을 보낼 준비가 되었다. (쓰기 위한 준비)
- 예외 이벤트가 발생. (읽기 위한 준비)
- ioctl - MLB 드라이버는 아래 ioctl을 제공한다 :
MLB_SET_FPS
인수 유형: unsigned int
프레임 속도 설정하며, 인수는 반드시 256, 512, 1024 여야 한다.
MLB_GET_VER
인수 유형: unsigned long
MLB 모듈 버전을 가져온다. i.MX35에서 기본으로 0x02000202이다.
MLB_SET_DEVADDR
인수 유형: unsigned char
MLB 디바이스 주소를 설정한다. 시스템 채널 MlbScan 명령에서 사용된다.
MLB_CHAN_SETADDR
인수 유형: unsigned int
통신 채널 주소[8:1]비트를 설정한다. 이 ioctl은 tx와 rx 채널 주소를 모두 결합하며, tx_ca[8:1] << 16 | rx_ca[8:1]와 같은 인수 형식이다.
MLB_CHAN_STARTUP
전송과 수신을 위해 채널의 통신 유형을 시작한다.
MLB_CHAN_SHUTDOWN
채널의 통신 유형을 종료한다.
MLB_CHAN_GETEVENT
인수 유형: unsigned long
MLB 디바이스 모듈에서 예외 이벤트를 가져온다. 이벤트는 열거형의 집합으로 정의된다 :
MLB_EVT_TX_PROTO_ERR_CUR
MLB_EVT_TX_BRK_DETECT_CUR
MLB_EVT_RX_PROTO_ERR_CUR
MLB_EVT_RX_BRK_DETECT_CUR
4.7.4 Source Code Structure
아래 테이블은 MLB 드라이버 소스 파일의 나열이다.
Table 44. MLB Driver Siurce Files
File | Description |
drivers/mxc/mlb/mxc_mlb.c | MLB 드라이버 소스 파일 |
include/linux/mxc_mlb.h | MLB 드라이버 포함 파일 |
4.7.5 Menu Configuration Options
메뉴 구성에서 아래 모듈을 활성화한다 :
Device Drivers > MXC support drivers > MXC Media Local Bus Driver > MLB support
'NXP i.MX SoC Family > i.MX Linux Reference Manual' 카테고리의 다른 글
i.MX Linux Reference Manual - Connectivity - USB (6) | 2022.07.29 |
---|---|
i.MX Linux Reference Manual - Connectivity - PCI Express Root Complex (0) | 2022.07.27 |
i.MX Linux Reference Manual - Connectivity - Inter-IC (I2C) (0) | 2022.07.26 |
i.MX Linux Reference Manual - Connectivity - FlexCAN (0) | 2022.07.25 |
i.MX Linux Reference Manual - Connectivity - Fast Ethernet Controller (FEC) (0) | 2022.07.22 |