황당한 경험인데

대충 makefile은 다음과 같았다



DRVNAME = ietest

obj-m += $(DRVNAME).o

$(DRVNAME)-objs += test_code.o  

...



딱히 오류가 날 껀덕지가 없는데 오류가 나더라

나중에 해결했는데 원인은 바로

DRVNAME = ietest 뒤에 공백이 한 칸 있더라 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

'devel > etc' 카테고리의 다른 글

4차 산업 우리나라가 준비해야 할 많은 것들  (0) 2017.04.03
perror - Bad file descriptor  (0) 2017.03.30
odroid c2 gpio ioctl controll  (0) 2016.11.22
git 예시  (0) 2016.11.16
Ubuntu 14.04.3 LTS server 에 gui 최소 설치하기  (0) 2016.11.07
Posted by 쵸코케키

odroid c2 gpio ioctl controll

설명

/dev/gpiomem
/dev/gpioctrl
이라는 녀석이 있습니다

hardkernel이라는 회사에서 만든 드라이버구요
devicetree를 보시면 아시겠지만 0xc8834000 gpio base address부터 4096바이트 만큼 제어를 합니다

gpiomem은 mmap하셔서 직접 컨트롤 하고 싶을 때 사용하시면 되구요
gpioctrl은 ioctl로 레지스터를 r/w를 하시면 됩니다

드라이버 소스는 drivers/hardkernel/odroid-gpioctrl.c, odroid-gpiomem.c 구요
보통 gpioctrl을 많이 쓸 일이 있을 것으로 예상 됩니다
기본 permission이 udev룰에 의해 666(rw_rw_rw)이니 /dev/mem처럼 따로 권한 주는 일은 안 하셔도 됩니다


사용 방법

open 하시고 ioctl 호출하셔서

#define GPIOCTRL_IOCGREG        _IOR('g', 1, struct gpioctrl_iocreg)
#define GPIOCTRL_IOCWREG        _IOW('g', 2, struct gpioctrl_iocreg)

read 할 때는 GPIOCTRL_IOCGREG
write 할 때는 GPIOCTRL_IOCWREG

struct gpioctrl_iocreg {
 __u32 reg_offset;
 __u32 reg_data;
 __u32 bit_mask;
 __u32 bit_data;
};

이 자료형 쓰시면 될꺼 같구요

각 멤버 설명
reg_offset
gpio base로부터 접근하고 싶은 register offset(input/output/pulldown/up 등을 컨트롤)
reg_data
읽거나 쓴 후의 값, register 값이 통째로 들어가 있다
bit_mask
register 중 몇 번째 gpio를 컨트롤 하고 싶은가. 예를 들면 GPIOX 21번은 1<<21
bit_data
bit가 1이나 0이냐

참조 코드 - wiring pi, gpio_status_c2.c


사용 예시

read #1. gpiox_6의 input/output mode 확인
기본 gpiox_6(234) - input, 0, pull down

#define BIT(nr) (1U << (nr))
struct gpioctrl_iocreg ioc_reg;
ioc_reg.reg_offset = 0x118;    //FSEL
ioc_reg.bit_mask = BIT(6);
ioctl(fd, GPIOCTRL_IOCGREG, &ioc_reg);
printf("%s", ioc_reg.bit_data ? "input" : "output");

read #2. gpiox_21의 값 확인
기본 gpiox_21(249) - input, 1, pull up

ioc_reg.reg_offset = 0x11a;  
//input 값 확인하는 register 참고로 output 값 r/w하는 register는 별도로 있다
ioc_reg.bit_mask = BIT(21);
ioctl(fd, GPIOCTRL_IOCGREG, &ioc_reg);
printf("%u", ioc_reg.bit_data);

1 나올 것이다


write #1. gpiox_6을 input -> output으로 변경

ioc_reg.reg_offset = 0x118;
ioc_reg.bit_mask = BIT(6);
ioc_reg.bit_data = 0; //output!!
ioctl(fd, GPIOCTRL_IOCWREG, &ioc_reg);    //GREG가 아니라 WREG다

LED 같은거 연결해두면 불 켜진다


write #2. gpiox_6의 output 값을 0으로 변경

ioc_reg.reg_offset = 0x119;        //output r/w 하는 register
ioc_reg.bit_mask = BIT(6);
ioc_reg.bit_data = 0;
ioctl(fd, GPIOCTRL_IOCWREG, &ioc_reg);

LED 불 꺼진다


