4.7 Media Local Bus
4.7.1 Introduction
MediaLB는 일반적인 하드웨어 인터페이스와 소프트웨어 API 라이브러리를 표준화하도록 특별히 디자인된 on-PCB나 inter-chip 통신 버스이다.
이 표준화를 통해 애플리케이션이나 다중 애플리케이션이 MOST Network 데이터에 액세스하거나 최소한의 노력으로 다른 애플리케이션과 통신할 수 있다. MediaLB는 동기식 스트림 데이터, 비동기식 패킷 데이터와 컨트롤 메세지 데이터와 같은 모든 MOST Network 데이터 전송 방법을 지원한다. MediaLB는 등시성(isochronous: 동시에 발생) 데이터 전송 방법도 지원한다. 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 디바이스 사이의 단방향 데이터 경로를 나타낸다.
지원되는 기능은 아래와 같다:
- 동기식, 비동기식, 컨트롤과 등시성 채널
- 최대 1024Fs의 속도로 실행되는 최대 64개의 논리 채널과 64개의 물리 채널
- 논리 채널 주소와 연관된 전송 디바이스로 기능을 할 때, 커맨드와 데이터의 전송 및 수신 상태의 수신
- 논리 채널 주소와 연관된 수신 디바이스로 기능을 할 때, 수신 상태의 응답으로 커맨드와 데이터 수신 및 전송
- MediaLB 잠금(lock) 감지
- 시스템 채널 커맨드 처리
- 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개의 마이너 디바이스를 생성한다. 이 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에서 쓰기 위치로 표시된 하나의 링 버퍼 노드로 패킷을 복사하고, 다음 빈 노드로 쓰기 위치를 업데이트한다. 마지막으로 패킷 리더(Reader) 애플리케이션에 통지하고, 링 버퍼의 읽기 위치로 표시된 노드에서 하나의 패킷을 가져온다. 읽기가 완료된 후, 다음 사용 가능한 버퍼 노드로 읽기 위치를 업데이트한다. 읽기와 쓰기 위치가 같을 때, 링 버퍼에 수신된 패킷은 없다.
전송을 위해, 드라이버는 라이터(Writer) 애플리케이션이 제공한 패킷을 IRAM Tx 버퍼에 쓰고, Tx 상태를 업데이트한 다음, MLB 디바이스 모듈의 Tx 버퍼 포인터를 설정하여 전송을 시작한다. 전송이 완료된 후, 드라이버는 인터럽트에 의해 통지를 받고 애플리케이션으로 부터 다음 패킷을 수락하도록 Tx 상태를 업데이트한다.
드라이버는 NON BLOCK I/O를 지원한다. 사용자 애플리케이션은 폴링(poll)하여 읽을 패킷이나 예외 이벤트가 있는지 확인하고 패킷을 보낼 수 있는지 여부도 확인할 수 있다. 예외 이벤트가 있는 경우, 애플리케이션은 ioctl을 호출하여 이벤트를 가져올 수 있다. 또한, ioctl은 프레임 속도, 디바이스 주소와 채널 주소를 구성하는 인터페이스를 제공한다.
4.7.3 Software Operation
MLB 드라이버는 애플리케이션에 대한 일반적인 인터페이스를 제공한다.
- Packet read(읽기)/write(쓰기) - BLOCK과 NONBLOCK Packet I/O 모드가 지원된다. 한 번에 하나의 패킷만 읽거나 쓸 수 있다. 최소 읽기 길이는 수신된 패킷 길이보다 크거나 같아야 하며, 쓰기 길이는 1024바이트보다 짧아야 한다.
- Polling(폴링) - MLB 드라이버는 세 가지 상태를 폴링하는 폴링 인터페이스를 제공한다. 애플리케이션은 select를 사용하여 현재 I/O 상태를 가져올 수 있다:
- 읽을 수 있는 패킷이 있다. (읽기 위한 준비)
- 드라이버가 다음 패킷을 보낼 준비다 되어 있다. (쓰기 위한 준비)
- 예외 이벤트가 발생했다. (읽기 위한 준비)
- ioctl - MLB 드라이버는 아래 ioctl을 제공한다:
MLB_SET_FPS
인수 타입 : unsigned int
프레임 속도를 설정한다. 인수는 256, 512 또는 1024 이여야 한다.
MLB_GET_VER
인수 타입 : unsigned long
i.MX35에서 기본 값인 0x02000202를 MLB 디바이스 모듈 버전에서 가져온다.
MLB_SET_DEVADDR
인수 타입 : unsigned char
시스템 채널 MlbScan 커맨드에서 사용하는 MLB 디바이스 주소를 설정한다.
MLB_CHAN_SETADDR
인수 타입 : unsigned int
해당 채널 주소 [8:1] 비트를 설정한다. 이 ioctl은 tx와 rx 채널 주소를 결합한다. 인수 형식은 tx_ca[8:1] << 16 | rx_ca[8:1] 와 같다.
MLB_CHAN_STARTUP
송신과 수신에 해당하는 타입의 채널을 시작(startup)한다.
MLB_CHAN_SHUTDOWN
해당하는 타입의 채널을 종료(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 Source 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