2024-01-20

Boost 1.75.0 설치

리눅스에 설치된 boost는 1.74.0 이 설치되어있고, 
log 라이브러리가 설치되어있지도 않다.
이것들을 포함하여 재빌드하여 설치해야, 보드의 환경과 동일하다.

mkdir boost
cd boost
tar xfz boost_1_75_0.tar.gz
cd boost_1_75_0/
./bootstrap.sh
./b2 --with-log
sudo ./b2 install
그냥 알아서 /usr/local/lib에 설치됨.
cmake에 알려줘야지
set(BOOST_ROOT "/usr/local/lib")

끝.

libcurl-7.75.0 설치하기.

크로스컴파일러 세트에 openssl-1.1.1o 가 설치되어있는데, 요즘은 openssl-3.0.x이다.
pc와 보드에서 동일한 소스코드로 동작이 가능하게 하기위함
1점대와 3점대는 함수가 변경됬기때문에 pc에 자동설치되어있는 3.0은 쓸수가 없다.
그리하여, 1.1.1을 추가로설치하고 cmake에게 위치를 알려줬다.
crypto 관련 함수를 쓰기시작하면서, curl 라이브러리를 libcrypto가 찾아쓰는데
libcrypo버전이 3점대인거라 충돌남.
그래서 1.1.1과 호환이 되는 보드에 설치된 libcurl-7.75.0 을 pc에도 추가설치한다.

그 방법은...
curl을 클론한다.

git clone -b curl-7_75_0 https://github.com/curl/curl.git
cd curl/
./buildconf
./configure
make -j32
sudo make install
ls /usr/local/lib

메인 CMakeLists.txt에 설치된 libcurl.so를 알려줘야한다.
set(CURL_LIBRARY "/usr/local/lib/libcurl.so") # OpenSSL이 설치된 디렉터리
find_package(CURL 7.75.0 REQUIRED)
include_directories(${CURL_INCLUDE_DIRS})



2024-01-17

데모나이즈

리눅스 app을 자동실행시켜놓으면
데몬으로 실행된다.
데몬이란, 
"터미널이 연결안된 상태로 백그라운드에서 실행된다." 로 이해하면 될듯하다.

데몬으로 콘솔에서 실행시키려면,
sudo apt install daemonize 
설치하자. 그리고

$ daemonize $(pwd)/s1app0 

조용히 데몬으로 실행된다.

try this.



2024-01-16

openssl 3.0 이 설치된시스템에 1.1.1 설치하기.

apt remove로 지웠다간, 크롬 firefox snapd등이 실행이안됨.
그래서 프로젝트 컴파일할때만 사용한다.

1. 빌드해야하므로 관련 프로그램 설치
sudo apt install -y build-essential checkinstall zlib1g-dev




2. 다운로드 (어디든 다운로드해도 됨.)

3. 압축풀고
tar xvfz openssl-1.1.1w.tar.gz

4. 아래 실행.
./config shared
make
make install

5. 확인
happycpu@happycpu-X1:~$ openssl version
OpenSSL 1.1.1w  11 Sep 2023

$ whereis openssl
openssl: /usr/bin/openssl /usr/local/bin/openssl /usr/include/openssl /usr/local/ssl/bin/openssl /usr/share/man/man1/openssl.1ssl.gz

여기 설치됨. 대충보면. 아래와같음. 즉 설치위치는  /usr/local/ssl/
$ ls /usr/local/ssl/
bin  certs  ct_log_list.cnf  ct_log_list.cnf.dist  include  lib  misc  openssl.cnf  openssl.cnf.dist  private  share

cmakelists.txt에 추가해줄것. 
set(OPENSSL_ROOT_DIR "/usr/local/ssl")
find_package(OpenSSL 1.1.1 REQUIRED)

이렇게하면, 1.1.1을 찾을것임.




2024-01-12

CAN통신 참고

장치 속성을 설정/가져오기 위한 Netlink 인터페이스 

