본문 바로가기
서버/리눅스 서버

Beelink GT-MINI A / Armbian 블루투스 최적화 (HomeAssistant)

by ㅋㅋ잠자 2020. 8. 22.
반응형

안녕하세요? 블루투스로 여러가지를 연동하게 되면서, 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++ 만 하다보니 파이썬 문법이 적응이 잘 안됩니다. ㅠㅠ 




반응형

댓글