오늘 오랜만에 nRF51822의 부트로더 개발을 다시 하게 되었다.

그런데 젠장 인간의 두뇌는 역시 한계가 있나보다 2년전에 분명히 잘되었던 것 같은데

SDK에서 부트로더 예제를 컴파일하고 플래시에 다운로드하니까 신호도 안뜨네 ^^;;


몇 시간 삽질 한 끝에 내가 만든 Custom PCB는 32khz 크리스탈이 없다. 기본적으로 SDK는 하드웨어에 32khz 크리스탈이 있다고 보고 만들었다. 만약 제품 개발을 위해 만든 nRF51822 보드에서 신호조차 뜨지 않는다면 아래 코드를 체크해야 한다.

이 부분에서 맨날 까먹고 고생한다. ㅎㅎㅎ


main.c에서


static void ble_stack_init(bool init_softdevice){...} 라는 함수가 있는데 BLE 스택을 초기화한다. 여기에서 아래처럼 32khz 크리스탈을 초기화 한다. 기본적으로 외부에 달려있는 크리스탈을 초기화 하도록 되어 있다.


    SOFTDEVICE_HANDLER_APPSH_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, true);


 이것을 칩 내부 RC 오실레이터로 변경한다. 적당히 Calibration 구간을 선택한다. 타이밍 이슈만 없다면 아래 플래그로 세팅하면 정상적으로 BLE 신호가 뜬다.
        SOFTDEVICE_HANDLER_APPSH_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_8000MS_CALIBRATION,true);


그리고 나서 빌드 후 테스트를 하는데 또 문제가 발생했다. 이번엔 플래시 다운로드에서 문제 였다.

부트로더는 Keil 개발환경 자체의 다운로드 방식을 사용하지 않고 외부 nrfjprog.exe를 사용해서 다운로드 하도록 되어 있다. 


그런데 잘 안된다. success라고 떴는데도 안되네...보드를 on/off해도 안되어서 사용법을 찾아 봤다.


그냥 리눅스 처럼 콘솔을 열어서 바이너리 경로로 찾아가서 직접 커맨드를 사용한다.


먼저 소프트디바이스를 플래시 다운로드한다. 이 때 칩을 모두 지우고 프로그래밍하도록 --chiperase를 한다.


nrfjprog.exe --family NRF51 --program s110_nrf51_8.0.0_softdevice.hex --chiperase --verify


부트로더를 다운로드한다.

nrfjprog.exe --family NRF51 --program bootloader.hex --verify


리셋한다. 리셋을 안하면 동작하지 않는다.


nrfjprog.exe --family NRF51 --reset


아래 포럼을 참고했다.

https://devzone.nordicsemi.com/question/56373/flashing-softdevice-with-the-latest-nrfjprog/



ubuntu 16.04를 설치하고 몇일 쓰는데 갑자기 디스크가 벌써 만땅이라고 표시되었다.

30기가 정도 Rootfs에 할당했는데 충분할 텐데... 그래서 확인해봤더니

/var/log에 kern.log syslog가 10기가 이상 차 있었다. ㅠㅠ


일단 커널로그의 원인은 아래 에러가 계속해서 쌓이는건데

[ 8480.388485] ACPI Error: Method parse/execution failed [\_GPE._L6F] (Node ffff8808544e04b0), AE_NOT_FOUND (20150930/psparse-542)
[ 8480.388487] ACPI Exception: AE_NOT_FOUND, while evaluating GPE method [_L6F]


이건 아래와 같이 해결할 수 있다고 한다.

http://jhshi.me/2015/11/14/acpi-error-method-parseexecution-failed-_gpe_l6f/index.html


보니까 나처럼 스카이레이크에 우분투 깔아서 쓰고 있었다. 음...최신 하드웨어라서 아직 준비가 안되었나 보다...^^;;



부팅할 때마다 시작 스크립트에서 지울까 하다가 검색해보니 해외에 다른 유저는 이렇게 해결했다.


http://askubuntu.com/questions/515146/very-large-log-files-what-should-i-do