CAN 장치는 netlink 인터페이스를 통해 구성되어야 합니다. 지원되는 netlink 메시지 유형은 "include/linux/can/netlink.h"에 정의되고 간략하게 설명되어 있습니다. IPROUTE2 유틸리티 제품군의 "ip" 프로그램에 대한 CAN 링크 지원이 가능하며 아래와 같이 사용할 수 있습니다.

CAN 장치 속성 설정:

$ ip link set can0 type can help  Usage: ip link set DEVICE type can      [ bitrate BITRATE [ sample-point SAMPLE-POINT] ] |      [ tq TQ prop-seg PROP_SEG phase-seg1 PHASE-SEG1        phase-seg2 PHASE-SEG2 [ sjw SJW ] ]        [ dbitrate BITRATE [ dsample-point SAMPLE-POINT] ] |      [ dtq TQ dprop-seg PROP_SEG dphase-seg1 PHASE-SEG1        dphase-seg2 PHASE-SEG2 [ dsjw SJW ] ]        [ loopback { on | off } ]      [ listen-only { on | off } ]      [ triple-sampling { on | off } ]      [ one-shot { on | off } ]      [ berr-reporting { on | off } ]      [ fd { on | off } ]      [ fd-non-iso { on | off } ]      [ presume-ack { on | off } ]      [ cc-len8-dlc { on | off } ]        [ restart-ms TIME-MS ]      [ restart ]        Where: BITRATE       := { 1..1000000 }             SAMPLE-POINT  := { 0.000..0.999 }             TQ            := { NUMBER }             PROP-SEG      := { 1..8 }             PHASE-SEG1    := { 1..8 }             PHASE-SEG2    := { 1..8 }             SJW           := { 1..4 }             RESTART-MS    := { 0 | NUMBER }  

CAN 장치 세부 정보 및 통계 표시:

$ ip -details -statistics link show can0  2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP qlen 10    link/can    can <TRIPLE-SAMPLING> state ERROR-ACTIVE restart-ms 100    bitrate 125000 sample_point 0.875    tq 125 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1    sja1000: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..64 brp-inc 1    clock 8000000    re-started bus-errors arbit-lost error-warn error-pass bus-off    41         17457      0          41         42         41    RX: bytes  packets  errors  dropped overrun mcast    140859     17608    17457   0       0       0    TX: bytes  packets  errors  dropped carrier collsns    861        112      0       41      0       0  

위 출력에 대한 추가 정보:

"<삼중 샘플링>"

선택한 CAN 컨트롤러 모드(LOOPBACK, LISTEN-ONLY 또는 TRIPLE-SAMPLING) 목록을 표시합니다.

"상태 오류-활성"

CAN 컨트롤러의 현재 상태: "ERROR-ACTIVE", "ERROR-WARNING", "ERROR-PASSIVE", "BUS-OFF" 또는 "STOPPED"

"다시 시작-ms 100"

자동 재시작 지연 시간. 0이 아닌 값으로 설정된 경우, 지정된 지연 시간(밀리초) 이후 버스 오프 조건이 발생하는 경우 CAN 컨트롤러의 재시작이 자동으로 트리거됩니다. 기본적으로는 꺼져 있습니다.

"비트 전송률 125000 샘플 포인트 0.875"

비트/초 단위의 실제 비트 전송률과 0.000..0.999 범위의 샘플 포인트를 표시합니다. 커널에서 비트 타이밍 매개변수 계산이 활성화된 경우(CONFIG_CAN_CALC_BITTIMING=y) "비트 전송률" 인수를 설정하여 비트 타이밍을 정의할 수 있습니다. 선택적으로 "샘플 포인트"를 지정할 수 있습니다. 기본적으로 CIA 권장 샘플 포인트를 가정하면 0.000입니다.

"tq 125 prop-seg 6 위상-seg1 7 위상-seg2 2 sjw 1"