write #3. gpiox_6를 input mode, pull up상태로 변경

ioc_reg.reg_offset = 0x13e;        //pull up/down 컨트롤 register
ioc_reg.bit_mask = BIT(6);
ioc_reg.bit_data = 1;            // up
ioctl(fd, GPIOCTRL_IOCWREG, &ioc_reg);

이걸 활용하면 input mode, 기본 상태 pull down으로도 만들 수 있습니다


간단 정리

input mode 세팅
FSEL register 0x118 에서 해당 gpio offset을 1로 세팅

output mode 세팅
FSEL register에서 해당 gpio offset을 0으로 세팅

input mode 값 읽기
input register 0x11a에서

output mode 값 r/w
output register 0x119에서

pull up/down
0x13e 에서 up(1)/down(0) write


상세 정리

S905 amlogic rev 1.1.4 문서 23.4 Register Description
표를 참조해서 계산해보면 driver code와 동일함을 알 수 있다
예시 FSEL(OEN) 0x18
0xc8834400 + 0x18*4 (pdf) == 0xc8834000 + 0x118<<2 (code)


기타

이렇게 설정을 한다고 해서 device driver에서 interrupt handler를 돌릴 수 있는 것은 아닙니다
아마 gpio interrupt edge 설정을 해야할텐데 저는 잘 안되네요
시도하실 분들은 24.3 Register Description을 참조하시기 바랍니다
저의 경우는 ioremap으로 맵하고 readl로 읽으면 panic이 뜨더군요
대부분의 경우 sysfs를 활용해 poll 함수로 값 변화를 사용해 thread로 탐지하든지 하시면 되리라 생각합니다
저 같이 그 이하 레벨에서 뭔가를 하고 싶은 분들은 ㅠㅜ

Posted by 쵸코케키

2016. 11. 16. 14:13 devel/etc

git 예시


Quick setup — if you’ve done this kind of thing before

We recommend every repository include a READMELICENSE, and .gitignore.





…or create a new repository on the command line

echo "# weird_while" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/chocokeki/weird_while.git
git push -u origin master


…or push an existing repository from the command line

git remote add origin https://github.com/chocokeki/weird_while.git
git push -u origin master


Posted by 쵸코케키


cat /etc/os-release

하면 버전이 나옵니다


apt-get install --no-install-recommends ubuntu-desktop


이후 부팅할 때 cli(text) 모드로 진입하게 바꾸고 싶을 경우


vi /etc/default/grub

GRUB_CMDLINE_LINUX="text" 로 수정


그 다음 update-grub



.

.

.


회사 관리자가 멍청해서 80번 포트를 막아버림

그걸 풀려면 윈도우 보안 프로그램을 설치해야 하는데 리눅스에서 그게 될리가......

리눅스 서버 ip만 포트 풀어주면 안되요? -> 푸는 순간 엄청난 공격이 들어온다고 함, 해결할 생각을 안 함


80번 포트를 쳐 막을 생각을 하지 말고 회사 네트웤 보안 장비를 좋은거로 사시라구요


보안 프로그램 너무 강력해서 문서파일 열면 컴퓨터 순간 심장마비 걸림

안드로이드 스튜디오랑 같이 돌리면 컴퓨터가 자주 멎는다

게다가 리부팅 시키면 100%의 확률로 윈도우 10 블루 스크린(윈도우10 미지원ㅋ)


apt, git 다 못 씀ㅋ

리눅스가 뭔지는 알려나 의심이 간다

Posted by 쵸코케키

Android Studio 2.2.2


com.example.helloworld 상태에서 개발하고 나중에 바꿀 경우


1. 잦은 백업이 필수, 빠른 컴퓨터 역시 필수, 각 단계마다 스튜됴 껐다 킨 다음 빌드, 실행 테스트(반드시 실행까지), 백업


2. 프로젝트 디렉토리 이름을 변경한다 -> 한~~ 참 걸린다 gradle이 빌드 다시 하기 땜시

(탐색기 가서 바꾸라는 소리)


3. example -> 이게 패키지 이름 이거부터 변경하는게 좋다



좌측 browser에서 ProjectFiles로 보이면 Android로 변경하고 




톱니바퀴 열어서 Compact Empty Middle Packages 체크 해제





그 다음 shift + f6 눌러서 refactor rename, 아래에 진짜 할까요? 나오면 Do refactor

다 한 다음 빌드에서 ok 떨어지면 껐다가 킨 다음 실행해야 실행 된다