I installed Ubuntu 16.04 today and I noticed the same problem. However, I fixed this with busybox-syslogd. Yup! I've Just installed that package and problem has been solved. :)

$ sudo apt-get install busybox-syslogd

After installing that package, reset syslog and kern.log:

sudo tee /var/log/syslog /var/log/kern.log </dev/null

I hope this simple solution is useful to other people around.


일단 이렇게 해놓고 지켜보고 있는 중이다.




우분투 14.04 64비트에서 리나로 ARM툴체인 gcc-linaro-arm-linux-gnueabihf을 쓰기 위해 설치해야 하는 패키지들.


sudo apt-get install lib32stdc++ lib32z1 lib32ncurses5 lib32bz2-1.0


위의 패키지들은 64비트 리눅스에서 32비트 파일을 실행하기 위해 필요하다. 리나로 툴체인은 64비트 실행 버전이 없어서 상기 패키지들을 설치해야한다.


단 32비트 우분투라면 설치할 필요없다.^^


Ubuntu 14.04를 설치하고 git 서버를 구축한다.

GitHub와 같이 회원관리 기능에 커뮤니티 기능까지 원한다면 GitLab같은 오픈소스 git 서버를 구축하길 추천한다.


간단하게 git 만으로도 서버를 구축할 수 있다 git 명령어 중에 daemon 명령어를 쓰면 git 서비스가 돌아간다. 최대 동시접속자는 많지 않다 적어도 10~20명정도는 된다고 한다.

이 정도면 개인 git 서버로 충분하다 여기에 git 소스에서 제공하는 gitweb라는 CGI 형식으로 제공하는 simple web UI도 제공한다.

gitweb을 이용하면 위에서 구축한 git daemon과 함께 http 프로토콜의 웹 서비스도 제공한다. gitweb은 kernel.org에서 제공하는 커널 소스의 웹UI로 이미 제공하고 있다.


1. git daemon 서버 구축


일단 git이 없다면 git을 설치한다.

$ sudo apt-get install git

$ git --version

으로 확인 가능하다.


git이라는 계정을 만든다. SSH키를 이용할 계획이라면 git의 패스워드를 지정할 필요는 없다. 여기서는 그냥 패스워드까지 만든다.

$ sudo useradd git

$ sudo passwd git

패스워드를 지정한다.


그리고 저장소를 쓸 디렉토리를 만든다. 여기서는 /home 경로에 만든다.

$ sudo -u git -H mkdir /home/git

$ cd /home/git

$ sudo -u git -H mkdir test.git

$ cd test.git

$ sudo -u git -H git init --bare

Initialized empty Git repository in /home/git/repositories/test.git/


$ sudo -u git -H git daemon --verbose --export-all --base-path=/home/git --enable=receive-pack &


데몬을 돌렸으니 실제 다른 경로로 가서 git에 업로드할 프로젝트를 만들자.

$ cd ~/work

$ mkdir test

$ cd test

$ git init

Initialized empty Git repository in /home/simon-linux/work/test/.git/

이런 식으로 실제로 내용물이 있어야 commit을 할 수 있다.

$ touch readme.txt

$ echo "This is test" > readme.txt

$ git add .

$ git commit -m "initial commit"

방금 구축한 git 서버 URL을 origin으로 등록한다.

$ git remote add origin git@localhost:/home/git/test.git

$ git push -u origin master

The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is b3:8a:ac:1f:00:70:eb:80:6b:e9:eb:8e:fe:3b:e9:d0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Counting objects: 3, done.
Writing objects: 100% (3/3), 212 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@localhost:/home/git/project.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.


2. gitweb 구축하기

아래 사이트를 참고했다.

http://blog.daum.net/junek69/37

웹서버와 gitweb을 설치한다.

$ sudo apt-get install apache2 gitweb

$ sudo cp /etc/apache2/conf.d/gitweb /etc/apache2/sites-available/gitweb.conf

