안녕하세요? 블루투스로 여러가지를 연동하게 되면서, GT-MINI 에 올려놓은 Armbian 을 여러가지 손대게 되네요.
그 과정 시작해 보겠습니다.
1. 블루투스 더미 장치 로딩 막기
hciconfig 를 입력해보면, UART 를 제외하고 SDIO로 블루투스 장치가 뜨는 경우가 있습니다.
SDIO는 실제로 감지되는 장치가 아니며, 빈 SDIO 채널에 디바이스가 probe 되는 것 같습니다.
그래서 SDIO 드라이버가 로딩되지 않도록 모듈을 제외시켜 주셔야 합니다.
음... 2개가 잡히는 사진은 아쉽게도 그때 백업한 내용이 없어서 첨부가 불가하네요.
root@aml:~# hciconfig
hci0: Type: Primary Bus: UART
BD Address: 6C:21:A2:ED:2C:10 ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING
RX bytes:7802858 acl:2093 sco:0 events:79753 errors:0
TX bytes:573461 acl:2042 sco:0 commands:36754 errors:0
실제로는 블루투스의 컨트롤은 UART 로 하게 되며, 음원 전송도 UART 로 하거나 PCM으로 따로 출력이 나가거나 칩마다 특성이 다릅니다.
상기에서 hci0 와 hci1 이 출력이 될 됩니다. 이때 SDIO 로 버스가 잡혀있는 것은 실제로 있는 장치가 아닙니다.
HA의 device tracker 를 지정할 때, 0번으로 지정했다가, 나중에 보면 0번과 1번이 뒤 바뀌어 있는 경우가 있어서 아예 드라이버를 아래와 같이 모듈 로딩을 막에서 로딩되지 않도록 설정합니다.
root@aml:/etc/modprobe.d# lsmod
Module Size Used by
algif_hash 16384 0
algif_skcipher 16384 0
af_alg 28672 2 algif_hash,algif_skcipher
fuse 131072 14
veth 28672 0
nf_conntrack_netlink 49152 0
xfrm_user 36864 1
xfrm_algo 16384 1 xfrm_user
br_netfilter 28672 0
bridge 208896 1 br_netfilter
stp 16384 1 bridge
llc 16384 2 bridge,stp
nft_chain_nat 16384 4
xt_nat 16384 3
xt_MASQUERADE 20480 4
nf_nat 53248 3 xt_nat,nft_chain_nat,xt_MASQUERADE
xt_addrtype 16384 2
nft_counter 16384 32
zram 36864 2
xt_tcpudp 20480 17
xt_state 16384 0
xt_conntrack 16384 9
nf_conntrack 176128 6 xt_conntrack,nf_nat,xt_state,xt_nat,nf_conntrack_netlink,xt_MASQUERADE
nf_defrag_ipv4 16384 1 nf_conntrack
nft_compat 20480 35
nf_tables 163840 126 nft_compat,nft_counter,nft_chain_nat
nfnetlink 16384 4 nft_compat,nf_conntrack_netlink,nf_tables
nls_ascii 16384 1
hci_uart 143360 0
btqca 20480 1 hci_uart
brcmfmac 376832 0
btrtl 24576 1 hci_uart
btbcm 16384 1 hci_uart
btintel 32768 1 hci_uart
brcmutil 24576 1 brcmfmac
bluetooth 598016 8 btrtl,btqca,btintel,hci_uart,btbcm
cdc_acm 36864 2
cfg80211 417792 1 brcmfmac
ecdh_generic 16384 1 bluetooth
ecc 32768 1 ecdh_generic
rfkill 36864 5 bluetooth,cfg80211
ir_nec_decoder 20480 0
meson_vdec 86016 0
v4l2_mem2mem 40960 1 meson_vdec
rc_x96max 16384 0
videobuf2_dma_contig 24576 1 meson_vdec
videobuf2_memops 20480 1 videobuf2_dma_contig
crct10dif_ce 16384 1
meson_ir 16384 0
videobuf2_v4l2 36864 2 meson_vdec,v4l2_mem2mem
rc_core 61440 4 rc_x96max,ir_nec_decoder,meson_ir
ao_cec_g12a 16384 0
snd_soc_meson_axg_sound_card 16384 0
videobuf2_common 61440 3 meson_vdec,videobuf2_v4l2,v4l2_mem2mem
videodev 233472 4 meson_vdec,videobuf2_v4l2,videobuf2_common,v4l2_mem2mem
snd_soc_meson_g12a_tohdmitx 20480 1
mc 61440 4 videodev,videobuf2_v4l2,videobuf2_common,v4l2_mem2mem
snd_soc_meson_axg_spdifout 20480 2
dw_hdmi_cec 16384 0
meson_rng 16384 0
sch_fq 20480 3
tcp_bbr 20480 157
ip_tables 28672 0
x_tables 40960 8 xt_conntrack,nft_compat,xt_state,xt_tcpudp,xt_addrtype,xt_nat,ip_tables,xt_MASQUERADE
ipv6 585728 235 bridge,br_netfilter
nf_defrag_ipv6 24576 2 nf_conntrack,ipv6
uas 24576 0
mdio_mux_meson_g12a 16384 0
rtc_meson_vrtc 20480 1
root@aml:/etc/modprobe.d# cat blacklist.conf
blacklist btsdio
btsdio 를 블랙 리스트에 넣습니다.
그리고 재부팅하시면 UART 버스의 블루투스 장치만 로딩이 될 것입니다.
2. 펌웨어 부재 해결하기
이는 안드로이드 펌웨어에서 추출한 부분입니다.
벤더 파티션에 있는 펌웨어를 가져와서 /lib/firmware/brcm 에 넣어주시면 됩니다.
실제로 이 펌웨어가 없어서 dmesg 를 확인하면 펌웨어 로딩에 실패했다고 로그가 나옵니다. 물론, 없어도 동작하는 데에는 문제가 없지만, 이 펌웨어를 쓰면 개선되는 부분이 있기 때문에 파일을 넣어 줍니다.
root@aml:/lib/firmware/brcm# ls
bcm4329.hcd brcmfmac43362-sdio.txt brcmfmac43456-sdio.bin
BCM4330B1.hcd brcmfmac4339-sdio.1CK.txt brcmfmac43456-sdio.txt
bcm4330.hcd brcmfmac4339-sdio.bin brcmfmac4356-sdio.bin
BCM43430A1.hcd brcmfmac4339-sdio.txt brcmfmac4356-sdio.clm_blob
bcm43438-sdio.hcd brcmfmac4339-sdio.ZP.txt brcmfmac4356-sdio-nanopi-m4v2.bin
BCM4345C0.hcd brcmfmac43430a0-sdio.bin brcmfmac4356-sdio-nanopi-m4v2.txt
BCM4345C5.hcd brcmfmac43430a0-sdio.txt brcmfmac4356-sdio.txt
brcmfmac4329-sdio.bin brcmfmac43430-sdio.bin brcmfmac4359-sdio.bin
brcmfmac4329-sdio.txt brcmfmac43430-sdio.txt brcmfmac4359-sdio.txt
brcmfmac4330-sdio.bin brcmfmac43455-sdio.bin brcmfmac-ap6330-sdio.bin
brcmfmac4330-sdio.txt brcmfmac43455-sdio.clm_blob brcmfmac-ap6330-sdio.txt
brcmfmac43362-sdio.bin brcmfmac43455-sdio.txt config.txt
명령으로는 하기와 같이 입력하시면 됩니다.
wget http://download.djjproject.com/amlogic/GTminiA/BCM4345C0.hcd
그리고 재부팅 후, dmesg 를 확인해 보면, 펌웨어 로드에 실패했다는 로그는 없을 것입니다.
3. HA 에서 직접 BT컨트롤하기
docker 컨테이너를 생성할 때 priviliged 옵션을 주고 생성합니다.
docker run -d --restart=always --privileged --name="hass" -e "TZ=Asia/Seoul" -v /opt/hass/config:/config --net=host homeassistant/home-assistant:stable
privileged 옵션을 주고 컨테이너를 생성하면 블투 컨트롤도 가능합니다.
4. yeelightbt 패키지 관련 최적화
yeelightbt 관련 명령이 계속적으로 실패하여 프로세스가 계속 대기 상태로 있는 경우가 있습니다.
파이썬 문법을 아예 모르는 상황이라 (차츰 공부를 해야할 것 같습니다.) ... 내부가 어떻게 구성되어 있는지 모르겠습니다.
전에 하기 글을 올려드린 적이 있는데요. 하기 부분이 재부팅 이후에는 제대로 동작하지 않는 문제가 있어서.. 하기와 같이 진행을 합니다.
Yeelight Besidelamp BT HA 연동 : https://blog.djjproject.com/680
일단은 부팅 이후에는 당연히 블루투스가 꺼짐 상태이기 때문에 hciconfig hci0 up 으로 켜주는 작업이 들어가야합니다.
그 뒤로는 yeelightbt scan 명령으로 한번 스캔을 돌려주면 그 뒤로는 작동이 매우 잘 되네요..
그래서 개인적으로 등록한 init.sh 파일을 아래와 같이 수정했습니다.
# bluetooth power on
sleep 60
docker exec hass hciconfig hci0 up
docker exec hass yeelightbt scan && yeelightbt scan && yeelightbt scan
docker exec hass rm -rf /config/yeelight.run
이후로는 문제를 겪지 못했습니다.
감사합니다. 혹시 블루투스 문제를 겪으시는 분들은 상기와 같은 방법을 쓰셔서 해결하시는데 도움이 되셨으면 좋겠습니다.
감사합니다.
-- 여담
추가적으로 컬러픽커를 통해서 세팅을 해보려고 하고 있는데 이게 참 어려운게 HA에서는 HSV 값으로 세팅을 하고 yeelightbt 모듈에서는 rgb 로 세팅을 합니다.
이 부분을 수정을 해야할 것 같은데 C++과 달리 파이썬은 생략된 부분이 많이 문법이 너무 특이한게 많아서 적응이 안되네요..
쉘 스크립트로 HSV --> RGB 컨버터 코드를 짤 수 있지만, C++ 로는 금방 짜는 코드를 꼭 Shell 스크립트로 작성해야하나...
혹은 C++ 값 커맨드 컨버터를 작성해서 넣어서 호출해서 사용해야하나 싶은데 .. 제일 효율적인 방법은 yeelightbt 를 수정하는 방법이 좋은데 아직 뾰족하게 답이 안보이네요...
맨날 C / C++ 만 하다보니 파이썬 문법이 적응이 잘 안됩니다. ㅠㅠ
'서버 > 리눅스 서버' 카테고리의 다른 글
CoreELEC Docker 사용하기 (우분투 컨테이너 설정) (0) | 2020.09.17 |
---|---|
쉘 자동 완성 fuzzy finder (0) | 2020.08.30 |
rclone crypt 마운트를 plexdrive 를 통해서 마운트 하기 (0) | 2020.08.13 |
Beelink GT-MINI A USB로 마이그레이션 하기 (0) | 2020.07.11 |
Let's Encrypt 웹 루트 인증을 통해 인증서 생성하기 (0) | 2020.06.03 |
댓글