캐쉬 땜에 엉뚱한 오류 나니까 다시 실행(그냥 실행 되면 땡큐고)



4. application 이름 변경하기 전에 먼저 activity 이름부터 바꾸자(바꾸기 싫으면 안 바꿔도 되는데 보통 HelloWorld 이런식으로 되어있을 것이다)



Rename을 하도록 한다

java를 모르니 뭐라 설명해야할지를 모르겠는데

메인 public class? 를 수정




5. 마지막으로 application 이름 수정


ndk의 경우 패키지 이름이랑 어플리케이션 이름이 바뀌면 jni쪽 코드를 수동으로 수정해야 한다

ctrl + shift + f가 큰 도움이 될 것이다



만약 하다가 layout 오류 뿜어내고 하면 그냥 4번부터 다시하는게 좋다

이 작업이 안드로이드 스튜디오 버전이 바뀌면서 조금씩 달라지는 것 같기는 하다


근데 가장 큰 문제가 요즘 얇은 노트북인  U시리즈 cpu로는 도저히 작업을 할 수가 없다ㅎㅎㅎ CPU가 터진다

i7이고 뭐고간에 소용이 음따 워낙 느려서리






Posted by 쵸코케키

http://kilobaser.com/blog/2014-07-28-beaglebone-black-devicetreeoverlay-generator

Posted by 쵸코케키

This file is not part of the project. Please include it in the appropriate build file (build.gradle, CMakeLists.txt or Android.mk etc.) and sync the project


Android Studio 2.2.2 인데 단순하게 프로젝트에 c랑 h 파일을 New 메뉴를 통해 생성했는데

개발툴이 이놈들이 무슨 파일인지 아예 인지를 못 한다

게다가 일부 파일은 방금 추가한 C 파일 자체가 있는지 없는지 찾지를 못해 Project Files browser에 나타나지 않는다


Sync Now를 해도 전혀 소용이 없고 아예 linking 할 때 못 찾는다


->

CMakeLists.txt에 직접 수동으로 c 파일들을 써줘야 한다


cmake_minimum_required(VERSION 3.4.1)

add_library(i2c_test SHARED
i2c_core.c
i2c_func.c
i2c_test.c)

# Include libraries needed for i2c-test lib
target_link_libraries(i2c_test
android
log)

굵은 글씨가 추가한 파일들

이걸 왜 수동으로 해야하는지 이해 불가

Posted by 쵸코케키






http://events.linuxfoundation.org/sites/events/files/slides/praesentation.pdf

Posted by 쵸코케키
carry = carry & 0xff + ((carry & 0xff00)>>8);

-> 이렇게 하면 오류난다

carry = (carry & 0xff) + ((carry & 0xff00)>>8);

-> 이렇게 먼저 괄호로 묶어줘야 오류 안 발생

Posted by 쵸코케키

2016. 7. 11. 15:25 devel/etc

volatile 극혐

이라고만 배웠는데 실제 volatile 키워드의 필요성을 느껴서 글로 남긴다


linux의 c에서는 못 느껴본 일이다

하지만 펌웨어 세상으로 오면 조금 다른거 같다



전역 변수

int state;


루프문

while(state == 0);


인터럽트 핸들러

extern int state;

state = 1;


이렇게 해놓고 돌렸는데 웬걸

인터럽트 핸들러가 정상적으로 실행되어 state 값이 변했음에도 불구하고

while문을 빠져나갈 생각을 하지 않는 것이었다


고민 좀 많이 하다가 든 생각이 바로 while문 안에서 암껏도 안해서 얘가 while(TRUE)로 최적화를 시켜버렸나보다

하는 생각이 들었다



-> 수정


volatile int state

extern volatile int state

로 바꾸니까 정상적으로 수행된다



volatile 을 쓸 일이 없으니까 이런 일도 겪는구나

좋은 링크가 있어 참고차 남긴다

https://salkuma.wordpress.com/2010/06/13/register-volatile-keyword/





기타

심심해서 더 테스트 좀 해봤다

인터럽트 핸들러 없애버리고 루프문에 의미없는 코드를 넣어보았다


전역변수

int state


루프문

int i;

while(state == 0){

i++;

}


실행하니까 당연한걸까 의미없는 구문으로 판단하고 루프문 자체를 없애버렸다 ㅋㅋ


Posted by 쵸코케키
이전버튼 1 2 3 4 5 ··· 7 이전버튼

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.5
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 31

최근에 올라온 글

최근에 달린 댓글

글 보관함