$ sudo ln  -s /etc/apache2/sites-available/gitweb.conf /etc/apache2/sites-enabled/gitweb.conf


$ sudo vi /etc/apache2/sites-available/gitweb.conf

기존의 내용은 모두 지우고 아래 내용을 붙여넣기 한다.

Alias /git /usr/share/gitweb


<Directory /usr/share/gitweb>

  Options +FollowSymLinks +ExecCGI +SymLinksIfOwnerMatch

  AllowOverride All

  order allow,deny

  Allow from all

  AddHandler cgi-script .cgi

  DirectoryIndex gitweb.cgi

</Directory>

Alias 뒤의 git이 접속 경로가 된다. 예를 들어 http://localhost/git 이렇게 접속하면 된다.


$ sudo vi /etc/gitweb.conf

아래 변수값을 1에서 구축한 git 저장소 위치로 수정한다.

--> $projectroot = "/home/git";


$ sudo vi /usr/share/gitweb/gitweb.cgi

열어서 git 명령어의 위치와 git 저장소 위치를 업데이트한다.

# core git executable to use
# this can just be "git" if your webserver has a sensible PATH
our $GIT = "/usr/bin/git";

# absolute fs-path which will be prepended to the project path
#our $projectroot = "/pub/scm";
our $projectroot = "/git/";

.....

그리고 가장 중요한 아파치2에서 CGI 실행 모듈을 활성화한다. 이게 안되면 그냥 웹브라우저에서 gitweb.cgi의 소스만 출력된다.

$ sudo a2enmod cgi
$ sudo service apache2 restart


참고사이트

http://askubuntu.com/questions/403067/cgi-bin-not-working


자 이제 아래 주소로 접속해보자

http://localhost/git

혹은 http://localhost/git/test.git 과 같은 개별 git저장소를 지정한다.







아래 사이트를 참고했다. 초보가 따라하기에 굉장히 자세히 캡쳐화면으로 설명해놓았다.

https://rbgeek.wordpress.com/2012/05/01/svn-server-on-ubuntu-12-04-lts-with-web-access/

  

내가 따라한 명령어는 다음과 같다.

$  sudo apt-get install -y subversion libapache2-svn apache2

그리고 저장소 디렉토리를 만든다.

$  sudo mkdir /home/svn

사용자 계정을 생성한다. 일단 이건 저장소 디렉토리 권한 세팅뒤에 해도 된다.

$  sudo htpasswd -cm /etc/apache2/dav_svn.passwd simon

주의할점은 새로 생성할 때만 -c 옵션을 넣는다. 뒤에 새로 유저를 추가할 때는 -m만 넣는다. -c를 넣으면 패스워드 파일이 다 지워진다.

$  cd /home/svn/

SVN 저장소 생성한다.

$  sudo svnadmin create test_repo

여기서 부터는 저장소 디렉토리 권한 설정이다. 웹에서 접근가능하도록 www-data 그룹 권한을 부여한다.

$  sudo chown -R www-data:www-data /home/svn

이제는 아파치 모듈인 DAV 속성을 수정한다.

$  suvo vi /etc/apache2/mods-enabled/dav_svn.conf
아래와 같이 수정한다.
여러개의 저장소를 관리하려면 아래와 같이 사용하면 된다.
반드시 SVNListParentPath On 옵션을 추가한다.
그러면 저장소 최상단 디렉토리부터 웹에서 보여진다. 만약 하나의 저장소만 한다면
SVNParentPath대신 SVNPath를 한다.

<Location /svn>

DAV svn

SVNParentPath /home/svn

SVNListParentPath On #여러개의 저장소를 웹서비스 하려면 반드시 추가

AuthType Basic

AuthName "Subversion Repository"

AuthUserFile /etc/apache2/dav_svn.passwd

Require valid-user

</Location>

재시작하면 끝이다.

$ sudo service apache2 restart

이제 다른 PC에서 접근해보자.

sVN설치한 우분투 PC가 192.168.0.103이라면

http://192.168.0.103/svn 으로 웹브라우저 주소창에 넣으면 된다.

