티스토리 뷰
반응형
Jetson Nano J41 헤더
제어방식은 여러가지가 있음.
GPIO제어 라이브러리도 몇가지 있음
운영체제``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````이다 보니, 빠르게 단독제어하려면 드라이버 작성이 필요.
일반적으로 파일 입출력으로 제어 가능.
파일은 다음 위치에 있음
파일 open할때 flag
O_RDONLY: 파일을 읽기 전용으로 엽니다.
O_WRONLY: 파일을 쓰기 전용으로 엽니다.
O_RDWR: 파일을 읽기 및 쓰기용으로 엽니다.
O_CREAT: 파일이 존재하지 않으면 새로 생성합니다.
O_TRUNC: 파일을 열 때 기존 내용을 지웁니다.
O_APPEND: 파일을 열 때 파일 끝에 데이터를 추가합니다.
void GPIO_speed_test1()
{
int n=1000000;
while(n--)
{
GPIO78_H();
GPIO78_L();
//91us 정도, 약 11kHz
}
}
|
void GPIO_speed_test2()
{
int n=1000000;
while(n--)
{
GPIO78_H();
GPIO78_L();
GPIO78_H();
GPIO78_L();
GPIO78_H();
GPIO78_L();
GPIO78_H();
GPIO78_L();
GPIO78_H();
GPIO78_L();
GPIO78_H();
GPIO78_L();
//60us 정도, 약 16.5kHz
//불필요한 코드 제거후 34us 정도, 약 29.8kHz }
}
|
#ifndef GPIO_h
#define GPIO_h
#include "../Lib/Lib.h"
//OUT
//void GPIO51_L();
//void GPIO51_H();
//IN
//extern byte1 GPIO51,GPIO51_old;
//int GPIO38_IN();
typedef struct
{
//IN
byte4 in77:1;
byte4 in77_old:1;
//OUT
byte4 out78:1;
}sGPIO;
extern sGPIO GPIO;
void GPIO_Open();
void GPIO_update();//IN은 읽고, OUT은 설정한다.
void GPIO_Close();
/*
int main()
{
//int n=1000;
int n=1;
GPIO_Open();
while(n--)
{
int a;
a=GPIO38_IN();
if(GPIO51_old!=a)
{
printf("GPIO38 상태: %d\n", a);
GPIO51_old=a;
}
GPIO51_H();
Sleep(500);
GPIO51_L();
Sleep(500);
}
GPIO_Close();
return 0;
}
*/
#endif//GPIO_h
|
#include "../Lib/Lib.h"
sGPIO GPIO;
extern char gpi_exporto_file[];//="/sys/class/gpio/export";
extern char gpi_unexporto_file[];//="/sys/class/gpio/unexport";
//OUT
char gpio78_value_file[]="/sys/class/gpio/gpio78/value";
char gpio78_direction_file[]="/sys/class/gpio/gpio78/direction";
void GPIO78_L()
{
//GPIO.out78=0;
//Log_puts("GPIO78_L()");
File_puts_no_rn(gpio78_value_file,"0");
}
void GPIO78_H()
{
//GPIO.out78=1;
//Log_puts("GPIO78_H()");
File_puts_no_rn(gpio78_value_file,"1");
}
//IN
char gpio77_value_file[]="/sys/class/gpio/gpio77/value";
char gpio77_direction_file[]="/sys/class/gpio/gpio77/direction";
int GPIO77_IN()
{
//Log_puts("GPIO77_IN()");
GPIO.in77=File_read_int(gpio77_value_file);
Log_puts_int("GPIO77_IN()",GPIO.in77);
return GPIO.in77;
}
void GPIO_Open()
{
Log_puts("GPIO_Open()");
//IN
_GPIO_Open("77",gpio77_direction_file,"in",gpio77_value_file,"1");
//OUT
_GPIO_Open("78",gpio78_direction_file,"out",gpio78_value_file,"0");
}
void GPIO_Close()
{
Log_puts("GPIO_Close()");
File_puts_no_rn(gpi_unexporto_file,"77");
File_puts_no_rn(gpi_unexporto_file,"78");
}
/*int main()
{
//int n=1000;
int n=1;
GPIO_Open();
while(n--)
{
int a;
a=GPIO77_IN();
if(GPIO51_old!=a)
{
printf("GPIO77 상태: %d\n", a);
GPIO51_old=a;
}
GPIO77_H();
Sleep(500);
GPIO77_L();
Sleep(500);
}
GPIO_Close();
return 0;
}
*/
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
int File_read(char *file,void *buf,int buf_len)
{
int len=0;
int f = open(file, O_RDONLY);
if (f == -1) {
perror("ERR:File_read");
Log_puts_str("file",file);
}
else
{
len=read(f, buf, buf_len);
if(len>0)
{
((char*)buf)[len]=0;
}
close(f);
}
//Log_puts_int("len36",len);
//Log_puts("---");
//Log_puts_str2("File_read2",file,buf);
//Log_puts("---");
//Log_puts_HEX("File_read3",buf,len);
return len;
}
int File_read_int(char *file){
char buf[100];
int value=0,len=File_read(file,buf,countof(buf));
if(len>0)
{
value=atoi(buf);
}
//Log_puts_int("File_read_int",value);
return value;
}
int File_write2(char *file,void *data,int len,void *data2,int len2)
{
int wlen=0;
int f;
//Log_puts_str("File_write2 file",file);
f = open(file, O_WRONLY);
//Log_puts_int("File_write2 f",f);
if (f == -1) {
perror("ERR:File_write2");
Log_puts_str("file",file);
}
else
{
if(data)if(len>0)
{
//Log_puts_int("len",len);
//Log_puts_str("data",(char*)data);
wlen+=write(f, data, len);
//Log_puts_int("data wlen1",wlen);
}
if(data2)if(len2>0)
{
//Log_puts_int("len2",len2);
//Log_puts_str("data2",(char*)data2);
wlen+=write(f, data2, len2);
//Log_puts_int("data2 wlen2",wlen);
}
close(f);
}
if(wlen<=0)
{
Log_puts_int("ERR:File_write2() wlen",wlen);
Log_puts_int("len",len);
Log_puts_int("len2",len2);
}
return wlen;
}
int File_write(char *file,void *data,int len)
{
return File_write2(file,data,len,0,0);
}
int File_write_str(char *file,char *s)
{
//Log_puts_str2("File_write_str",file,s);
return File_write2(file,s,strlen(s),0,0);
}
int File_puts_no_rn(char *file,char *s)
{
return File_write_str(file,s);
}
int File_puts(char *file,char *s)
{
char *rn="\r\n";
//Log_puts_str2("File_puts",file,s);
return File_write2(file,s,strlen(s),rn,strlen(rn));
}
int File_write_int(char *file,int value)
{
char buf[32];
itoa(value,buf,10);
return File_puts_no_rn(file,buf);
}
char gpi_exporto_file[]="/sys/class/gpio/export";
char gpi_unexporto_file[]="/sys/class/gpio/unexport";
int _GPIO_Open(char *gpio_no,//"51"
char *direction_file,//"/sys/class/gpio/gpio51/direction"
char *dir,//"in" or "out"
char *value_file,//"/sys/class/gpio/gpio38/value"
char *value)//"0" or "1"
{
int wlen;
char buf[64];
//Log_puts_str("_GPIO_Open",gpio_no);
wlen=File_puts_no_rn(gpi_exporto_file,gpio_no);
wlen+=File_puts_no_rn(direction_file,dir);
if(dir[0]=='o')//"out"인 경우에만 쓰기함
{
wlen+=File_puts_no_rn(value_file,value);
}
return wlen;
}
|
재부팅하고 몇번 다시 실행하니 동작이 안됨....
원인 : 프로그램 중단하여, GPIO_Close()가 안된듯함. 다음과 같 하여 정상동작함.
GPIO_Close(); if(GPIO_Open()) { .... |
반응형
'초보 우분투(리눅스)' 카테고리의 다른 글
우분투 - *.desktop 파일 (0) | 2024.03.02 |
---|---|
USB로 파일 복사 쉘스크립트 (1) | 2024.02.25 |
젯슨나노 UART2 통신 - 송신 깨지는 문제 (0) | 2024.02.25 |
안됨 - #include 오류가 검색되었습니다. includePath를 업데이트하세요. 이 변환 단위(/home/a/Desktop/xxxx/sample1.c)에는 물결선을 사용할 수 없습니다. (0) | 2024.02.25 |
우분투에서 exFAT USB인식하기 (1) | 2024.02.25 |