ns 단위의 시간 할당량, 전파 세그먼트, 위상 버퍼 세그먼트 1 및 2, tq 단위의 동기화 점프 폭을 표시합니다. Bosch CAN 2.0 사양( http://www.semiconductors.bosch.de/pdf/can2spec.pdf 의 8장 참조)에서 제안한 대로 하드웨어 독립적 형식으로 CAN 비트 타이밍을 정의할 수 있습니다 .

"sja1000: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..64 brp-inc 1 클럭 8000000"

CAN 컨트롤러의 비트 타이밍 상수(여기서는 "sja1000")를 보여줍니다. 시간 세그먼트 1과 2의 최소값과 최대값, tq 단위의 동기화 점프 폭, 비트레이트 프리스케일러 및 CAN 시스템 클럭 주파수(Hz)입니다. 이러한 상수는 사용자 공간에서 사용자 정의(비표준) 비트 타이밍 계산 알고리즘에 사용될 수 있습니다.

"다시 시작된 버스 오류 중재 손실 오류 경고 오류 통과 버스 끄기"

재시작, 버스 및 중재 손실 오류 수를 표시하며 상태는 오류 경고, 오류 수동 및 버스 끄기 상태로 변경됩니다. RX 오버런 오류는 표준 네트워크 통계의 "오버런" 필드에 나열됩니다.

CAN 비트 타이밍 설정 

CAN 비트 타이밍 매개변수는 인수 "tq", "prop_seg", "phase_seg1", "phase_seg2" 및 "sjw"를 지정하는 Bosch CAN 2.0 사양에서 제안된 대로 항상 하드웨어 독립적인 형식으로 정의될 수 있습니다.

$ ip link set canX type can tq 125 prop-seg 6 \                              phase-seg1 7 phase-seg2 2 sjw 1  

커널 옵션 CONFIG_CAN_CALC_BITTIMING이 활성화된 경우 비트 전송률이 "bitrate" 인수로 지정되면 CIA 권장 CAN 비트 타이밍 매개변수가 계산됩니다.

$ ip link set canX type can bitrate 125000  

이는 표준 비트 전송률을 사용하는 가장 일반적인 CAN 컨트롤러에서는 제대로 작동하지만 이국적인 비트 전송률이나 CAN 시스템 클럭 주파수에서는 실패 할 수 있습니다. CONFIG_CAN_CALC_BITTIMING을 비활성화하면 일부 공간이 절약되고 사용자 공간 도구가 비트 타이밍 매개변수를 단독으로 결정하고 설정할 수 있습니다. 이러한 목적으로 CAN 컨트롤러 특정 비트 타이밍 상수를 사용할 수 있습니다. 다음 명령으로 나열됩니다.

$ ip -details link show can0  ...    sja1000: clock 8000000 tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..64 brp-inc 1  

CAN 네트워크 장치 시작 및 중지 

CAN 네트워크 장치는 "ifconfig canX up/down" 또는 "ip link set canX up/down" 명령을 사용하여 평소처럼 시작하거나 중지됩니다. 오류가 발생하기 쉬운 기본 설정을 피하기 위해 시작하기 전에 실제 CAN 장치에 대해 적절한 비트 타이밍 매개변수를 정의해야 한다는 점에 유의하십시오 .

$ ip link set canX up type can bitrate 125000  

CAN 버스에서 너무 많은 오류가 발생한 경우 장치는 "버스 꺼짐" 상태로 들어갈 수 있습니다. 그러면 더 이상 메시지가 수신되거나 전송되지 않습니다. 자동 버스 오프 복구는 "restart-ms"를 0이 아닌 값으로 설정하여 활성화할 수 있습니다. 예:

$ ip link set canX type can restart-ms 100  

또는 애플리케이션이 CAN 오류 메시지 프레임을 모니터링하여 "버스 꺼짐" 조건을 인식하고 적절한 경우 다음 명령을 사용하여 다시 시작할 수 있습니다.

$ ip link set canX type can restart  

다시 시작하면 CAN 오류 메시지 프레임도 생성됩니다( 네트워크 문제 알림 참조 ).


2024-01-04

gcc 10.3.0 설치

wget https://ftp.gnu.org/gnu/gcc/gcc-10.3.0/gcc-10.3.0.tar.gz

tar -zxvf gcc-10.3.0.tar.gz

sudo apt-get install build-essential
sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev

mkdir build-gcc
cd build-gcc

../gcc-10.3.0/configure --enable-languages=c,c++ --disable-multilib

make -j$(nproc)

sudo make install

gcc --version

2024-01-03

git으로 받아놓은 소스를 submodule까지 다 아카이브하기

git archive하면 소스로 받지만 서브모듈은 받을수 없다.

그래서 스택오버플로우 에서 찾았다.

git ls-files --recurse-submodules | tar caf ../src.tar.gz --xform s:^:prog/: --verbatim-files-from -T-

2023-11-29

u-boot가 이해하는 스크립트 한 문장

'gpio input GPIOB1; retval=$?; if test -e ${devtype} ${devnum}:${distro_bootpart} /overlays/overlays.txt; then env set fdt_addr ${fdt_addr_r}; if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr} ${fdtfile} && fdt addr ${fdt_addr} && fdt resize && setexpr fdtovaddr ${fdt_addr} + C0000 && load ${devtype} ${devnum}:${distro_bootpart} ${fdtovaddr} /overlays/overlays.txt && env import -t ${fdtovaddr} ${filesize} && test -n ${overlay}; then echo loaded overlay.txt: ${overlay}; for ov in ${overlay}; do if test "${ov}" = "lan9303_phy" && test ${retval} -eq 0; then load ${devtype} ${devnum}:${distro_bootpart} ${fdtovaddr} /overlays/${ov}.dtbo && fdt apply ${fdtovaddr}; else echo "DSA mode .. overlay skip"; fi; done; fi; fi
'

gpio명령으로 핀상태를 읽는다면,
첫회는 리턴값($?) 이 핀의 상태를 표시하고 반복 호출시 항상0이 된다.
즉, 핀상태가 1이라면, 한번은 1을 표시하고, 다음부터는0을 표시함.

무슨말이냐. -_-;;;

add lte interface

nmcli con add type ethernet ifname lte0 con-name lte0 ipv4.method auto ipv6.method disabled ipv4.never-default false

```bash
#!/bin/sh

# 사용법 표시 함수
usage() {
    echo "Usage: $0 -p PORT -f OUTPUT_FILE"
    exit 1
}

# 옵션 초기화
PORT=""
OUTPUT_FILE=""

# 옵션 파싱
while getopts "p:f:" opt; do
    case $opt in
        p)
            PORT="$OPTARG"
            ;;
        f)
            OUTPUT_FILE="$OPTARG"
            ;;
        \?)
            usage
            ;;
    esac
done

# 필수 옵션 확인
if [ -z "$PORT" ] || [ -z "$OUTPUT_FILE" ]; then
    usage
fi

# TCP 서버 실행
while true; do
    nc -l -p "$PORT" | while read -r line; do
        # 현재 시간을 포맷에 맞춰서 가져옴
        current_time=$(date "+%Y-%m-%d %H:%M:%S")

        # 수신한 패킷과 시간 정보를 출력
        echo "$current_time - $line"

        # 파일에 저장 (append 모드)
        echo "$current_time - $line" >> "$OUTPUT_FILE"
    done
done
```

이 스크립트는 무한 루프를 통해 계속해서 클라이언트의 연결을 수락하고, 연결이 끊어지면 다시 대기하여 새로운 연결을 수락합니다. 계속해서 수신된 패킷과 시간 정보를 출력하고 지정된 파일에 저장합니다. 이렇게 하면 `-k` 옵션을 사용할 수 없는 `nc`에서도 동작할 것입니다.

암호화 + base64 하고 쉘스크립트.

 #!/bin/bash # IV와 UserKey를 설정합니다 (아스키 문자열을 그대로 사용). IV="0123456789abcdef"  UserKey="0123456789abcdef" # IV와 UserKey를 16...