우분투 14.04 server에서 패키지 설치를 위해서 apt-get install을 했는데 에러가 났다.

Err http://kr.archive.ubuntu.com/ubuntu/ trusty/main liberror-perl all 0.17-1.1

  Could not resolve 'kr.archive.ubuntu.com'


뭔가 패키지 업데이트를 다시하면 될 것 같아서  apt-get update를 했는데 동일한 에러였다.
simon@data-server:~$ sudo apt-get update --fix-missing
Err http://kr.archive.ubuntu.com trusty InRelease

Err http://kr.archive.ubuntu.com trusty-updates InRelease

Err http://kr.archive.ubuntu.com trusty-backports InRelease
....

아...서버 설치한지 하루밖에 안되었는데 어젠 잘되었는데 왜그럴까해서 구글링 해보니 name server등록이 안되어서 생기는 증상이었다.

테스트 해보니 정말 아래 URL이 해석이 안되는것이다.
simon@data-server:~$ ping www.naver.com
ping: unknown host www.naver.com
simon@data-server:~$ ping daum.net
ping: unknown host daum.net
simon@data-server:~$ ping google.co.kr
ping: unknown host google.co.kr

그래서 익숙한 방식?으로 /etc/resolv.conf를 수정하려고 열어보니 아래처럼 수정하지 말라고 한다. 자동으로 생성되는 파일이란다. 12.04까지는 그냥 수정했는데 ^^;;
~$ sudo vi /etc/resolv.conf

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

다시 구글링 시작...ㅎㅎ

해결책을 찾았다.

http://unix.stackexchange.com/questions/128220/how-do-i-set-my-dns-when-resolv-conf-is-being-overwritten

해결 방법은
$ sudo vim /etc/resolvconf/resolv.conf.d/base

Then put your nameserver list in like so:

nameserver 8.8.8.8
nameserver 8.8.4.4

Finally update resolvconf:

$ sudo resolvconf -u


이렇게 하면 해결이 된다.

resolvconf를 업데이트 하면 아까 /etc/resolv.conf파일이 아래처럼 자동으로 갱신된다.

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)

#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

nameserver 8.8.8.8

nameserver 8.8.4.4

~



우분투 14.04를 설치하면 기본적으로 커널 3.19가 설치되어 있다.

최신 하드웨어를 가진 머신이라면 커널 4.2로 업그레이드하는 것이 유리하다.

어떤 무선랜카드는 드라이버가 아예 커널 3.19이상은 로딩도 안된다.

설치하는 방법은 아래와 같다.

일단 현재 커널 버전은 아래와 같다.

simon@simon-server:~$ uname -a

Linux simon-server 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux


그리고 아래 3개의 패키지를 설치한다.

linux-image-4.2.0-27-generic -> 진짜 커널 바이너리

linux-image-extra-4.2.0-27-generic -> 각종 동적 디바이스 드라이버와 같은 모듈

linux-headers-4.2.0-27-generic -> /usr/src에 저장되는 커널 소스, 모듈 컴파일에 필수.

simon@simon-server:~$ sudo apt-get install linux-image-4.2.0-27-generic linux-image-extra-4.2.0-27-generic linux-headers-4.2.0-27-generic

.....


Generating grub configuration file ...

Found linux image: /boot/vmlinuz-4.2.0-27-generic

Found initrd image: /boot/initrd.img-4.2.0-27-generic

Found linux image: /boot/vmlinuz-3.19.0-25-generic

Found initrd image: /boot/initrd.img-3.19.0-25-generic

Found memtest86+ image: /boot/memtest86+.elf

Found memtest86+ image: /boot/memtest86+.bin

Found Windows 7 (loader) on /dev/sdb1

done

----------------------------
위와 같이  grup세팅까지 잘 마무리되었다는 메시지가 나오면 성공적으로 설치된 것이다.
혹시 grup 세팅이 제대로 안될 수도 있으니 아래 와 같이 grup.cfg를 확인한다.
simon@simon-server:~$ sudo vi /boot/grub/grub.cfg

