| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- CAN 필터
- fsl-sai
- 임베디드
- 리눅스 CAN
- i.MX8MP
- EILSEQ
- 임베디드 오디오
- 리눅스 커널
- bus-off
- xHCI
- can_filter
- 44.1kHz
- SocketCAN
- restart-ms
- HAL_Delay
- Azure RTOS
- TIM17
- 커스텀 보드
- can-utils
- CAN FD
- assigned-clocks
- 오디오 클럭
- error-passive
- 타임베이스
- EASRC
- vcan
- PTN5150A
- 하드웨어 디버깅
- 임베디드 리눅스
- CC 로직
- Today
- Total
목록Linux (9)
임베디드 일기장
i.MX8MP 보드에서 48kHz 음원은 잘 나오는데 44.1kHz 음원을 재생하면 이런 에러와 함께 실패한다.fsl-sai 30c30000.sai: failed to derive required Tx rate: 1411200이 에러의 정체는 "44.1kHz용 비트클럭(BCLK) 1,411,200Hz를 지금 물려 있는 클럭 소스로는 정수 분주로 만들 수 없다"는 것이다. 이 글은 왜 그런지(오디오의 두 클럭 패밀리), 어떻게 고치는지(assigned-clocks), 그리고 그 과정에서 헷갈리는 DT 속성들(clocks vs assigned-clocks)의 관계를 정리한다.1. 배경: 오디오에는 서로 섞이지 않는 두 클럭 패밀리가 있다디지털 오디오의 샘플레이트는 두 가문으로 나뉜다.48k 가문: 8k,..
CAN 컨트롤러는 에러가 누적되면 스스로 버스에서 물러난다. 이 보호 메커니즘(error confinement)의 종착역이 bus-off 상태인데, 여기 들어가면 송수신이 완전히 멈추고 저절로 돌아오지 않는다(설정하지 않는 한). 이 글은 리눅스에서 bus-off를 진단하고 복구하는 방법을 정리하고, 후반부에서는 CAN 하드웨어가 없는 개발 PC에서 상위 스택을 테스트하는 vcan 환경 구성을 다룬다.1. CAN 에러 상태머신 복습CAN 노드는 TEC/REC(송신/수신 에러 카운터)에 따라 세 상태를 오간다.Error-Active (정상: 에러 프레임을 dominant로 송출 가능) ↓ 카운터 > 127Error-Passive (경고: 통신은 되지만 에러 프레임이 recessive, 송신 후 대..
i.MX8MP 커스텀 보드의 Type-C 포트에 USB 3.0 메모리를 꽂았는데 속도가 안 나온다. 이럴 때 첫 질문은 "3.0을 시도하다가 실패한 건가, 아예 시도조차 안 한 건가"이다. 이 둘은 원인 영역이 완전히 다르기 때문이다. 이 글은 dmesg 로그에서 그 답을 읽는 법과, 커스텀 Type-C 설계에서 SuperSpeed가 증발하는 하드웨어 경로(CC 로직, 크로스바 스위치)를 추적한 과정이다.환경SoC: i.MX8MP (xHCI, USB 3.0 지원)Type-C 구성: PTN5150A (CC 로직 IC) + SS 신호 크로스바 스위치증상: USB 3.2 Gen1 메모리가 항상 480Mbps(High-Speed)로만 열거1. dmesg 판독: "시도 후 실패"와 "시도 없음"은 로그가 다르다실..
리눅스에서 CAN FD를 쓰다 보면 세 군데서 순서대로 막힌다. 인터페이스 설정, write()가 뱉는 정체불명의 에러, 그리고 수신 필터. 세 가지를 실전 순서대로 정리한다. 환경은 i.MX8MP(FlexCAN)이지만 SocketCAN 공통 내용이라 다른 컨트롤러에도 그대로 적용된다.1. 인터페이스 설정: 중재 구간과 데이터 구간은 따로 논다CAN FD는 한 프레임 안에서 속도가 두 번 바뀐다. 중재(arbitration) 구간은 클래식 CAN과 호환되는 속도로, 데이터 구간은 BRS 비트가 켜져 있으면 고속으로 달린다. 그래서 설정도 두 벌이다.ip link set can0 downip link set can0 type can \ bitrate 500000 sample-point 0.875 \..
RS-485 half-duplex 버스에서 Modbus RTU를 돌리려면 트랜시버의 DE/RE 핀을 제때 토글해야 한다. 송신 중에는 DE=1, 송신이 끝나는 즉시 DE=0으로 내려서 슬레이브 응답을 받을 준비를 해야 한다. 이 타이밍을 누가 책임지느냐가 이 글의 주제다. 결론부터: libmodbus에 맡기지 말고 커널 드라이버에 위임하라. 환경보드: i.MX8MP (imx-uart 드라이버)라이브러리: libmodbus (Modbus RTU 마스터)트랜시버: DE/RE 제어가 필요한 일반적인 RS-485 트랜시버1. 문제: 누가 DE를 토글하나구성은 이렇다.[i.MX8MP UART] ──TX/RX──> [RS-485 트랜시버] ──> [버스] RTS ────> DE/REl..
리눅스 ISO-TP(ISO 15765-2) 소켓으로 CAN 통신을 하다 보면 고개를 갸웃하게 되는 에러를 만난다. read()가 실패했는데 errno가 ECOMM, 즉 "Communication error on send"다. 나는 읽기를 했는데 왜 "송신 에러"가 나오나? 커널 소스 net/can/isotp.c를 열어 read 경로를 아무리 뒤져도 ECOMM을 리턴하는 코드가 안 보인다. 이 글은 그 미스터리의 답인 소켓 계층의 sk_err 에러 전파 메커니즘을 정리한 것이다. 환경커널: 5.15.71 (i.MX8MP), net/can/isotp.c구성: 한 물리 CAN 버스 위에 다채널 ISO-TP 세션1. ECOMM은 read가 만든 에러가 아니다isotp.c의 errno 매핑을 정리하면 이렇다.TX..
운영체제(Operating System)란 컴퓨팅 시스템을 구성하는 하드웨어 자원을 효율적으로 관리하고 공정하게 제공하는 경영인이라고 할 수 있다. 이 운영체제에 대해 체계를 잡는 것이 굉장히 힘들었는데 나름대로의 생각을 정리해보고자 한다. 일반적인 PC의 시스템을 생각해보자.CPU, RAM, HDD or SSD, I/O 장치(마우스, 키보드, 모니터, 프린터) 등으로 이루어져 있다.이들 하드웨어 자원들을 문제집을 풀기 위해 책상에 앉아있는 사람에 빗대어 보자. -CPU : 사람의 두뇌-RAM : 책상-HDD or SSD : 책장-I/O : 연필-프로그램 : 책 사람이 책상에 앉는다.(컴퓨터 on)책장(HDD or SSD)에서 풀 문제집(프로그램)을 책상(RAM)으로 가져온다.(프로그램 -> 프로세스)머..
임베디드 리눅스 보드에 LTE 모뎀을 붙이는 작업은 "USB 꽂으면 되겠지"로 시작해서 커널 컨피그까지 내려가는 경우가 많다. 이번 글은 i.MX8MP(Yocto kirkstone) 커스텀 보드에 TX700 LTE 모뎀(Qualcomm MDM9207 기반)을 RNDIS로 연결하면서 겪은 과정을 정리한 것이다. 환경보드: i.MX8MP 커스텀 보드BSP: Yocto kirkstone, 커널 5.15.x모뎀: TX700 (Qualcomm MDM9207, LTE Cat.1급)연결: USB1. 증상: lsusb에 모뎀이 없다전원 넣고 lsusb를 치면 이것만 보였다.Bus 001 Device 001: ID 1d6b:0002 # 루트 허브Bus 001 Device 002: ID 0424:2514 # SMS..