파일이 길기 때문에 Linux 키워드로 검색해보면 기존 3.19 커널이 새로 설치한 4.2보다 뒤에 있으면 된다.

169         menuentry 'Ubuntu, with Linux 4.2.0-27-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-27-generic-recovery-0e4e9952-fcfd-40df-822d-245b3b2b5ae2' {
170                 recordfail
171                 load_video
....
확실히 뒤에 있다.ㅎㅎ

186         menuentry 'Ubuntu, 그리고 Linux 3.19.0-25-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19.0-25-generic-advanced-0e4e9952-fcfd-40df-822d-245b3b2b5ae2' {
187                 recordfail
188                 load_video


이제 재부팅을 해서 진짜 4.2버전으로 부팅이 되는지 확인한다.

simon@simon-server:~$ uname -a

Linux simon-server 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

무사히 4.2로 업그레이드가 되었다.
커널을 좀 보실 줄 아시는 분은 dmesg로 별다른 에러가 없는지도 확인하면 좋다.
imon@simon-server:~$ dmesg



우분투&민트 커널 업그레이드

민트도 우분투의 브랜치 배포판 중에 하나이기 때문에 동일하다. 어짜피 뿌리는 데비안계열이니...


1. 공식 메인라인 이용방법
https://wiki.ubuntu.com/Kernel/MainlineBuilds

mkdir v3.5.4-quantal
cd v3.5.4-quantal
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.5.4-quantal/linux-headers-3.5.4-030504_3.5.4-030504.201209142010_all.deb

-32비트의 경우-
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.5.4-quantal/linux-headers-3.5.4-030504-generic_3.5.4-030504.201209142010_i386.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.5.4-quantal/linux-image-3.5.4-030504-generic_3.5.4-030504.201209142010_i386.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.5.4-quantal/linux-image-extra-3.5.4-030504-generic_3.5.4-030504.201209142010_i386.deb

-64비트의 경우-
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.5.4-quantal/linux-headers-3.5.4-030504-generic_3.5.4-030504.201209142010_amd64.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.5.4-quantal/linux-image-3.5.4-030504-generic_3.5.4-030504.201209142010_amd64.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.5.4-quantal/linux-image-extra-3.5.4-030504-generic_3.5.4-030504.201209142010_amd64.deb


sudo dpkg -i *.deb


2. 직접 빌드 방법.

https://wiki.ubuntu.com/KernelTeam/GitKernelBuild

직접 커널에서 받아서 빌드하는 방법이 있다.
먼저 필요한 패키지 설치부터...
sudo apt-get install git build-essential kernel-package fakeroot libncurses5-dev


git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

git checkout COMMIT

cp /boot/config-`uname -r` .config

여기서 '가 아니고 `이다. ~표시키에 있는`이다.

make oldconfig

yes '' | make oldconfig

make menuconfig

make clean

make -j `getconf _NPROCESSORS_ONLN` deb-pkg LOCALVERSION=-custom

Change to one directory level up (this is where the linux-image and linux-header .deb files were put):

cd ..

sudo dpkg -i *.deb

Now install the .deb files. In this example, the files are linux-image-2.6.24-rc5-custom_2.6.24-rc5-custom-10.00.Custom_i386.deb and linux-headers-2.6.24-rc5-custom_2.6.24-rc5-custom-10.00.Custom_i386.deb. You may receive warnings about '/lib/firmware/2.6.24-rc5-custom/' - this is expected and will only be problematic if the driver you are trying to test requires firmware:


You are now ready to boot into your new kernel. Just make sure you select the new kernel when you boot:

sudo reboot


sudo dpkg -i linux-image-2.6.24-rc5-custom_2.6.24-rc5-custom-10.00.Custom_i386.deb
sudo dpkg -i linux-headers-2.6.24-rc5-custom_2.6.24-rc5-custom-10.00.Custom_i386.deb

  INSTALL debian/headertmp/usr/include/uapi/ (0 file)
  INSTALL debian/headertmp/usr/include/asm/ (65 files)
hostname: Name or service not known
make[1]: *** [deb-pkg] Error 1
make: *** [deb-pkg] Error 2


이런에러가 나와서 /etc/hosts에 로컬호스트 이름 다른게 있어서 수정함.
127.0.1.1 simon-VB

그러면 해결됨.

 

3. make.kpkg를 이용하는 방법

이 방법은 아래 강좌를 보고 알게되었다. 그러나 아직 해보지는 않았다. 동일하게 가능할 것 같다.

http://forum.falinux.com/zbxe/index.php?_filter=search&mid=lecture_tip&search_target=title&search_keyword=%EC%BB%A4%EB%84%90&document_srl=864227

 

최근 AP 제조사들이 BSP(Board Support Package)를 배포할 때 Bitbake 기반의 Yocto나 OpenEmbedded를 많이 쓴다. 편리하기는 한데 기존의 Makefile에 익숙한 사람들은 생소해서 쉽지 않다. Makefile도 쉽지 않은데 ㅎㅎ^^;;

참고로 Yocto는 오픈소스 임베디드 빌드 시스템을 위한 프로젝트인데 아래 공식사이트가 있다.

https://www.yoctoproject.org/

OpenEmbedded 역시 비슷하게 오픈소스 임베디드 빌드 시스템이다. 

http://www.openembedded.org/wiki/Main_Page

그런데 둘의 차이를 잘 모르겠다. bitbake기반이라 비슷하다는 것 말고는...


암튼 아래 사이트에 나오는 데로 따라해보았다.

http://www.crashcourse.ca/wiki/index.php/BitBake_Tutorial

아래 bitbake로도 다양한 명령어를 줄 수 있다.

1. 환경 변수들을 리스팅한다.
bitbake -e core-image-minimal

2. 레시피의 버전을 리스팅한다.

bitbake -s

3. 소스를 미리 패치할 수 있다.
$ bitbake -c fetch core-image-minimal
$ bitbake -c fetchall core-image-minimal

4. 태스크들을 리스팅한다.
$ bitbake -c listtasks strace
$ bitbake -c listtasks virtual/kernel

그리고 여기만한 매뉴얼이 없는것 같다.
http://www.yoctoproject.org/docs/1.6/bitbake-user-manual/bitbake-user-manual.html


아래대로 재빨리 해본다.
http://cafe.naver.com/prosumernote/153723




로보티즈 OpenCM9.04을 리눅스에서 사용해볼까했는데 이런 다운로드를 할 수가 없다.^^;;;

그리고 포트 자체가 권한 문제로 툴에서 활성화가 안된다. 이런..

보통 리눅스에는 USB를 udev라는 데몬이 핫플러그를 지원하는데 이놈이 ttyACM장치를 등록하면서

권한을 rw-rw----로 해놓는다. 그래서 툴같이 Other 계정은 접근이 안된다.


이럴때는 udev rule을 이용해서 장치가 연결되면 항상 권한을 666으로 설정하도록 수정한다.

먼저 ttyACM이 어떤 정보를 담는지 아래 명령어로 확인한다.

$  udevadm info -a -n /dev/ttyACM0

SUBSYSTEM=="tty"

ATTRS{idVendor}=="fff1"
ATTRS{idProduct}=="ff48"

ATTRS{product}=="ROBOTIS Virtual COM Port"

...

$ sudo vi /etc/udev/rules.d/51-robotis.rules

히안하게 vid, pid를 넣고 하면 안된다. 아래처럼 하니깐 된다.
SUBSYSTEM=="tty", ATTRS{product}=="ROBOTIS Virtual COM Port", MODE="0666", SYMLINK+="robotis%n"


아래는 다시 리로드...
$  sudo udevadm control --reload-rules
$  sudo udevadm trigger

아래 명령이 제일 확실한 것 같다.
sudo /etc/init.d/udev restart

자 그리고 다시 확인해보라 권한이 666인지..

$  ls -al /dev/ttyACM0



+ Recent posts