From c97d73cf414ac7e310c39912ffe63b91343f3501 Mon Sep 17 00:00:00 2001 From: "Ju, Gyeong-min" Date: Mon, 28 Feb 2022 02:26:06 +0900 Subject: [PATCH] =?UTF-8?q?i2c=20=EC=9E=A5=EC=B9=98=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20&=20=EB=AC=B8=EC=84=9C=20=EB=B3=B4?= =?UTF-8?q?=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ju, Gyeong-min --- README.md | 91 +++++++-- am_joyin.c | 175 +++++++++++----- am_joyin.h | 13 +- am_joyin_cfg.c | 9 +- bcm2835.h | 384 ++++++++++++++++++------------------ bcm_peri.c | 20 +- build_cfg.h | 14 ++ device_74hc165.c | 30 +-- device_adc_ads1x15.c | 188 ++++++++++++------ device_adc_mcp300x.c | 112 ++++++++--- device_gpio_rpi2.c | 18 +- device_mcp23017.c | 95 +++++++-- device_mcp23s17.c | 158 ++++++++++++--- device_mux.c | 21 +- device_rotary_am_spinin.c | 154 +++++++++++++-- gpio_util.c | 18 +- i2c_util.c | 36 ++-- images/74hc165_pinouts.png | Bin 21732 -> 4801 bytes images/i2c-menu.png | Bin 0 -> 7594 bytes images/jstest.png | Bin 14320 -> 5938 bytes images/jstest_adc.png | Bin 13104 -> 6880 bytes images/mcp23017_circuit.png | Bin 66915 -> 11827 bytes images/mcp3008_circuit.jpg | Bin 0 -> 82643 bytes images/mcp300x_pinouts.png | Bin 33130 -> 7765 bytes images/param_ep_sep.png | Bin 7127 -> 4279 bytes images/param_sep.png | Bin 13238 -> 6652 bytes images/spi-menu.png | Bin 0 -> 7591 bytes indev_type.c | 2 + indev_type.h | 4 +- parse_util.h | 1 + spi_util.c | 50 ++--- 31 files changed, 1099 insertions(+), 494 deletions(-) create mode 100644 build_cfg.h create mode 100644 images/i2c-menu.png create mode 100644 images/mcp3008_circuit.jpg create mode 100644 images/spi-menu.png diff --git a/README.md b/README.md index f9a6f19..d8bead2 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ am_joyin은 라즈베리파이를 이용하여 아케이드 게임기를 제작 이는 기존에 제작 된 기기에 좀 더 수월하게 am_joyin을 적용하기 위한 목적도 있다. > ***NOTE:***\ -> mk_arcade_joystick_rpi 프로젝트 사이트 : https://github.com/recalbox/mk_arcade_joystick_rpi +> mk_arcade_joystick_rpi 프로젝트 사이트 : `https://github.com/recalbox/mk_arcade_joystick_rpi` **키워드 설명** @@ -113,8 +113,8 @@ sudo apt install -y --force-yes raspberrypi-kernel-headers #### wget 사용시 ```shell -wget https://github.com/amos42/am_joyin/releases/download/v0.3.1-beta01/am_joyin-0.3.1.deb -sudo dpkg -i am_joyin-0.3.1.deb +wget https://github.com/amos42/am_joyin/releases/download/v0.3.2/am_joyin-0.3.2.deb +sudo dpkg -i am_joyin-0.3.2.deb ``` #### git 사용시 @@ -129,8 +129,8 @@ git clone https://github.com/amos42/am_joyin.git ```shell cd am_joyin -./utils/makepackage.sh 0.3.1 -sudo dpkg -i build/am_joyin-0.3.1.deb +./utils/makepackage.sh 0.3.2 +sudo dpkg -i build/am_joyin-0.3.2.deb ``` ​ 이 과정까지 거치면 드라이버 설치가 1차적으로 완료된다. @@ -144,9 +144,13 @@ sudo modprobe am_joyin 만약 에러 메시지가 발생하지 않는다면 정상적으로 설치가 완료 된 것이다. -### 3. 드라이버 부팅시 자동 로딩 +### 3-1. 드라이버 부팅시 자동 로딩 (I2C를 사용하지 않을 경우) 다음은 전원을 켤 때마다 자동으로 am_joyin 드라이버가 로딩되도록 하기 위한 과정이다. +이를 위해서는 모듈 정의 파일에 am_joyin 모듈을 추가하면 된다. + +> ***NOTE:***\ +> 모듈 정의 파일 위치 : `/etc/modules-load.d/modules.conf` 드라이버 모듈 설정 파일을 연다. @@ -154,7 +158,7 @@ sudo modprobe am_joyin sudo nano /etc/modules-load.d/modules.conf ``` -마지막 라인에 다음 항목을 추가하고 ctrl-x를 눌러 저장하고 종료한다. +마지막 라인에 다음 항목을 추가한다. ``` . @@ -164,13 +168,72 @@ sudo nano /etc/modules-load.d/modules.conf am_joyin ``` +수정이 완료되었으면 ctrl-x를 눌러 파일을 저장하고 종료한다. + + +### 3-2. 드라이버 부팅시 자동 로딩 (I2C를 사용할 경우) + +만약 mcp23017, ads1x15, am_spinin과 같은 I2C 장치를 사용하고 있다면 조금 다른 방법을 사용해야 한다. + +이는 I2C 관련 서비스가 시작 된 이후에 am_joyin 모듈의 적재가 이루어지도록 모듈의 초기화 순서를 조정해 주어야 하기 때문이다. 이를 위해 모듈 정의 파일인 modules.conf가 아닌, rc.local 스크립트에 모듈을 적재하는 명령을 적어 주어야 한다. + +> ***NOTE:***\ +> I2C를 사용하지 않는 경우라도 modules.conf 대신 rc.local에 기술해도 된다. 2가지의 방법의 차이는 다음과 같다. +> * **modules.conf** : 다른 서비스들보다 먼저 모듈을 로드한다. +> * **rc.local** : 다른 모든 서비스들이 로드 된 이후에 모듈 적재를 시작한다. + +먼저 모듈 정의 파일인 modules.conf 다음의 2개 라인을 포함시킨다. + +``` +i2c-bcm2708 +i2c-dev +``` + +또다른 방법으로는 raspi-config 설정 유틸리티를 이용할 수도 있다. + +```bash +sudo raspi-config +``` + +![raspi-config i2c 설정](images/i2c-menu.png) + + + +그 다음에 rc.local에 modprobe 명령을 이용해 am_joyin 모듈을 포함시킨다. + +```bash +sudo nano /etc/rc.local +``` + +맨 마지막 줄의 exit 명령 전에 다음의 내용을 삽입한다. + +``` + . + . + . + +/sbin/modprobe am_joyin + + . + . + . +exit 0 +``` + +수정이 완료되었으면 ctrl-x를 눌러 파일을 저장하고 종료한다. + +> ***NOTE:***\ +> 간혹 해당 모듈들이 블럭되어 있는 경우가 있기에 블랙리스트도 확인해 보는 것이 좋다. +> 만약 사용하고자 하는 모듈이 블랙리스트에 포함되어 있다면 이를 찾아 제거해 놔야 한다.\ +> 블랙 리스트 파일 위치 : `/etc/modprobe.d/raspi-blacklist.conf` + ### 4. am_joyin 설정 다음으로는 드라이버 설정을 진행한다. > ***NOTE:***\ -> am_joyin 설정 파일 위치 : /etc/modprobe.d/am_joyin.conf +> am_joyin 설정 파일 위치 : `/etc/modprobe.d/am_joyin.conf` 텍스트 에디터로 설정 파일을 연다. @@ -197,6 +260,7 @@ options am_joyin device1="gpio;;0,default1" sudo reboot ``` + ### 6. 드라이버 동작 테스트 동작 테스트를 위해서는 jstest 유틸리티를 사용하면 된다. @@ -220,10 +284,10 @@ jstest /dev/input/js0 ### 7. 드라이버 삭제 -드라이버를 삭제하기 위해선 설치한 순서의 반대로 진행하면 된다. +더이상 am_joyin을 사용하지 않길 원하여 드라이버를 삭제하기 위해선 설치한 순서의 반대로 진행하면 된다. > 1. /etc/modprobe.d/am_joyin.conf 파일 삭제 -> 2. /etc/modules-load.d/modules.conf 목록에서 am_joyin 제거 +> 2. /etc/modules-load.d/modules.conf 혹은 /etc/rc.local 목록에서 am_joyin 제거 > 3. sudo dpkg -r am-joyin-dkms 명령으로 드라이버 패키지 삭제 @@ -295,7 +359,7 @@ am_joyin의 파라미터는 다음과 같다. ### driver 전역 설정 -> 1. timer_period : 타이머 주기. Hz 단위로 기술. default는 100Hz. (OS의 인터럽트 세팅에 따라 최대치가 결정된다.) +> 1. report_period : 키 체크 주기. Hz 단위로 기술. default는 100Hz. (최대값은 1000Hz이나, 현실적으로는 권장하지 않는다.) > 2. debug : 디버그 모드 여부. Log 출력 내용에 영향을 준다. ### buttonset 설정 @@ -473,10 +537,11 @@ sudo modprobe am_joyin device1="gpio;;0,custom,0,{4,0x1,-100},{17,0x1,100},{27,0 ![74HC165 Board](images/74hc165-board_02.jpg) -해당 보드의 회로도는 다음의 링크를 통해 얻을 수 있다. +해당 보드의 회로도 및 gerber 파일은 다음의 링크를 통해 얻을 수 있다. > - DIP 버전 : https://github.com/amos42/pcbs/tree/master/joystick-input > - SMD 버전 : https://github.com/amos42/pcbs/tree/master/joystick-input_smd +> - JST 커넥터 버전 : https://github.com/amos42/pcbs/tree/master/joystick-input_jst 74HC165 장치를 사용하기 위해서는 기본적으로 VCC, GND 및 Load, Clock, Data (=Q8) 핀을 라즈베리파이의 전원 및 GPIO 핀에 연결한다. @@ -636,7 +701,7 @@ MCP3008의 Pinout은 다음과 같다. 실제 MCP3008을 통해 아날로그 스틱을 라즈베리파이에 배선하기 위해서는 다음 배선도를 참고하면 된다. -![MCP3008 Circuit](images/mcp3008_circuit.png) +![MCP3008 Circuit](images/mcp3008_circuit.jpg) VDD와 VREF은 라즈베리파이의 3.3v에 연결하면 된다. CS 핀은 사용하고자 하는 SPI 채널에 맞춰 라즈베리파이의 SPI_CE0 혹은 SPI_CE1 중 하나에 연결하면 된다. diff --git a/am_joyin.c b/am_joyin.c index 4005161..31cd4a6 100644 --- a/am_joyin.c +++ b/am_joyin.c @@ -15,6 +15,7 @@ #define PRODUCT_VERSION (0x0100) #define DEVICE_NAME "Amos Joystick" +#include "build_cfg.h" #include #include @@ -23,10 +24,18 @@ #include #include #include +#if defined(USE_REPORT_TIMER) +#include +#else +#include +#endif MODULE_AUTHOR("Amos42"); MODULE_DESCRIPTION("GPIO and Multiplexer and 74HC165 amd MCP23017 Arcade Joystick Driver"); MODULE_LICENSE("GPL"); +#if !defined(USE_I2C_DIRECT) +MODULE_SOFTDEP("pre: i2c-dev"); +#endif /*============================================================*/ @@ -41,10 +50,16 @@ MODULE_LICENSE("GPL"); //#include "gpio_util.h" #include "gpio_util.c" + +#if defined(USE_I2C_DIRECT) //#include "i2c_util.h" #include "i2c_util.c" +#endif +#if defined(USE_SPI_DIRECT) //#include "spi_util.h" #include "spi_util.c" +#endif + //#include "parse_util.h" #include "parse_util.c" @@ -61,20 +76,25 @@ MODULE_LICENSE("GPL"); #include "device_rotary_am_spinin.c" +#if defined(USE_REPORT_TIMER) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0) #define HAVE_TIMER_SETUP #endif +#endif -#define DEFAULT_REFRESH_TIME (HZ/100) +#define DEFAULT_REPORT_PERIOD (100) +#if defined(USE_REPORT_TIMER) +#define DEFAULT_REFRESH_TIME (HZ / DEFAULT_REPORT_PERIOD) +#endif static am_joyin_data_t *a_input; -static void initButtonConfig(struct input_dev *indev, input_buttonset_data_t *buttonset_cfg, int button_count) +static void init_button_config(struct input_dev *indev, input_buttonset_data_t *buttonset_cfg, int button_count, int endpoint_type) { int i; - + if (button_count > buttonset_cfg->button_count) { button_count = buttonset_cfg->button_count; } @@ -83,7 +103,9 @@ static void initButtonConfig(struct input_dev *indev, input_buttonset_data_t *bu input_button_data_t *btn = &buttonset_cfg->button_data[i]; unsigned int code = btn->button_code; if (code < ABS_MAX) { - input_set_abs_params(indev, code, btn->min_value, btn->max_value, 0, 0); + if (endpoint_type == ENDPOINT_TYPE_JOYSTICK) { + input_set_abs_params(indev, code, btn->min_value, btn->max_value, 0, 0); + } } else { __set_bit(code, indev->keybit); } @@ -91,7 +113,7 @@ static void initButtonConfig(struct input_dev *indev, input_buttonset_data_t *bu } -static void reportInput(struct input_dev *indev, int endpoint_type, input_button_data_t *button_data, int button_count, int *data, int *cur_data) +static void report_input(struct input_dev *indev, int endpoint_type, input_button_data_t *button_data, int button_count, int *data, int *cur_data) { int i; BOOL is_changed = FALSE; @@ -119,9 +141,10 @@ static void reportInput(struct input_dev *indev, int endpoint_type, input_button } -#ifdef HAVE_TIMER_SETUP +#if defined(USE_REPORT_TIMER) +#if defined(HAVE_TIMER_SETUP) static void am_timer(struct timer_list *t) { - am_joyin_data_t *inp = from_timer(inp, t, timer); + am_joyin_data_t *inp = from_timer(inp, t, report_timer); #else static void am_timer(unsigned long private) { am_joyin_data_t *inp = (void *) private; @@ -143,13 +166,13 @@ static void am_timer(unsigned long private) { for (i = 0; i < inp->input_endpoint_count; i++) { input_endpoint_data_t *ep = &inp->endpoint_list[i]; - reportInput(ep->indev, ep->endpoint_type, ep->target_buttonset->button_data, ep->button_count, ep->report_button_state, ep->current_button_state); + report_input(ep->indev, ep->endpoint_type, ep->target_buttonset->button_data, ep->button_count, ep->report_button_state, ep->current_button_state); } // 만약 키체크 시간이 너무 길어서 다음 타이머 주기를 초과해 버리면 예외 처리 if (next_timer <= jiffies) { next_timer = jiffies + inp->timer_period; - + // 타이머 주기를 초과하는 횟수가 100회를 넘으면 타이머 중단 if (++inp->missing_timer_count > 100) { printk(KERN_ERR"Button check time is too late. Terminate the timer."); @@ -158,43 +181,105 @@ static void am_timer(unsigned long private) { } // 다음 타이머 트리거 - mod_timer(&inp->timer, next_timer); + mod_timer(&inp->report_timer, next_timer); } +#else +static int report_worker(void *data) { + am_joyin_data_t *inp = (am_joyin_data_t *)data; + unsigned int msleeptick = 1000 / inp->report_period; -static void initTimer(void) + while (!kthread_should_stop()) { + int i; + + for (i = 0; i < inp->input_endpoint_count; i++) { + input_endpoint_data_t *ep = &inp->endpoint_list[i]; + memset(ep->report_button_state, 0, sizeof(int) * MAX_INPUT_BUTTON_COUNT); + } + + for (i = 0; i < inp->input_device_count; i++) { + input_device_data_t *dev = &inp->device_list[i]; + if (dev != NULL && dev->is_opend && dev->device_type_desc != NULL) { + dev->device_type_desc->check_input_dev(dev); + } + } + + for (i = 0; i < inp->input_endpoint_count; i++) { + input_endpoint_data_t *ep = &inp->endpoint_list[i]; + report_input(ep->indev, ep->endpoint_type, ep->target_buttonset->button_data, ep->button_count, ep->report_button_state, ep->current_button_state); + } + + msleep(msleeptick); + } + + return 0; +} +#endif + +static void init_report_worker(void) { if (a_input != NULL) { -#ifdef HAVE_TIMER_SETUP - timer_setup(&a_input->timer, am_timer, 0); +#if defined(USE_REPORT_TIMER) +#if defined(HAVE_TIMER_SETUP) + timer_setup(&a_input->report_timer, am_timer, 0); +#else + setup_timer(&a_input->report_timer, am_timer, (long)a_input); +#endif #else - setup_timer(&a_input->timer, am_timer, (long)a_input); + a_input->report_task = kthread_create(report_worker, a_input, "am_joyin_report_task-%d", current->pid); #endif } } -static void startTimer(void) +static void start_report_worker(void) { if (a_input != NULL) { if (a_input->input_endpoint_count > 0 && a_input->input_device_count > 0){ - mod_timer(&a_input->timer, jiffies + a_input->timer_period); - //printk("start dev input timer"); +#if defined(USE_REPORT_TIMER) + mod_timer(&a_input->report_timer, jiffies + a_input->timer_period); +#else + if (a_input->report_task != NULL) { + wake_up_process(a_input->report_task); + } +#endif + //printk("start report worker.\n"); } } } -static void stopTimer(void) +static void stop_report_worker(void) { if (a_input != NULL) { - del_timer_sync(&a_input->timer); - //printk("stop dev input timer"); +#if defined(USE_REPORT_TIMER) + del_timer_sync(&a_input->report_timer); +#else + if (a_input->report_task != NULL) { + //sleep_on(a_input->report_task); + } +#endif + //printk("stop report worker.\n"); } } -static int __open_handler(struct input_dev *indev) +static void remove_report_worker(void) +{ + if (a_input != NULL) { +#if defined(USE_REPORT_TIMER) + del_timer_sync(&a_input->report_timer); +#else + if (a_input->report_task != NULL) { + kthread_stop(a_input->report_task); + a_input->report_task = NULL; + } +#endif + } +} + + +static int __open_handler(struct input_dev *indev) { input_endpoint_data_t *endpoint = input_get_drvdata(indev); int err; @@ -207,7 +292,7 @@ static int __open_handler(struct input_dev *indev) if (!endpoint->is_opened) { if (!a_input->used++) { - startTimer(); + start_report_worker(); } endpoint->is_opened = TRUE; @@ -220,7 +305,7 @@ static int __open_handler(struct input_dev *indev) } -static void __close_handler(struct input_dev *indev) +static void __close_handler(struct input_dev *indev) { input_endpoint_data_t *endpoint = input_get_drvdata(indev); @@ -230,7 +315,7 @@ static void __close_handler(struct input_dev *indev) if (endpoint->is_opened) { if (!--a_input->used) { - stopTimer(); + stop_report_worker(); } endpoint->is_opened = FALSE; @@ -259,16 +344,17 @@ static int __endpoint_register(input_endpoint_data_t *endpoint) if (endpoint->endpoint_type == ENDPOINT_TYPE_JOYSTICK) { indev->phys = "joystick"; indev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + init_button_config(indev, endpoint->target_buttonset, endpoint->button_count, endpoint->endpoint_type); } else if (endpoint->endpoint_type == ENDPOINT_TYPE_MOUSE) { indev->phys = "mouse"; indev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); - __set_bit(BTN_MOUSE, indev->keybit); __set_bit(REL_X, indev->relbit); __set_bit(REL_Y, indev->relbit); + __set_bit(BTN_MOUSE, indev->keybit); + __set_bit(BTN_RIGHT, indev->keybit); + __set_bit(BTN_MIDDLE, indev->keybit); } - initButtonConfig(indev, endpoint->target_buttonset, endpoint->button_count); - err = input_register_device(indev); if (err >= 0){ endpoint->indev = indev; @@ -287,14 +373,13 @@ static int __endpoint_unregister(input_endpoint_data_t *endpoint, BOOL force) if (endpoint->indev != NULL) { input_unregister_device(endpoint->indev); - input_free_device(endpoint->indev); endpoint->indev = NULL; } return err; } -static int __input_dev_register(input_device_data_t *device_data) +static int __input_dev_register(input_device_data_t *device_data) { int i; int err; @@ -308,7 +393,7 @@ static int __input_dev_register(input_device_data_t *device_data) } -static void __input_dev_unregister(input_device_data_t *device_data) +static void __input_dev_unregister(input_device_data_t *device_data) { int i; @@ -319,7 +404,7 @@ static void __input_dev_unregister(input_device_data_t *device_data) if (device_data->data != NULL) { kfree(device_data->data); device_data->data = NULL; - } + } } @@ -328,7 +413,7 @@ static void cleanup(void) if (a_input != NULL) { int i; - stopTimer(); + remove_report_worker(); // 장치들을 제거한다. for (i = 0; i < a_input->input_device_count; i++) { @@ -359,7 +444,7 @@ static int am_joyin_init(void) int i; int err; - //printk("init input dev....."); + printk("am_joyin init...\n"); // 커맨드 라인 파라미터 전처리 prepocess_params(); @@ -371,9 +456,10 @@ static int am_joyin_init(void) a_input = (am_joyin_data_t *)kzalloc(sizeof(am_joyin_data_t), GFP_KERNEL); - initTimer(); + init_report_worker(); - // 지원할 장치 목록들을 등록한다. + // 지원할 장치 목록들을 등록한다. + // 등록 가능한 최대 갯수는 MAX_INPUT_DEVICE_TYPE_DESC_COUNT 값을 따른다. register_input_device_for_gpio(&a_input->device_type_desc_list[a_input->input_device_type_desc_count++]); // 1 register_input_device_for_74hc165(&a_input->device_type_desc_list[a_input->input_device_type_desc_count++]); // 2 register_input_device_for_mcp23017(&a_input->device_type_desc_list[a_input->input_device_type_desc_count++]); // 3 @@ -388,15 +474,13 @@ static int am_joyin_init(void) // 커맨드 라인 파라미터들을 분석한다. parsing_device_config_params(a_input); -// err = -ENODEV; -// goto err_free_dev; - // 타이머 주기 설정. 비어 있으면 기본 타이머 주기 - if (a_input->timer_period > 0) { - a_input->timer_period = HZ / a_input->timer_period; - } else { - a_input->timer_period = DEFAULT_REFRESH_TIME; + if (a_input->report_period <= 0 || a_input->report_period > 1000) { + a_input->report_period = DEFAULT_REPORT_PERIOD; } +#if defined(USE_REPORT_TIMER) + a_input->timer_period = HZ / a_input->report_period; +#endif //printk("start register input dev..."); @@ -419,16 +503,17 @@ static int am_joyin_init(void) // 한개라도 endpoint가 등록되어 있다면 정상 종료 for (i = 0; i < a_input->input_endpoint_count; i++) { if (a_input->endpoint_list[i].indev != NULL) { + printk(KERN_INFO"success register input dev.\n"); return 0; } } // 단 한개도 enpoint가 없다면 에러 - printk(KERN_ERR"nothing input endpoint"); + printk(KERN_ERR"nothing input endpoint."); err = -ENODEV; err_free_dev: - printk(KERN_ERR"fail register input dev"); + printk(KERN_ERR"fail register input dev.\n"); cleanup(); return err; } @@ -437,7 +522,7 @@ static int am_joyin_init(void) static void am_joyin_exit(void) { cleanup(); - //printk("unregister input dev"); + printk(KERN_INFO"am_joyin exit.\n"); } diff --git a/am_joyin.h b/am_joyin.h index cb264a4..0925f94 100644 --- a/am_joyin.h +++ b/am_joyin.h @@ -6,6 +6,8 @@ #define __AM_JOYIN_H_ +#include "build_cfg.h" + #include #include @@ -13,8 +15,8 @@ typedef struct tag_am_joyin_data { - // 타이머 주기 - unsigned long timer_period; + // 키체크 주기 + unsigned long report_period; // 디버그 모드 BOOL is_debug; @@ -36,8 +38,13 @@ typedef struct tag_am_joyin_data { // 런타임 참조 정보 int used; +#if defined(USE_REPORT_TIMER) + unsigned long timer_period; + struct timer_list report_timer; +#else + struct task_struct* report_task; +#endif struct mutex mutex; - struct timer_list timer; int missing_timer_count; } am_joyin_data_t; diff --git a/am_joyin_cfg.c b/am_joyin_cfg.c index 85c7fb3..a60ba7e 100644 --- a/am_joyin_cfg.c +++ b/am_joyin_cfg.c @@ -2,6 +2,9 @@ * Copyright (C) 2021 Ju, Gyeong-min ********************************************************************************/ + +#include "build_cfg.h" + #include #include @@ -74,7 +77,7 @@ void /*__init*/ prepocess_params(void) } // device 모두 생략시, 기본 파라미터 세팅 - cnt = 0; + cnt = 0; for (i = 0; i < MAX_INPUT_DEVICE_COUNT; i++) { if (am_device_cfg[i] != NULL) @@ -147,7 +150,7 @@ void parsing_device_config_params(am_joyin_data_t* a_input) input_buttonset_data_t* target_buttonset; // default driver 설정 초기화 - a_input->timer_period = 0; + a_input->report_period = 0; a_input->is_debug = FALSE; // default buttonset 설정 초기화 @@ -178,7 +181,7 @@ void parsing_device_config_params(am_joyin_data_t* a_input) strcpy(szText, am_driver_cfg); pText = szText; - a_input->timer_period = parse_number(&pText, ",", 10, 0); + a_input->report_period = parse_number(&pText, ",", 10, 0); debug_p = strsep(&pText, ","); if (debug_p != NULL && strcmp(debug_p, "debug") == 0) { diff --git a/bcm2835.h b/bcm2835.h index c10e74d..f4367f3 100644 --- a/bcm2835.h +++ b/bcm2835.h @@ -1,63 +1,63 @@ /* bcm2835.h - + C and C++ support for Broadcom BCM 2835 as used in Raspberry Pi - + Author: Mike McCauley Copyright (C) 2011-2013 Mike McCauley $Id: bcm2835.h,v 1.26 2020/01/11 05:07:13 mikem Exp mikem $ */ /*! \mainpage C library for Broadcom BCM 2835 as used in Raspberry Pi - - This is a C library for Raspberry Pi (RPi). It provides access to + + This is a C library for Raspberry Pi (RPi). It provides access to GPIO and other IO functions on the Broadcom BCM 2835 chip, as used in the RaspberryPi, allowing access to the GPIO pins on the 26 pin IDE plug on the RPi board so you can control and interface with various external devices. - + It provides functions for reading digital inputs and setting digital outputs, using SPI and I2C, and for accessing the system timers. Pin event detection is supported by polling (interrupts are not supported). - Works on all versions up to and including RPI 4. + Works on all versions up to and including RPI 4. Works with all versions of Debian up to and including Debian Buster 10. - - It is C++ compatible, and installs as a header file and non-shared library on - any Linux-based distro (but clearly is no use except on Raspberry Pi or another board with + + It is C++ compatible, and installs as a header file and non-shared library on + any Linux-based distro (but clearly is no use except on Raspberry Pi or another board with BCM 2835). - - The version of the package that this documentation refers to can be downloaded + + The version of the package that this documentation refers to can be downloaded from http://www.airspayce.com/mikem/bcm2835/bcm2835-1.70.tar.gz You can find the latest version at http://www.airspayce.com/mikem/bcm2835 - + Several example programs are provided. - - Based on data in http://elinux.org/RPi_Low-level_peripherals and + + Based on data in http://elinux.org/RPi_Low-level_peripherals and http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf and http://www.scribd.com/doc/101830961/GPIO-Pads-Control2 - + You can also find online help and discussion at http://groups.google.com/group/bcm2835 - Please use that group for all questions and discussions on this topic. + Please use that group for all questions and discussions on this topic. Do not contact the author directly, unless it is to discuss commercial licensing. - Before asking a question or reporting a bug, please read + Before asking a question or reporting a bug, please read - http://en.wikipedia.org/wiki/Wikipedia:Reference_desk/How_to_ask_a_software_question - http://www.catb.org/esr/faqs/smart-questions.html - http://www.chiark.greenend.org.uk/~shgtatham/bugs.html - + Tested on debian6-19-04-2012, 2012-07-15-wheezy-raspbian, 2013-07-26-wheezy-raspbian and Occidentalisv01, 2016-02-09 Raspbian Jessie. - CAUTION: it has been observed that when detect enables such as bcm2835_gpio_len() + CAUTION: it has been observed that when detect enables such as bcm2835_gpio_len() are used and the pin is pulled LOW it can cause temporary hangs on 2012-07-15-wheezy-raspbian, 2013-07-26-wheezy-raspbian and Occidentalisv01. Reason for this is not yet determined, but we suspect that an interrupt handler is hitting a hard loop on those OSs. - If you must use bcm2835_gpio_len() and friends, make sure you disable the pins with - bcm2835_gpio_clr_len() and friends after use. - + If you must use bcm2835_gpio_len() and friends, make sure you disable the pins with + bcm2835_gpio_clr_len() and friends after use. + In order to compile this library, you may need to install: - libc6-dev - - libgcc-s-dev - - libstdc++-staticdev + - libgcc-s-dev + - libstdc++-staticdev \par Running as root @@ -77,18 +77,18 @@ bcm2835_spi_begin() and bcm2835_i2c_begin() will return false and all other non-gpio operations may fail silently or crash. - If your program needs acccess to /dev/mem but not as root, - and if you have the libcap-dev package installed on the target, + If your program needs acccess to /dev/mem but not as root, + and if you have the libcap-dev package installed on the target, you can compile this library to use libcap2 so that it tests whether the exceutable has the cap_sys_rawio capability, and therefore permission to access /dev/mem. - To enable this ability, uncomment the #define BCM2835_HAVE_LIBCAP in bcm2835.h or + To enable this ability, uncomment the #define BCM2835_HAVE_LIBCAP in bcm2835.h or -DBCM2835_HAVE_LIBCAP on your compiler command line. After your program has been compiled: \code sudo setcap cap_sys_rawio+ep *myprogname* \endcode - You also need to do these steps on the host once, to support libcap and not-root read/write access + You also need to do these steps on the host once, to support libcap and not-root read/write access to /dev/mem: 1. Install libcap support \code @@ -106,10 +106,10 @@ \endcode \par Installation - + This library consists of a single non-shared library and header file, which will be installed in the usual places by make install - + \code # download the latest version of the library, say bcm2835-1.xx.tar.gz, then: tar zxvf bcm2835-1.xx.tar.gz @@ -119,22 +119,22 @@ sudo make check sudo make install \endcode - + \par Physical Addresses - - The functions bcm2835_peri_read(), bcm2835_peri_write() and bcm2835_peri_set_bits() + + The functions bcm2835_peri_read(), bcm2835_peri_write() and bcm2835_peri_set_bits() are low level peripheral register access functions. They are designed to use physical addresses as described in section 1.2.3 ARM physical addresses - of the BCM2835 ARM Peripherals manual. + of the BCM2835 ARM Peripherals manual. Physical addresses range from 0x20000000 to 0x20FFFFFF for peripherals. The bus addresses for peripherals are set up to map onto the peripheral bus address range starting at 0x7E000000. Thus a peripheral advertised in the manual at bus address 0x7Ennnnnn is available at physical address 0x20nnnnnn. - - On RPI 2, the peripheral addresses are different and the bcm2835 library gets them + + On RPI 2, the peripheral addresses are different and the bcm2835 library gets them from reading /proc/device-tree/soc/ranges. This is only availble with recent versions of the kernel on RPI 2. - - After initialisation, the base address of the various peripheral + + After initialisation, the base address of the various peripheral registers are available with the following externals: bcm2835_gpio @@ -154,8 +154,8 @@ You should also ensure you are using the latest version of Linux. The library has been tested on RPI2 with 2015-02-16-raspbian-wheezy and ArchLinuxARM-rpi-2 as of 2015-03-29. - When device tree suport is enabled, the file /proc/device-tree/soc/ranges will appear in the file system, - and the bcm2835 module relies on its presence to correctly run on RPI2 (it is optional for RPI1). + When device tree suport is enabled, the file /proc/device-tree/soc/ranges will appear in the file system, + and the bcm2835 module relies on its presence to correctly run on RPI2 (it is optional for RPI1). Without device tree support enabled and the presence of this file, it will not work on RPI2. To enable device tree support: @@ -165,40 +165,40 @@ under Advanced Options - enable Device Tree Reboot. \endcode - + \par Pin Numbering - - The GPIO pin numbering as used by RPi is different to and inconsistent with the underlying + + The GPIO pin numbering as used by RPi is different to and inconsistent with the underlying BCM 2835 chip pin numbering. http://elinux.org/RPi_BCM2835_GPIOs - + RPi has a 26 pin IDE header that provides access to some of the GPIO pins on the BCM 2835, - as well as power and ground pins. Not all GPIO pins on the BCM 2835 are available on the + as well as power and ground pins. Not all GPIO pins on the BCM 2835 are available on the IDE header. - + RPi Version 2 also has a P5 connector with 4 GPIO pins, 5V, 3.3V and Gnd. - - The functions in this library are designed to be passed the BCM 2835 GPIO pin number and _not_ + + The functions in this library are designed to be passed the BCM 2835 GPIO pin number and _not_ the RPi pin number. There are symbolic definitions for each of the available pins that you should use for convenience. See \ref RPiGPIOPin. - + \par SPI Pins - - The bcm2835_spi_* functions allow you to control the BCM 2835 SPI0 interface, + + The bcm2835_spi_* functions allow you to control the BCM 2835 SPI0 interface, allowing you to send and received data by SPI (Serial Peripheral Interface). For more information about SPI, see http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus - - When bcm2835_spi_begin() is called it changes the bahaviour of the SPI interface pins from their - default GPIO behaviour in order to support SPI. While SPI is in use, you will not be able + + When bcm2835_spi_begin() is called it changes the bahaviour of the SPI interface pins from their + default GPIO behaviour in order to support SPI. While SPI is in use, you will not be able to control the state of the SPI pins through the usual bcm2835_spi_gpio_write(). When bcm2835_spi_end() is called, the SPI pins will all revert to inputs, and can then be configured and controled with the usual bcm2835_gpio_* calls. - + The Raspberry Pi GPIO pins used for SPI are: - + - P1-19 (MOSI) - - P1-21 (MISO) - - P1-23 (CLK) - - P1-24 (CE0) + - P1-21 (MISO) + - P1-23 (CLK) + - P1-24 (CE0) - P1-26 (CE1) Although it is possible to select high speeds for the SPI interface, up to 125MHz (see bcm2835_spi_setClockDivider()) @@ -218,22 +218,22 @@ - P1-36 (CE2) \par I2C Pins - + The bcm2835_i2c_* functions allow you to control the BCM 2835 BSC interface, allowing you to send and received data by I2C ("eye-squared cee"; generically referred to as "two-wire interface") . For more information about I?C, see http://en.wikipedia.org/wiki/I%C2%B2C - + The Raspberry Pi V2 GPIO pins used for I2C are: - + - P1-03 (SDA) - P1-05 (SLC) - + \par PWM - - The BCM2835 supports hardware PWM on a limited subset of GPIO pins. This bcm2835 library provides + + The BCM2835 supports hardware PWM on a limited subset of GPIO pins. This bcm2835 library provides functions for configuring and controlling PWM output on these pins. - - The BCM2835 contains 2 independent PWM channels (0 and 1), each of which be connnected to a limited subset of + + The BCM2835 contains 2 independent PWM channels (0 and 1), each of which be connnected to a limited subset of GPIO pins. The following GPIO pins may be connected to the following PWM channels (from section 9.5): \code GPIO PIN RPi pin PWM Channel ALT FUN @@ -251,29 +251,29 @@ Note carefully that current versions of the Raspberry Pi only expose one of these pins (GPIO 18 = RPi Pin 1-12) on the IO headers, and therefore this is the only IO pin on the RPi that can be used for PWM. Further it must be set to ALT FUN 5 to get PWM output. - - Both PWM channels are driven by the same PWM clock, whose clock dvider can be varied using + + Both PWM channels are driven by the same PWM clock, whose clock dvider can be varied using bcm2835_pwm_set_clock(). Each channel can be separately enabled with bcm2835_pwm_set_mode(). The average output of the PWM channel is determined by the ratio of DATA/RANGE for that channel. Use bcm2835_pwm_set_range() to set the range and bcm2835_pwm_set_data() to set the data in that ratio - - Each PWM channel can run in either Balanced or Mark-Space mode. In Balanced mode, the hardware + + Each PWM channel can run in either Balanced or Mark-Space mode. In Balanced mode, the hardware sends a combination of clock pulses that results in an overall DATA pulses per RANGE pulses. - In Mark-Space mode, the hardware sets the output HIGH for DATA clock pulses wide, followed by - LOW for RANGE-DATA clock pulses. - - The PWM clock can be set to control the PWM pulse widths. The PWM clock is derived from + In Mark-Space mode, the hardware sets the output HIGH for DATA clock pulses wide, followed by + LOW for RANGE-DATA clock pulses. + + The PWM clock can be set to control the PWM pulse widths. The PWM clock is derived from a 19.2MHz clock. You can set any divider, but some common ones are provided by the BCM2835_PWM_CLOCK_DIVIDER_* values of \ref bcm2835PWMClockDivider. - - For example, say you wanted to drive a DC motor with PWM at about 1kHz, - and control the speed in 1/1024 increments from - 0/1024 (stopped) through to 1024/1024 (full on). In that case you might set the + + For example, say you wanted to drive a DC motor with PWM at about 1kHz, + and control the speed in 1/1024 increments from + 0/1024 (stopped) through to 1024/1024 (full on). In that case you might set the clock divider to be 16, and the RANGE to 1024. The pulse repetition frequency will be 1.2MHz/1024 = 1171.875Hz. - + \par Interactions with other systems - + In order for bcm2835 library SPI to work, you may need to disable the SPI kernel module using: \code @@ -286,30 +286,30 @@ Since bcm2835 accesses the lowest level hardware interfaces (in eh intererests of speed and flexibility) there can be intercations with other low level software trying to do similar things. - It seems that with "latest" 8.0 Jessie 4.9.24-v7+ kernel PWM just won't + It seems that with "latest" 8.0 Jessie 4.9.24-v7+ kernel PWM just won't work unless you disable audio. There's a line \code dtparam=audio=on \endcode - in the /boot/config.txt. + in the /boot/config.txt. Comment it out like this: \code #dtparam=audio=on \endcode \par Real Time performance constraints - - The bcm2835 is a library for user programs (i.e. they run in 'userland'). + + The bcm2835 is a library for user programs (i.e. they run in 'userland'). Such programs are not part of the kernel and are usually - subject to paging and swapping by the kernel while it does other things besides running your program. - This means that you should not expect to get real-time performance or - real-time timing constraints from such programs. In particular, there is no guarantee that the - bcm2835_delay() and bcm2835_delayMicroseconds() will return after exactly the time requested. + subject to paging and swapping by the kernel while it does other things besides running your program. + This means that you should not expect to get real-time performance or + real-time timing constraints from such programs. In particular, there is no guarantee that the + bcm2835_delay() and bcm2835_delayMicroseconds() will return after exactly the time requested. In fact, depending on other activity on the host, IO etc, you might get significantly longer delay times than the one you asked for. So please dont expect to get exactly the time delay you request. - + Arjan reports that you can prevent swapping on Linux with the following code fragment: - + \code #define #define @@ -320,9 +320,9 @@ sched_setscheduler(0, SCHED_FIFO, &sp); mlockall(MCL_CURRENT | MCL_FUTURE); \endcode - + \par Crashing on some versions of Raspbian - Some people have reported that various versions of Rasbian will crash or hang + Some people have reported that various versions of Rasbian will crash or hang if certain GPIO pins are toggled: https://github.com/raspberrypi/linux/issues/2550 when using bcm2835. A workaround is to add this line to your /boot/config.txt: @@ -331,29 +331,29 @@ \endcode \par Bindings to other languages - + mikem has made Perl bindings available at CPAN: http://search.cpan.org/~mikem/Device-BCM2835-1.9/lib/Device/BCM2835.pm Matthew Baker has kindly made Python bindings available at: https: github.com/mubeta06/py-libbcm2835 - Gary Marks has created a Serial Peripheral Interface (SPI) command-line utility - for Raspberry Pi, based on the bcm2835 library. The - utility, spincl, is licensed under Open Source GNU GPLv3 by iP Solutions (http://ipsolutionscorp.com), as a + Gary Marks has created a Serial Peripheral Interface (SPI) command-line utility + for Raspberry Pi, based on the bcm2835 library. The + utility, spincl, is licensed under Open Source GNU GPLv3 by iP Solutions (http://ipsolutionscorp.com), as a free download with source included: http://ipsolutionscorp.com/raspberry-pi-spi-utility/ - + Bindings for Ada are available courtesy Tama McGlinn at https://github.com/TamaMcGlinn/ada_raspio - + \par Open Source Licensing GPL V3 - + This is the appropriate option if you want to share the source code of your application with everyone you distribute it to, and you also want to give them the right to share who uses it. If you wish to use this software under Open Source Licensing, you must contribute all your source code to the open source community in accordance with the GPL Version 3 when your application is distributed. See https://www.gnu.org/licenses/gpl-3.0.html and COPYING - + \par Commercial Licensing This is the appropriate option if you are creating proprietary applications @@ -361,12 +361,12 @@ application. To purchase a commercial license, contact info@airspayce.com \par Acknowledgements - + Some of this code has been inspired by Dom and Gert. The I2C code has been inspired by Alan Barr. - + \par Revision History - + \version 1.0 Initial release \version 1.1 Minor bug fixes @@ -381,18 +381,18 @@ \version 1.6 Document testing on 2012-07-15-wheezy-raspbian and Occidentalisv01 Functions bcm2835_gpio_ren(), bcm2835_gpio_fen(), bcm2835_gpio_hen() - bcm2835_gpio_len(), bcm2835_gpio_aren() and bcm2835_gpio_afen() now + bcm2835_gpio_len(), bcm2835_gpio_aren() and bcm2835_gpio_afen() now changes only the pin specified. Other pins that were already previously enabled stay enabled. Added bcm2835_gpio_clr_ren(), bcm2835_gpio_clr_fen(), bcm2835_gpio_clr_hen() - bcm2835_gpio_clr_len(), bcm2835_gpio_clr_aren(), bcm2835_gpio_clr_afen() + bcm2835_gpio_clr_len(), bcm2835_gpio_clr_aren(), bcm2835_gpio_clr_afen() to clear the enable for individual pins, suggested by Andreas Sundstrom. \version 1.7 Added bcm2835_spi_transfernb to support different buffers for read and write. \version 1.8 Improvements to read barrier, as suggested by maddin. - \version 1.9 Improvements contributed by mikew: + \version 1.9 Improvements contributed by mikew: I noticed that it was mallocing memory for the mmaps on /dev/mem. It's not necessary to do that, you can just mmap the file directly, so I've removed the mallocs (and frees). @@ -407,7 +407,7 @@ Also added a define for the passwrd value that Gert says is needed to change pad control settings. - \version 1.10 Changed the names of the delay functions to bcm2835_delay() + \version 1.10 Changed the names of the delay functions to bcm2835_delay() and bcm2835_delayMicroseconds() to prevent collisions with wiringPi. Macros to map delay()-> bcm2835_delay() and Macros to map delayMicroseconds()-> bcm2835_delayMicroseconds(), which @@ -415,14 +415,14 @@ \version 1.11 Fixed incorrect link to download file - \version 1.12 New GPIO pin definitions for RPi version 2 (which has a different GPIO mapping) + \version 1.12 New GPIO pin definitions for RPi version 2 (which has a different GPIO mapping) \version 1.13 New GPIO pin definitions for RPi version 2 plug P5 Hardware base pointers are now available (after initialisation) externally as bcm2835_gpio bcm2835_pwm bcm2835_clk bcm2835_pads bcm2835_spi0. \version 1.14 Now compiles even if CLOCK_MONOTONIC_RAW is not available, uses CLOCK_MONOTONIC instead. - Fixed errors in documentation of SPI divider frequencies based on 250MHz clock. + Fixed errors in documentation of SPI divider frequencies based on 250MHz clock. Reported by Ben Simpson. \version 1.15 Added bcm2835_close() to end of examples as suggested by Mark Wolfe. @@ -432,30 +432,30 @@ \version 1.17 Added bcm2835_gpio_write_mask. Requested by Sebastian Loncar. - \version 1.18 Added bcm2835_i2c_* functions. Changes to bcm2835_delayMicroseconds: - now uses the RPi system timer counter, instead of clock_gettime, for improved accuracy. + \version 1.18 Added bcm2835_i2c_* functions. Changes to bcm2835_delayMicroseconds: + now uses the RPi system timer counter, instead of clock_gettime, for improved accuracy. No need to link with -lrt now. Contributed by Arjan van Vught. - \version 1.19 Removed inlines added by previous patch since they don't seem to work everywhere. + \version 1.19 Removed inlines added by previous patch since they don't seem to work everywhere. Reported by olly. \version 1.20 Patch from Mark Dootson to close /dev/mem after access to the peripherals has been granted. - \version 1.21 delayMicroseconds is now not susceptible to 32 bit timer overruns. + \version 1.21 delayMicroseconds is now not susceptible to 32 bit timer overruns. Patch courtesy Jeremy Mortis. - \version 1.22 Fixed incorrect definition of BCM2835_GPFEN0 which broke the ability to set + \version 1.22 Fixed incorrect definition of BCM2835_GPFEN0 which broke the ability to set falling edge events. Reported by Mark Dootson. - \version 1.23 Added bcm2835_i2c_set_baudrate and bcm2835_i2c_read_register_rs. + \version 1.23 Added bcm2835_i2c_set_baudrate and bcm2835_i2c_read_register_rs. Improvements to bcm2835_i2c_read and bcm2835_i2c_write functions to fix ocasional reads not completing. Patched by Mark Dootson. \version 1.24 Mark Dootson p[atched a problem with his previously submitted code - under high load from other processes. + under high load from other processes. \version 1.25 Updated author and distribution location details to airspayce.com - \version 1.26 Added missing unmapmem for pads in bcm2835_close to prevent a memory leak. + \version 1.26 Added missing unmapmem for pads in bcm2835_close to prevent a memory leak. Reported by Hartmut Henkel. \version 1.27 bcm2835_gpio_set_pad() no longer needs BCM2835_PAD_PASSWRD: it is @@ -472,13 +472,13 @@ \version 1.31 Fix a GCC warning about dummy variable, patched by Alan Watson. Thanks. - \version 1.32 Added option I2C_V1 definition to compile for version 1 RPi. + \version 1.32 Added option I2C_V1 definition to compile for version 1 RPi. By default I2C code is generated for the V2 RPi which has SDA1 and SCL1 connected. Contributed by Malcolm Wiles based on work by Arvi Govindaraj. \version 1.33 Added command line utilities i2c and gpio to examples. Contributed by Shahrooz Shahparnia. - \version 1.34 Added bcm2835_i2c_write_read_rs() which writes an arbitrary number of bytes, + \version 1.34 Added bcm2835_i2c_write_read_rs() which writes an arbitrary number of bytes, sends a repeat start, and reads from the device. Contributed by Eduardo Steinhorst. \version 1.35 Fix build errors when compiled under Qt. Also performance improvements with SPI transfers. Contributed b Udo Klaas. @@ -493,7 +493,7 @@ \version 1.38 Added bcm2835_regbase for the benefit of C# wrappers, patch by Frank Hommers
- \version 1.39 Beta version of RPi2 compatibility. Not tested here on RPi2 hardware. + \version 1.39 Beta version of RPi2 compatibility. Not tested here on RPi2 hardware. Testers please confirm correct operation on RPi2.
Unnecessary 'volatile' qualifiers removed from all variables and signatures.
Removed unsupportable PWM dividers, based on a report from Christophe Cecillon.
@@ -505,21 +505,21 @@ Reported by tlhackque.
Fixed a problem where calling bcm2835_delayMicroseconds loops forever when debug is set. Reported by tlhackque.
Reinstated use of volatile in 2 functions where there was a danger of lost reads or writes. Reported by tlhackque.
- + \version 1.41 Added BCM2835_VERSION macro and new function bcm2835_version(); Requested by tlhackque.
Improvements to peripheral memory barriers as suggested by tlhackque.
Reinstated some necessary volatile declarations as requested by tlhackque.
\version 1.42 Further improvements to memory barriers with the patient assistance and patches of tlhackque.
- \version 1.43 Fixed problems with compiling barriers on RPI 2 with Arch Linux and gcc 4.9.2. + \version 1.43 Fixed problems with compiling barriers on RPI 2 with Arch Linux and gcc 4.9.2. Reported and patched by Lars Christensen.
Testing on RPI 2, with ArchLinuxARM-rpi-2-latest and 2015-02-16-raspbian-wheezy.
\version 1.44 Added documention about the need for device tree to be enabled on RPI2.
Improvements to detection of availability of DMB instruction based on value of __ARM_ARCH macro.
- \version 1.45 Fixed an error in the pad group offsets that would prevent bcm2835_gpio_set_pad() + \version 1.45 Fixed an error in the pad group offsets that would prevent bcm2835_gpio_set_pad() and bcm2835_gpio_pad() working correctly with non-0 pad groups. Reported by Guido. \version 1.46 2015-09-18 @@ -537,8 +537,8 @@ \version 1.50 2016-02-28 Added support for running as non-root, permitting access to GPIO only. Functions - bcm2835_spi_begin() and bcm2835_i2c_begin() will now return 0 if not running as root - (which prevents access to the SPI and I2C peripherals, amongst others). + bcm2835_spi_begin() and bcm2835_i2c_begin() will now return 0 if not running as root + (which prevents access to the SPI and I2C peripherals, amongst others). Testing on Raspbian Jessie. \version 1.51 2016-11-03 @@ -562,7 +562,7 @@ \version 1.56 2018-06-10 Supports bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_LSBFIRST), after which SPI bytes are reversed on read or write. Based on a suggestion by Damiano Benedetti. - + \version 1.57 2018-08-28 Added SPI function bcm2835_spi_set_speed_hz(uint32_t speed_hz); Contributed by Arjan van Vught (http://www.raspberrypi-dmx.org/) @@ -574,7 +574,7 @@ \version 1.59 2019-05-22 Fixed a bug in bcm2835_i2c_read reported by Charles Hayward where a noisy I2C line cold cause a seg fault by reading too many characters. - + \version 1.60 2019-07-23 Applied patch from Mark Dootson for RPi 4 compatibility. Thanks Mark. Not tested here on RPi4, but others report it works. Tested as still working correctly on earlier RPi models. Tested with Debian Buster on earlier models @@ -593,7 +593,7 @@ Adopted GPL V3 licensing \version 1.64 2020-04-11 - Fixed error in definitions of BCM2835_AUX_SPI_STAT_TX_LVL and BCM2835_AUX_SPI_STAT_RX_LVL. Patch from + Fixed error in definitions of BCM2835_AUX_SPI_STAT_TX_LVL and BCM2835_AUX_SPI_STAT_RX_LVL. Patch from Eric Marzec. Thanks. \version 1.65, 1.66 2020-04-16 @@ -608,7 +608,7 @@ Added link to Ada bindings by Tama McGlinn. Fixed problem with undefined off_t on some compilers. - \version 1.70, + \version 1.70, Patch to ensure compilation with gcc -std=c99, as reported by John Blaiklock. Fix some inconsistencies in version numbers @@ -788,8 +788,8 @@ typedef enum BCM2835_REGBASE_SPI0 = 6, /*!< Base of the SPI0 registers. */ BCM2835_REGBASE_BSC0 = 7, /*!< Base of the BSC0 registers. */ BCM2835_REGBASE_BSC1 = 8, /*!< Base of the BSC1 registers. */ - BCM2835_REGBASE_AUX = 9, /*!< Base of the AUX registers. */ - BCM2835_REGBASE_SPI1 = 10 /*!< Base of the SPI1 registers. */ + BCM2835_REGBASE_AUX = 9, /*!< Base of the AUX registers. */ + BCM2835_REGBASE_SPI1 = 10 /*!< Base of the SPI1 registers. */ } bcm2835RegisterBase; /*! Size of memory page on RPi */ @@ -802,8 +802,8 @@ typedef enum The BCM2835 has 54 GPIO pins. BCM2835 data sheet, Page 90 onwards. */ -/*! GPIO register offsets from BCM2835_GPIO_BASE. - Offsets into the GPIO Peripheral block in bytes per 6.1 Register View +/*! GPIO register offsets from BCM2835_GPIO_BASE. + Offsets into the GPIO Peripheral block in bytes per 6.1 Register View */ #define BCM2835_GPFSEL0 0x0000 /*!< GPIO Function Select 0 */ #define BCM2835_GPFSEL1 0x0004 /*!< GPIO Function Select 1 */ @@ -868,7 +868,7 @@ typedef enum } bcm2835PUDControl; /* need a value for pud functions that can't work unless RPI 4 */ -#define BCM2835_GPIO_PUD_ERROR 0x08 +#define BCM2835_GPIO_PUD_ERROR 0x08 /*! Pad control register offsets from BCM2835_GPIO_PADS */ #define BCM2835_PADS_GPIO_0_27 0x002c /*!< Pad control register for pads 0 to 27 */ @@ -899,7 +899,7 @@ typedef enum } bcm2835PadGroup; /*! \brief GPIO Pin Numbers - + Here we define Raspberry Pin GPIO pins on P1 in terms of the underlying BCM GPIO pin numbers. These can be passed as a pin number to any function requiring a pin. Not all pins on the RPi 26 bin IDE plug are connected to GPIO pins @@ -1052,7 +1052,7 @@ typedef enum #define BCM2835_AUX_SPI_STAT_BITCOUNT 0x0000003F /*!< */ /* Defines for SPI - GPIO register offsets from BCM2835_SPI0_BASE. + GPIO register offsets from BCM2835_SPI0_BASE. Offsets into the SPI Peripheral block in bytes per 10.5 SPI Register Map */ #define BCM2835_SPI0_CS 0x0000 /*!< SPI Master Control and Status */ @@ -1129,7 +1129,7 @@ typedef enum The frequencies shown for each divider have been confirmed by measurement on RPi1 and RPi2. The system clock frequency on RPi3 is different, so the frequency you get from a given divider will be different. See comments in 'SPI Pins' for information about reliable SPI speeds. - Note: it is possible to change the core clock rate of the RPi 3 back to 250MHz, by putting + Note: it is possible to change the core clock rate of the RPi 3 back to 250MHz, by putting \code core_freq=250 \endcode @@ -1306,13 +1306,13 @@ extern "C" { @{ */ - /*! Initialise the library by opening /dev/mem (if you are root) + /*! Initialise the library by opening /dev/mem (if you are root) or /dev/gpiomem (if you are not) - and getting pointers to the + and getting pointers to the internal memory for BCM 2835 device registers. You must call this (successfully) - before calling any other - functions in this library (except bcm2835_set_debug). - If bcm2835_init() fails by returning 0, + before calling any other + functions in this library (except bcm2835_set_debug). + If bcm2835_init() fails by returning 0, calling any other function may result in crashes or other failures. If bcm2835_init() succeeds but you are not running as root, then only gpio operations are permitted, and calling any other functions may result in crashes or other failures. . @@ -1344,8 +1344,8 @@ extern "C" { /*! \defgroup lowlevel Low level register access These functions provide low level register access, and should not generally - need to be used - + need to be used + @{ */ @@ -1408,8 +1408,8 @@ extern "C" { extern void bcm2835_peri_write_nb(volatile uint32_t* paddr, uint32_t value); /*! Alters a number of bits in a 32 peripheral regsiter. - It reads the current valu and then alters the bits defines as 1 in mask, - according to the bit value in value. + It reads the current valu and then alters the bits defines as 1 in mask, + according to the bit value in value. All other bits that are 0 in the mask are unaffected. Use this to alter a subset of the bits in a register. Memory barriers are used. Note that this is not atomic; an interrupt @@ -1423,7 +1423,7 @@ extern "C" { /*! @} end of lowlevel */ /*! \defgroup gpio GPIO register access - These functions allow you to control the GPIO interface. You can set the + These functions allow you to control the GPIO interface. You can set the function of each GPIO pin, read the input state and set the output state. @{ */ @@ -1435,35 +1435,35 @@ extern "C" { */ extern void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode); - /*! Sets the specified pin output to + /*! Sets the specified pin output to HIGH. \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. \sa bcm2835_gpio_write() */ extern void bcm2835_gpio_set(uint8_t pin); - /*! Sets the specified pin output to + /*! Sets the specified pin output to LOW. \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. \sa bcm2835_gpio_write() */ extern void bcm2835_gpio_clr(uint8_t pin); - /*! Sets any of the first 32 GPIO output pins specified in the mask to + /*! Sets any of the first 32 GPIO output pins specified in the mask to HIGH. \param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05) \sa bcm2835_gpio_write_multi() */ extern void bcm2835_gpio_set_multi(uint32_t mask); - /*! Sets any of the first 32 GPIO output pins specified in the mask to + /*! Sets any of the first 32 GPIO output pins specified in the mask to LOW. \param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05) \sa bcm2835_gpio_write_multi() */ extern void bcm2835_gpio_clr_multi(uint32_t mask); - /*! Reads the current level on the specified + /*! Reads the current level on the specified pin and returns either HIGH or LOW. Works whether or not the pin is an input or an output. \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. @@ -1473,7 +1473,7 @@ extern "C" { /*! Event Detect Status. Tests whether the specified pin has detected a level or edge - as requested by bcm2835_gpio_ren(), bcm2835_gpio_fen(), bcm2835_gpio_hen(), + as requested by bcm2835_gpio_ren(), bcm2835_gpio_fen(), bcm2835_gpio_hen(), bcm2835_gpio_len(), bcm2835_gpio_aren(), bcm2835_gpio_afen(). Clear the flag for a given pin by calling bcm2835_gpio_set_eds(pin); \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. @@ -1488,7 +1488,7 @@ extern "C" { */ extern uint32_t bcm2835_gpio_eds_multi(uint32_t mask); - /*! Sets the Event Detect Status register for a given pin to 1, + /*! Sets the Event Detect Status register for a given pin to 1, which has the effect of clearing the flag. Use this afer seeing an Event Detect Status on the pin. \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. @@ -1500,7 +1500,7 @@ extern "C" { \param[in] mask Mask of pins to clear. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05) */ extern void bcm2835_gpio_set_eds_multi(uint32_t mask); - + /*! Enable Rising Edge Detect Enable for the specified pin. When a rising edge is detected, sets the appropriate pin in Event Detect Status. The GPRENn registers use @@ -1591,12 +1591,12 @@ extern "C" { /*! Clocks the Pull-up/down value set earlier by bcm2835_gpio_pud() into the pin. \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. - \param[in] on HIGH to clock the value from bcm2835_gpio_pud() into the pin. - LOW to remove the clock. - + \param[in] on HIGH to clock the value from bcm2835_gpio_pud() into the pin. + LOW to remove the clock. + On the RPI 4, although this function and bcm2835_gpio_pud() are supported for backward compatibility, new code should always use bcm2835_gpio_set_pud(). - + \sa bcm2835_gpio_set_pud() */ extern void bcm2835_gpio_pudclk(uint8_t pin, uint8_t on); @@ -1611,7 +1611,7 @@ extern "C" { /*! Sets the Pad Control for the given GPIO group. Caution: requires root access. \param[in] group The GPIO pad group number, one of BCM2835_PAD_GROUP_GPIO_* - \param[in] control Mask of bits from BCM2835_PAD_* from \ref bcm2835PadGroup. Note + \param[in] control Mask of bits from BCM2835_PAD_* from \ref bcm2835PadGroup. Note that it is not necessary to include BCM2835_PAD_PASSWRD in the mask as this is automatically included. */ @@ -1620,9 +1620,9 @@ extern "C" { /*! Delays for the specified number of milliseconds. Uses nanosleep(), and therefore does not use CPU until the time is up. However, you are at the mercy of nanosleep(). From the manual for nanosleep(): - If the interval specified in req is not an exact multiple of the granularity + If the interval specified in req is not an exact multiple of the granularity underlying clock (see time(7)), then the interval will be - rounded up to the next multiple. Furthermore, after the sleep completes, + rounded up to the next multiple. Furthermore, after the sleep completes, there may still be a delay before the CPU becomes free to once again execute the calling thread. \param[in] millis Delay in milliseconds @@ -1632,9 +1632,9 @@ extern "C" { /*! Delays for the specified number of microseconds. Uses a combination of nanosleep() and a busy wait loop on the BCM2835 system timers, However, you are at the mercy of nanosleep(). From the manual for nanosleep(): - If the interval specified in req is not an exact multiple of the granularity + If the interval specified in req is not an exact multiple of the granularity underlying clock (see time(7)), then the interval will be - rounded up to the next multiple. Furthermore, after the sleep completes, + rounded up to the next multiple. Furthermore, after the sleep completes, there may still be a delay before the CPU becomes free to once again execute the calling thread. For times less than about 450 microseconds, uses a busy wait on the System Timer. @@ -1674,13 +1674,13 @@ extern "C" { On earlier RPI versions not based on the BCM2711, returns BCM2835_GPIO_PUD_ERROR \param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \ref RPiGPIOPin. */ - + extern uint8_t bcm2835_gpio_get_pud(uint8_t pin); /*! @} */ /*! \defgroup spi SPI access - These functions let you use SPI0 (Serial Peripheral Interface) to + These functions let you use SPI0 (Serial Peripheral Interface) to interface with an external SPI device. @{ */ @@ -1688,7 +1688,7 @@ extern "C" { /*! Start SPI operations. Forces RPi SPI0 pins P1-19 (MOSI), P1-21 (MISO), P1-23 (CLK), P1-24 (CE0) and P1-26 (CE1) to alternate function ALT0, which enables those pins for SPI interface. - You should call bcm2835_spi_end() when all SPI funcitons are complete to return the pins to + You should call bcm2835_spi_end() when all SPI funcitons are complete to return the pins to their default functions. \sa bcm2835_spi_end() \return 1 if successful, 0 otherwise (perhaps because you are not running as root) @@ -1705,14 +1705,14 @@ extern "C" { Set the bit order to be used for transmit and receive. The bcm2835 SPI0 only supports BCM2835_SPI_BIT_ORDER_MSB, so if you select BCM2835_SPI_BIT_ORDER_LSB, the bytes will be reversed in software. The library defaults to BCM2835_SPI_BIT_ORDER_MSB. - \param[in] order The desired bit order, one of BCM2835_SPI_BIT_ORDER_*, + \param[in] order The desired bit order, one of BCM2835_SPI_BIT_ORDER_*, see \ref bcm2835SPIBitOrder */ extern void bcm2835_spi_setBitOrder(uint8_t order); - /*! Sets the SPI clock divider and therefore the - SPI clock speed. - \param[in] divider The desired SPI clock divider, one of BCM2835_SPI_CLOCK_DIVIDER_*, + /*! Sets the SPI clock divider and therefore the + SPI clock speed. + \param[in] divider The desired SPI clock divider, one of BCM2835_SPI_CLOCK_DIVIDER_*, see \ref bcm2835SPIClockDivider */ extern void bcm2835_spi_setClockDivider(uint16_t divider); @@ -1725,7 +1725,7 @@ extern "C" { /*! Sets the SPI data mode Sets the clock polariy and phase - \param[in] mode The desired data mode, one of BCM2835_SPI_MODE*, + \param[in] mode The desired data mode, one of BCM2835_SPI_MODE*, see \ref bcm2835SPIMode */ extern void bcm2835_spi_setDataMode(uint8_t mode); @@ -1733,15 +1733,15 @@ extern "C" { /*! Sets the chip select pin(s) When an bcm2835_spi_transfer() is made, the selected pin(s) will be asserted during the transfer. - \param[in] cs Specifies the CS pins(s) that are used to activate the desired slave. + \param[in] cs Specifies the CS pins(s) that are used to activate the desired slave. One of BCM2835_SPI_CS*, see \ref bcm2835SPIChipSelect */ extern void bcm2835_spi_chipSelect(uint8_t cs); /*! Sets the chip select pin polarity for a given pin - When an bcm2835_spi_transfer() occurs, the currently selected chip select pin(s) - will be asserted to the - value given by active. When transfers are not happening, the chip select pin(s) + When an bcm2835_spi_transfer() occurs, the currently selected chip select pin(s) + will be asserted to the + value given by active. When transfers are not happening, the chip select pin(s) return to the complement (inactive) value. \param[in] cs The chip select pin to affect \param[in] active Whether the chip select pin is to be active HIGH @@ -1749,9 +1749,9 @@ extern "C" { extern void bcm2835_spi_setChipSelectPolarity(uint8_t cs, uint8_t active); /*! Transfers one byte to and from the currently selected SPI slave. - Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) + Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) during the transfer. - Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO. + Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO. Returns the read data byte from the slave. Uses polled transfer as per section 10.6.1 of the BCM 2835 ARM Peripherls manual \param[in] value The 8 bit data byte to write to MOSI @@ -1759,14 +1759,14 @@ extern "C" { \sa bcm2835_spi_transfern() */ extern uint8_t bcm2835_spi_transfer(uint8_t value); - + /*! Transfers any number of bytes to and from the currently selected SPI slave. - Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) + Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) during the transfer. - Clocks the len 8 bit bytes out on MOSI, and simultaneously clocks in data from MISO. + Clocks the len 8 bit bytes out on MOSI, and simultaneously clocks in data from MISO. The data read read from the slave is placed into rbuf. rbuf must be at least len bytes long Uses polled transfer as per section 10.6.1 of the BCM 2835 ARM Peripherls manual - \param[in] tbuf Buffer of bytes to send. + \param[in] tbuf Buffer of bytes to send. \param[out] rbuf Received bytes will by put in this buffer \param[in] len Number of bytes in the tbuf buffer, and the number of bytes to send/received \sa bcm2835_spi_transfer() @@ -1860,14 +1860,14 @@ extern "C" { extern void bcm2835_aux_spi_transfernb(const char *tbuf, char *rbuf, uint32_t len); /*! Transfers one byte to and from the AUX SPI slave. - Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO. + Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO. Returns the read data byte from the slave. \param[in] value The 8 bit data byte to write to MOSI \return The 8 bit byte simultaneously read from MISO \sa bcm2835_aux_spi_transfern() */ extern uint8_t bcm2835_aux_spi_transfer(uint8_t value); - + /*! @} */ /*! \defgroup i2c I2C access @@ -1983,13 +1983,13 @@ extern "C" { @{ */ - /*! Sets the PWM clock divisor, + /*! Sets the PWM clock divisor, to control the basic PWM pulse widths. \param[in] divisor Divides the basic 19.2MHz PWM clock. You can use one of the common values BCM2835_PWM_CLOCK_DIVIDER_* in \ref bcm2835PWMClockDivider */ extern void bcm2835_pwm_set_clock(uint32_t divisor); - + /*! Sets the mode of the given PWM channel, allowing you to control the PWM mode and enable/disable that channel \param[in] channel The PWM channel. 0 or 1. @@ -2004,11 +2004,11 @@ extern "C" { \param[in] range The maximum value permitted for DATA. */ extern void bcm2835_pwm_set_range(uint8_t channel, uint32_t range); - - /*! Sets the PWM pulse ratio to emit to DATA/RANGE, + + /*! Sets the PWM pulse ratio to emit to DATA/RANGE, where RANGE is set by bcm2835_pwm_set_range(). \param[in] channel The PWM channel. 0 or 1. - \param[in] data Controls the PWM output ratio as a fraction of the range. + \param[in] data Controls the PWM output ratio as a fraction of the range. Can vary from 0 to RANGE. */ extern void bcm2835_pwm_set_data(uint8_t channel, uint32_t data); @@ -2045,12 +2045,12 @@ extern "C" { */ /*! @example i2c.c -Command line utility for executing i2c commands with the +Command line utility for executing i2c commands with the Broadcom bcm2835. Contributed by Shahrooz Shahparnia. */ /*! example gpio.c - Command line utility for executing gpio commands with the + Command line utility for executing gpio commands with the Broadcom bcm2835. Contributed by Shahrooz Shahparnia. */ diff --git a/bcm_peri.c b/bcm_peri.c index d39eaf5..0bdc222 100644 --- a/bcm_peri.c +++ b/bcm_peri.c @@ -24,7 +24,7 @@ static u32 peri_base = 0x00000000; -u32 bcm_peri_base_probe(void) +u32 bcm_peri_base_probe(void) { char *path = "/soc"; struct device_node *dt_node; @@ -63,10 +63,10 @@ u32 bcm_peri_base_probe(void) uint32_t bcm_peri_read(volatile uint32_t* paddr) { uint32_t ret; - __sync_synchronize(); - ret = *paddr; - __sync_synchronize(); - return ret; + __sync_synchronize(); + ret = *paddr; + __sync_synchronize(); + return ret; } /* read from peripheral without the read barrier @@ -77,7 +77,7 @@ uint32_t bcm_peri_read(volatile uint32_t* paddr) */ uint32_t bcm_peri_read_nb(volatile uint32_t* paddr) { - return *paddr; + return *paddr; } /* Write with memory barriers to peripheral @@ -85,15 +85,15 @@ uint32_t bcm_peri_read_nb(volatile uint32_t* paddr) void bcm_peri_write(volatile uint32_t* paddr, uint32_t value) { - __sync_synchronize(); - *paddr = value; - __sync_synchronize(); + __sync_synchronize(); + *paddr = value; + __sync_synchronize(); } /* write to peripheral without the write barrier */ void bcm_peri_write_nb(volatile uint32_t* paddr, uint32_t value) { - *paddr = value; + *paddr = value; } /* Set/clear only the bits in value covered by the mask diff --git a/build_cfg.h b/build_cfg.h new file mode 100644 index 0000000..2e81684 --- /dev/null +++ b/build_cfg.h @@ -0,0 +1,14 @@ +/******************************************************************************** + * Copyright (C) 2021 Ju, Gyeong-min + ********************************************************************************/ + +#ifndef __BUILD_CFG_H_ +#define __BUILD_CFG_H_ + + +//#define USE_REPORT_TIMER +//#define USE_I2C_DIRECT +#define USE_SPI_DIRECT + + +#endif diff --git a/device_74hc165.c b/device_74hc165.c index 104629e..e27dbc7 100644 --- a/device_74hc165.c +++ b/device_74hc165.c @@ -2,6 +2,8 @@ * Copyright (C) 2021 Ju, Gyeong-min ********************************************************************************/ +#include "build_cfg.h" + #include #include #include @@ -10,9 +12,9 @@ #include "gpio_util.h" #include "parse_util.h" -//#define GPIO_GET(i) GPIO_READ(i) -//#define GPIO_GET_VALUE(i) getGpio(i) -//#define GPIO_SET_VALUE(i,v) setGpio((i), (v)) + +#define DEFAULT_74HC165_LOAD_RATE (10) +#define DEFAULT_74HC165_CLOCK_RATE (1) //static const int default_74hc165_gpio_maps[3] = {16, 20, 21}; @@ -22,7 +24,7 @@ // {ABS_Y, -1}, // {ABS_Y, 1}, // {ABS_X, -1}, -// {ABS_X, 1}, +// {ABS_X, 1}, // {BTN_START, 1}, // {BTN_SELECT, 1}, // {BTN_A, 1}, @@ -72,7 +74,7 @@ static const device_74hc165_index_table_t default_input_74hc165_config = { {ABS_Y, -DEFAULT_INPUT_ABS_MAX_VALUE}, {ABS_Y, DEFAULT_INPUT_ABS_MAX_VALUE}, {ABS_X, -DEFAULT_INPUT_ABS_MAX_VALUE}, - {ABS_X, DEFAULT_INPUT_ABS_MAX_VALUE}, + {ABS_X, DEFAULT_INPUT_ABS_MAX_VALUE}, {BTN_START, 1}, {BTN_SELECT, 1}, {BTN_A, 1}, @@ -85,7 +87,7 @@ static const device_74hc165_index_table_t default_input_74hc165_config = { {BTN_TL2, 1}, {BTN_TR2, 1}, {BTN_TRIGGER, 1} - }, + }, INPUT_74HC165_DEFAULT_KEYCODE_TABLE_ITEM_COUNT, 0, 0 }; @@ -97,7 +99,7 @@ static int __parse_device_param_for_74hc165(device_74hc165_data_t* user_data, ch char szText[512]; char* pText; - strcpy(szText, device_config_str); + strcpy(szText, device_config_str); pText = szText; user_data->device_cfg.gpio_ld = parse_number(&pText, ",", 0, -1); @@ -126,7 +128,7 @@ static int __parse_endpoint_param_for_74hc165(device_74hc165_data_t* user_data, char szText[512]; char* pText; char* temp_p; - + des = user_data->button_cfgs; for (i = 0; i < endpoint_count; i++ ) { @@ -137,7 +139,7 @@ static int __parse_endpoint_param_for_74hc165(device_74hc165_data_t* user_data, if (ep == NULL) continue; if (endpoint_config_str[i] != NULL) { - strcpy(szText, endpoint_config_str[i]); + strcpy(szText, endpoint_config_str[i]); pText = szText; cfgtype_p = strsep(&pText, ","); @@ -234,7 +236,7 @@ static int init_input_device_for_74hc165(void* device_desc_data, input_device_da { device_74hc165_data_t* user_data; int result; - + if (device_config_str == NULL || strcmp(device_config_str, "") == 0) return -EINVAL; user_data = (device_74hc165_data_t *)kzalloc(sizeof(device_74hc165_data_t) + sizeof(device_74hc165_index_table_t) * (device_data->target_endpoint_count - 1), GFP_KERNEL); @@ -292,7 +294,7 @@ static void check_input_device_for_74hc165(input_device_data_t *device_data) if (io_count <= 0) return; gpio_set_value(ld, 0); - udelay(5); + udelay(DEFAULT_74HC165_LOAD_RATE); gpio_set_value(ld, 1); readed = 0; @@ -311,7 +313,7 @@ static void check_input_device_for_74hc165(input_device_data_t *device_data) if (user_data->device_cfg.bit_order == 0) { for (j = 0; j < skip_cnt; j++ ){ gpio_set_value(ck, 1); - ndelay(20); + udelay(DEFAULT_74HC165_CLOCK_RATE); gpio_set_value(ck, 0); } @@ -322,7 +324,7 @@ static void check_input_device_for_74hc165(input_device_data_t *device_data) btndef++; gpio_set_value(ck, 1); - ndelay(20); + udelay(DEFAULT_74HC165_CLOCK_RATE); gpio_set_value(ck, 0); } } else { @@ -335,7 +337,7 @@ static void check_input_device_for_74hc165(input_device_data_t *device_data) io_value = (io_value << 1) | (v == 0 ? 1 : 0); gpio_set_value(ck, 1); - ndelay(20); + ndelay(DEFAULT_74HC165_CLOCK_RATE); gpio_set_value(ck, 0); } } diff --git a/device_adc_ads1x15.c b/device_adc_ads1x15.c index fa660e9..16ab19e 100644 --- a/device_adc_ads1x15.c +++ b/device_adc_ads1x15.c @@ -2,6 +2,8 @@ * Copyright (C) 2021 Ju, Gyeong-min ********************************************************************************/ +#include "build_cfg.h" + #include #include #include @@ -9,7 +11,11 @@ #include #include "bcm_peri.h" #include "gpio_util.h" +#if defined(USE_I2C_DIRECT) #include "i2c_util.h" +#else +#include +#endif #include "parse_util.h" @@ -149,6 +155,9 @@ typedef struct tag_device_ads1x15_data { device_ads1x15_desc_config_t device_desc_data; device_ads1x15_config_t device_cfg; +#if !defined(USE_I2C_DIRECT) + struct i2c_client *i2c; +#endif device_ads1x15_index_table_t button_cfgs[1]; } device_ads1x15_data_t; @@ -161,7 +170,7 @@ static const device_ads1x15_index_table_t default_input_ads1x15_config = { {1, ABS_Y, -DEFAULT_INPUT_ABS_MAX_VALUE, DEFAULT_INPUT_ABS_MAX_VALUE, 0, MAX_ADS1X15_ADC_VALUE, MAX_ADS1X15_ADC_VALUE/2}, {2, ABS_RX, -DEFAULT_INPUT_ABS_MAX_VALUE, DEFAULT_INPUT_ABS_MAX_VALUE, 0, MAX_ADS1X15_ADC_VALUE, MAX_ADS1X15_ADC_VALUE/2}, {3, ABS_RY, -DEFAULT_INPUT_ABS_MAX_VALUE, DEFAULT_INPUT_ABS_MAX_VALUE, 0, MAX_ADS1X15_ADC_VALUE, MAX_ADS1X15_ADC_VALUE/2} - }, + }, INPUT_ADS1X15_DEFAULT_KEYCODE_TABLE_ITEM_COUNT, 0 }; @@ -174,7 +183,7 @@ static int __parse_device_param_for_ads1x15(device_ads1x15_data_t* user_data, ch char* pText; if (device_config_str != NULL) { - strcpy(szText, device_config_str); + strcpy(szText, device_config_str); pText = szText; user_data->device_cfg.i2c_addr = parse_number(&pText, ",", 0, ADS1X15_DEFAULT_I2C_ADDR); @@ -214,7 +223,7 @@ static int __parse_endpoint_param_for_ads1x15(device_ads1x15_data_t* user_data, if (ep == NULL) continue; if (endpoint_config_str[i] != NULL) { - strcpy(szText, endpoint_config_str[i]); + strcpy(szText, endpoint_config_str[i]); pText = szText; cfgtype_p = strsep(&pText, ","); @@ -312,7 +321,7 @@ static int init_input_device_for_ads1x15(void* device_desc_data, input_device_da device_ads1x15_data_t* user_data; int result; int i; - + user_data = (device_ads1x15_data_t *)kzalloc(sizeof(device_ads1x15_data_t) + sizeof(device_ads1x15_index_table_t) * (device_data->target_endpoint_count - 1), GFP_KERNEL); user_data->device_desc_data = *(device_ads1x15_desc_config_t *)device_desc_data; @@ -340,85 +349,132 @@ static int init_input_device_for_ads1x15(void* device_desc_data, input_device_da static void start_input_device_for_ads1x15(input_device_data_t *device_data) { - // device_ads1x15_data_t *user_data = (device_ads1x15_data_t *)device_data->data; +#if !defined(USE_I2C_DIRECT) + device_ads1x15_data_t *user_data = (device_ads1x15_data_t *)device_data->data; +#endif +#if defined(USE_I2C_DIRECT) i2c_init(bcm_peri_base_probe(), 0xB0); +#else + struct i2c_board_info i2c_board_info = { + I2C_BOARD_INFO("ads1x15", user_data->device_cfg.i2c_addr) + }; + struct i2c_adapter* i2c_adap = i2c_get_adapter(1); + if (i2c_adap == NULL) { + pr_err("i2c adapter open erro {%d}", 1); + return; + } + user_data->i2c = i2c_new_client_device(i2c_adap, &i2c_board_info); + if (IS_ERR_OR_NULL(user_data->i2c)) { + pr_err("i2c device open erro {%d}", user_data->device_cfg.i2c_addr); + return; + } + i2c_put_adapter(i2c_adap); +#endif device_data->is_opend = TRUE; } -static uint16_t __readRegister(int i2c_addr, uint8_t reg) +#if defined(USE_I2C_DIRECT) +static uint16_t __readRegister(int i2c_addr, uint8_t reg) { uint8_t buffer[2]; i2c_read(i2c_addr, reg, buffer, 2); return ((buffer[0] << 8) | buffer[1]); } -static void __writeRegister(int i2c_addr, uint8_t reg, uint16_t value) +static void __writeRegister(int i2c_addr, uint8_t reg, uint16_t value) { uint8_t buffer[2]; buffer[0] = value >> 8; buffer[1] = value & 0xFF; i2c_write(i2c_addr, reg, buffer, 2); } +#else +static uint16_t __readRegister(struct i2c_client* i2c, uint8_t reg) +{ + if (!IS_ERR_OR_NULL(i2c)) { + int value = i2c_smbus_read_word_data(i2c, reg); + return (value < 0) ? 0 : value; + } else { + return 0; + } +} + +static void __writeRegister(struct i2c_client* i2c, uint8_t reg, uint16_t value) +{ + if (!IS_ERR_OR_NULL(i2c)) { + i2c_smbus_write_word_data(i2c, reg, value); + } +} +#endif + -static int16_t __readADC_SingleEnded(int i2c_addr, uint8_t channel, unsigned gain) +#if defined(USE_I2C_DIRECT) +static int16_t __readADC_SingleEnded(int i2c_addr, uint8_t channel, unsigned gain) +#else +static int16_t __readADC_SingleEnded(struct i2c_client* i2c_addr, uint8_t channel, unsigned gain) +#endif { - uint16_t config; + uint16_t config; - if (channel > 3) { - return 0; - } - - // Start with default values - config = ADS1X15_REG_CONFIG_CQUE_NONE | // Disable the comparator (default val) - ADS1X15_REG_CONFIG_CLAT_NONLAT | // Non-latching (default val) - ADS1X15_REG_CONFIG_CPOL_ACTVLOW | // Alert/Rdy active low (default val) - ADS1X15_REG_CONFIG_CMODE_TRAD | // Traditional comparator (default val) - ADS1X15_REG_CONFIG_MODE_SINGLE; // Single-shot mode (default) - - // Set PGA/voltage range - config |= gain; - - // Set data rate - config |= RATE_ADS1015_2400SPS; - - // Set single-ended input channel - switch (channel) { - case (0): - config |= ADS1X15_REG_CONFIG_MUX_SINGLE_0; - break; - case (1): - config |= ADS1X15_REG_CONFIG_MUX_SINGLE_1; - break; - case (2): - config |= ADS1X15_REG_CONFIG_MUX_SINGLE_2; - break; - case (3): - config |= ADS1X15_REG_CONFIG_MUX_SINGLE_3; - break; - } - - // Set 'start single-conversion' bit - config |= ADS1X15_REG_CONFIG_OS_SINGLE; - - // Write config register to the ADC - __writeRegister(i2c_addr, ADS1X15_REG_POINTER_CONFIG, config); - - // Wait for the conversion to complete - while ((__readRegister(i2c_addr, ADS1X15_REG_POINTER_CONFIG) & 0x8000) == 0) {} - - // Read the conversion results - return __readRegister(i2c_addr, ADS1X15_REG_POINTER_CONVERT); + if (channel > 3) { + return 0; + } + + // Start with default values + config = ADS1X15_REG_CONFIG_CQUE_NONE | // Disable the comparator (default val) + ADS1X15_REG_CONFIG_CLAT_NONLAT | // Non-latching (default val) + ADS1X15_REG_CONFIG_CPOL_ACTVLOW | // Alert/Rdy active low (default val) + ADS1X15_REG_CONFIG_CMODE_TRAD | // Traditional comparator (default val) + ADS1X15_REG_CONFIG_MODE_SINGLE; // Single-shot mode (default) + + // Set PGA/voltage range + config |= gain; + + // Set data rate + config |= RATE_ADS1015_2400SPS; + + // Set single-ended input channel + switch (channel) { + case 0: + config |= ADS1X15_REG_CONFIG_MUX_SINGLE_0; + break; + case 1: + config |= ADS1X15_REG_CONFIG_MUX_SINGLE_1; + break; + case 2: + config |= ADS1X15_REG_CONFIG_MUX_SINGLE_2; + break; + case 3: + config |= ADS1X15_REG_CONFIG_MUX_SINGLE_3; + break; + } + + // Set 'start single-conversion' bit + config |= ADS1X15_REG_CONFIG_OS_SINGLE; + + // Write config register to the ADC + __writeRegister(i2c_addr, ADS1X15_REG_POINTER_CONFIG, config); + + // Wait for the conversion to complete + while ((__readRegister(i2c_addr, ADS1X15_REG_POINTER_CONFIG) & 0x8000) == 0) {} + + // Read the conversion results + return __readRegister(i2c_addr, ADS1X15_REG_POINTER_CONVERT); } static void check_input_device_for_ads1x15(input_device_data_t *device_data) { int i, j, k, cnt; - int i2c_addr; +#if defined(USE_I2C_DIRECT) + int i2c; +#else + struct i2c_client* i2c; +#endif unsigned adc_gain; int adc_gain_milli_volt, ref_milli_volt; device_ads1x15_data_t *user_data = (device_ads1x15_data_t *)device_data->data; @@ -426,7 +482,14 @@ static void check_input_device_for_ads1x15(input_device_data_t *device_data) if (user_data == NULL) return; - i2c_addr = user_data->device_cfg.i2c_addr; +#if defined(USE_I2C_DIRECT) + i2c = user_data->device_cfg.i2c_addr; +#else + i2c = user_data->i2c; + if (IS_ERR_OR_NULL(i2c)) { + return; + } +#endif adc_gain = ads1x15_gain_setting[user_data->device_cfg.ads_gain][0]; /* +/- 4.096V range (limited to VDD +0.3V max!) */ adc_gain_milli_volt = ads1x15_gain_setting[user_data->device_cfg.ads_gain][1]; ref_milli_volt = user_data->device_cfg.ref_milli_volt; @@ -447,13 +510,13 @@ static void check_input_device_for_ads1x15(input_device_data_t *device_data) if (btndef->abs_input >= 0 && btndef->adc_channel >= 0) { if (value_weight >= 100) { // 4.096 / 32767 / 3.3 = 4.096 / (32767 * 3.3) = 4096 / (32767 * 3300) = 0 ~ 1 - v = __readADC_SingleEnded(i2c_addr, btndef->adc_channel, adc_gain); + v = __readADC_SingleEnded(i2c, btndef->adc_channel, adc_gain); v *= adc_gain_milli_volt / ref_milli_volt; } else { v = user_data->currentAdcValue[btndef->adc_channel]; for (k = 0; k < sampling_count; k++) { // 4.096 / 32767 / 3.3 = 4.096 / (32767 * 3.3) = 4096 / (32767 * 3300) = 0 ~ 1 - v0 = __readADC_SingleEnded(i2c_addr, btndef->adc_channel, adc_gain); + v0 = __readADC_SingleEnded(i2c, btndef->adc_channel, adc_gain); v0 *= adc_gain_milli_volt / ref_milli_volt; v = (v0 * value_weight + v * prev_weight) / 100; } @@ -478,9 +541,20 @@ static void check_input_device_for_ads1x15(input_device_data_t *device_data) static void stop_input_device_for_ads1x15(input_device_data_t *device_data) { +#if !defined(USE_I2C_DIRECT) + device_ads1x15_data_t *user_data = (device_ads1x15_data_t *)device_data->data; +#endif + device_data->is_opend = FALSE; +#if defined(USE_I2C_DIRECT) i2c_close(); +#else + if (!IS_ERR_OR_NULL(user_data->i2c)) { + i2c_unregister_device(user_data->i2c); + user_data->i2c = NULL; + } +#endif } diff --git a/device_adc_mcp300x.c b/device_adc_mcp300x.c index e936027..29804fc 100644 --- a/device_adc_mcp300x.c +++ b/device_adc_mcp300x.c @@ -2,6 +2,8 @@ * Copyright (C) 2021 Ju, Gyeong-min ********************************************************************************/ +#include "build_cfg.h" + #include #include #include @@ -10,7 +12,11 @@ #include "indev_type.h" #include "bcm_peri.h" #include "gpio_util.h" +#if defined(USE_SPI_DIRECT) #include "spi_util.h" +#else +#include +#endif #include "parse_util.h" @@ -52,6 +58,9 @@ typedef struct tag_device_mcp300x_data { device_mcp300x_desc_config_t device_desc_data; device_mcp300x_config_t device_cfg; +#if !defined(USE_SPI_DIRECT) + struct spi_device* spi; +#endif device_mcp300x_index_table_t button_cfgs[1]; } device_mcp300x_data_t; @@ -68,7 +77,7 @@ static const device_mcp300x_index_table_t default_input_mcp300x_config = { {5, ABS_WHEEL, -DEFAULT_INPUT_ABS_MAX_VALUE, DEFAULT_INPUT_ABS_MAX_VALUE, 0, MAX_MCP300X_ADC_VALUE, MAX_MCP300X_ADC_VALUE/2}, {6, ABS_HAT0X, -DEFAULT_INPUT_ABS_MAX_VALUE, DEFAULT_INPUT_ABS_MAX_VALUE, 0, MAX_MCP300X_ADC_VALUE, MAX_MCP300X_ADC_VALUE/2}, {7, ABS_HAT0Y, -DEFAULT_INPUT_ABS_MAX_VALUE, DEFAULT_INPUT_ABS_MAX_VALUE, 0, MAX_MCP300X_ADC_VALUE, MAX_MCP300X_ADC_VALUE/2} - }, + }, INPUT_MCP300X_DEFAULT_KEYCODE_TABLE_ITEM_COUNT, 0 }; @@ -81,7 +90,7 @@ static int __parse_device_param_for_mcp300x(device_mcp300x_data_t* user_data, ch char* pText; if (device_config_str != NULL) { - strcpy(szText, device_config_str); + strcpy(szText, device_config_str); pText = szText; user_data->device_cfg.spi_channel = parse_number(&pText, ",", 0, MCP300X_DEFAULT_SPI_CHANNEL); @@ -117,7 +126,7 @@ static int __parse_endpoint_param_for_mcp300x(device_mcp300x_data_t* user_data, if (ep == NULL) continue; if (endpoint_config_str[i] != NULL) { - strcpy(szText, endpoint_config_str[i]); + strcpy(szText, endpoint_config_str[i]); pText = szText; cfgtype_p = strsep(&pText, ","); @@ -200,6 +209,26 @@ static int __parse_endpoint_param_for_mcp300x(device_mcp300x_data_t* user_data, return 0; } +#if defined(USE_SPI_DIRECT) +static int __mcp300x_spi_read(uint8_t adc_channel) +{ + unsigned char buf[3] = {0x01, (0x08 | adc_channel) << 4, 0}; + spi_transfern(buf, 3); + return (int)(((unsigned short)buf[1] & 0x3) << 8 | buf[2]); +} +#else +static int __mcp300x_spi_read(struct spi_device *spi, uint8_t adc_channel) +{ + unsigned char buf[3] = {0x01, (0x08 | adc_channel) << 4, 0}; + struct spi_transfer t = { + .tx_buf = buf, + .rx_buf = buf, + .len = 3, + }; + int r = spi_sync_transfer(spi, &t, 1); + return (r >= 0)? (int)(((unsigned short)buf[1] & 0x3) << 8 | buf[2]) : r; +} +#endif // device_config_str : spi_channel, value_weight_percent, sampling_count // endpoint_config_str : endpoint, config_type (default | custom), ... @@ -215,7 +244,7 @@ static int init_input_device_for_mcp300x(void* device_desc_data, input_device_da device_mcp300x_data_t* user_data; int result; int i; - + user_data = (device_mcp300x_data_t *)kzalloc(sizeof(device_mcp300x_data_t) + sizeof(device_mcp300x_index_table_t) * (device_data->target_endpoint_count - 1), GFP_KERNEL); user_data->device_desc_data = *(device_mcp300x_desc_config_t *)device_desc_data; @@ -243,11 +272,35 @@ static int init_input_device_for_mcp300x(void* device_desc_data, input_device_da static void start_input_device_for_mcp300x(input_device_data_t *device_data) { - // device_mcp300x_data_t *user_data = (device_mcp300x_data_t *)device_data->data; +#if !defined(USE_SPI_DIRECT) + device_mcp300x_data_t *user_data = (device_mcp300x_data_t *)device_data->data; +#endif +#if defined(USE_SPI_DIRECT) spi_init(bcm_peri_base_probe(), 0xB0); spi_setClockDivider(256); +#else + struct spi_board_info spi_device_info = { + .modalias = "mcp300x", + .max_speed_hz = 1 * 1000 * 1000, // speed your device (slave) can handle + .bus_num = 0, // SPI 0 + .chip_select = user_data->device_cfg.spi_channel, + .mode = SPI_MODE_0 // SPI mode 0 + }; + + struct spi_master* master = spi_busnum_to_master(spi_device_info.bus_num); + if (IS_ERR_OR_NULL(master)) { + pr_err("SPI Master {%d} not found.\n", spi_device_info.bus_num); + return; + } + + user_data->spi = spi_new_device(master, &spi_device_info); + if (IS_ERR_OR_NULL(user_data->spi)) { + pr_err("spi open device error {%d}.\n", user_data->device_cfg.spi_channel); + return; + } +#endif device_data->is_opend = TRUE; } @@ -256,20 +309,20 @@ static void start_input_device_for_mcp300x(input_device_data_t *device_data) static void check_input_device_for_mcp300x(input_device_data_t *device_data) { int i, j, k, cnt; - int spi_channel; - char resultA, resultB; - unsigned io_value; device_mcp300x_data_t *user_data = (device_mcp300x_data_t *)device_data->data; int sampling_count, value_weight, prev_weight; +#if !defined(USE_SPI_DIRECT) + struct spi_device* spi; +#endif if (user_data == NULL) return; - spi_channel = user_data->device_cfg.spi_channel; - - io_value = ((unsigned)resultB << 8) | (unsigned)resultA; - +#if defined(USE_SPI_DIRECT) spi_begin(); - spi_chipSelect(spi_channel); + spi_chipSelect(user_data->device_cfg.spi_channel); +#else + spi = user_data->spi; +#endif sampling_count = user_data->device_cfg.sampling_count; value_weight = user_data->device_cfg.value_weight_percent; @@ -279,24 +332,26 @@ static void check_input_device_for_mcp300x(input_device_data_t *device_data) input_endpoint_data_t* endpoint = device_data->target_endpoints[i]; device_mcp300x_index_table_t* table = &user_data->button_cfgs[i]; device_mcp300x_index_item_t* btndef = &table->buttondef[table->button_start_index]; - unsigned char wrbuf[3] = { 0x01, 0, 0x00 }; - unsigned char rdbuf[3]; int v, v0, md; cnt = table->pin_count; for (j = 0; j < cnt; j++ ){ if (btndef->abs_input >= 0 && btndef->adc_channel >= 0) { - wrbuf[1] = (0x08 | btndef->adc_channel) << 4; - if (value_weight >= 100) { - spi_transfernb(wrbuf, rdbuf, 3); - v = (int)(((unsigned short)rdbuf[1] & 0x3) << 8 | rdbuf[2]); +#if defined(USE_SPI_DIRECT) + v = __mcp300x_spi_read(btndef->adc_channel); +#else + v = __mcp300x_spi_read(spi, btndef->adc_channel); +#endif } else { v = user_data->currentAdcValue[btndef->adc_channel]; for (k = 0; k < sampling_count; k++) { - spi_transfernb(wrbuf, rdbuf, 3); - v0 = (int)(((unsigned short)rdbuf[1] & 0x3) << 8 | rdbuf[2]); +#if defined(USE_SPI_DIRECT) + v0 = __mcp300x_spi_read(btndef->adc_channel); +#else + v0 = __mcp300x_spi_read(spi, btndef->adc_channel); +#endif v = (v0 * value_weight + v * prev_weight) / 100; } user_data->currentAdcValue[btndef->adc_channel] = v; @@ -316,15 +371,28 @@ static void check_input_device_for_mcp300x(input_device_data_t *device_data) } } +#if defined(USE_SPI_DIRECT) spi_end(); +#endif } static void stop_input_device_for_mcp300x(input_device_data_t *device_data) { +#if !defined(USE_SPI_DIRECT) + device_mcp300x_data_t *user_data = (device_mcp300x_data_t *)device_data->data; +#endif + device_data->is_opend = FALSE; - + +#if defined(USE_SPI_DIRECT) spi_close(); +#else + if (!IS_ERR_OR_NULL(user_data->spi)) { + spi_unregister_device(user_data->spi); + user_data->spi = NULL; + } +#endif } diff --git a/device_gpio_rpi2.c b/device_gpio_rpi2.c index 4cf9e70..95f9c66 100644 --- a/device_gpio_rpi2.c +++ b/device_gpio_rpi2.c @@ -2,14 +2,14 @@ * Copyright (C) 2021 Ju, Gyeong-min ********************************************************************************/ +#include "build_cfg.h" + #include #include #include #include "gpio_util.h" #include "parse_util.h" -//#define GPIO_GET(i) GPIO_READ(i) -//#define GPIO_GET_VALUE(i) gpio_get_value(i) #define INPUT_GPIO_CONFIG_TYPE_INDEX (0) #define INPUT_GPIO_CONFIG_TYPE_KEYCODE (1) @@ -73,7 +73,7 @@ static const device_gpio_index_table_t default_input2_gpio_config = { {7, BTN_TL, 1}, {8, BTN_TR, 1}, {3, BTN_MODE, 1}, - }, + }, INPUT_GPIO_DEFAULT_KEYCODE_TABLE_ITEM_COUNT, 0 }; @@ -87,7 +87,7 @@ static int __parse_device_param_for_gpio(device_gpio_data_t* user_data, char* de char* temp_p; if (device_config_str != NULL) { - strcpy(szText, device_config_str); + strcpy(szText, device_config_str); pText = szText; temp_p = strsep(&pText, ","); @@ -124,7 +124,7 @@ static int __parse_endpoint_param_for_gpio(device_gpio_data_t* user_data, char* if (ep == NULL) continue; if (endpoint_config_str[i] != NULL) { - strcpy(szText, endpoint_config_str[i]); + strcpy(szText, endpoint_config_str[i]); pText = szText; cfgtype_p = strsep(&pText, ","); @@ -208,7 +208,7 @@ static int __parse_endpoint_param_for_gpio(device_gpio_data_t* user_data, char* } -// device_config_str : +// device_config_str : // endpoint_config_str : endpoint, config_type (default1 | default2 | custom), ... // default1: pin_count, start_index // default2: pin_count, start_index @@ -278,10 +278,10 @@ static void check_input_device_for_gpio(input_device_data_t* device_data) int i, j; device_gpio_index_table_t* table; device_gpio_data_t* user_data = (device_gpio_data_t *)device_data->data; - + if (user_data == NULL) return; table = user_data->button_cfgs; - + for (i = 0; i < device_data->target_endpoint_count; i++) { input_endpoint_data_t* endpoint = device_data->target_endpoints[i]; device_gpio_index_item_t* item = &table->buttondef[table->button_start_index]; @@ -312,5 +312,5 @@ int register_input_device_for_gpio(input_device_type_desc_t *device_desc) device_desc->start_input_dev = start_input_device_for_gpio; device_desc->check_input_dev = check_input_device_for_gpio; device_desc->stop_input_dev = stop_input_device_for_gpio; - return 0; + return 0; } diff --git a/device_mcp23017.c b/device_mcp23017.c index 658c428..b2d1574 100644 --- a/device_mcp23017.c +++ b/device_mcp23017.c @@ -2,6 +2,8 @@ * Copyright (C) 2021 Ju, Gyeong-min ********************************************************************************/ +#include "build_cfg.h" + #include #include #include @@ -9,12 +11,13 @@ #include #include "bcm_peri.h" #include "gpio_util.h" +#if defined(USE_I2C_DIRECT) #include "i2c_util.h" +#else +#include +#endif #include "parse_util.h" -//#define GPIO_GET(i) GPIO_READ(i) -//#define GPIO_GET_VALUE(i) getGpio(i) -//#define GPIO_SET_VALUE(i,v) setGpio((i), (v)) //#define MAX_ADDR_IO_COUNT (6) @@ -54,6 +57,9 @@ typedef struct tag_device_mcp23017_index_table { // device.data에 할당 될 구조체 typedef struct tag_device_mcp23017_data { device_mcp23017_config_t device_cfg; +#if !defined(USE_I2C_DIRECT) + struct i2c_client *i2c; +#endif device_mcp23017_index_table_t button_cfgs[1]; } device_mcp23017_data_t; @@ -65,7 +71,7 @@ static const device_mcp23017_index_table_t default_input_mcp23017_config = { {ABS_Y, -DEFAULT_INPUT_ABS_MAX_VALUE}, {ABS_Y, DEFAULT_INPUT_ABS_MAX_VALUE}, {ABS_X, -DEFAULT_INPUT_ABS_MAX_VALUE}, - {ABS_X, DEFAULT_INPUT_ABS_MAX_VALUE}, + {ABS_X, DEFAULT_INPUT_ABS_MAX_VALUE}, {BTN_START, 1}, {BTN_SELECT, 1}, {BTN_A, 1}, @@ -78,7 +84,7 @@ static const device_mcp23017_index_table_t default_input_mcp23017_config = { {BTN_TL2, 1}, {BTN_TR2, 1}, {BTN_TRIGGER, 1} - }, + }, INPUT_MCP23017_DEFAULT_KEYCODE_TABLE_ITEM_COUNT, 0, 0 }; @@ -91,7 +97,7 @@ static int __parse_device_param_for_mcp23017(device_mcp23017_data_t* user_data, char* pText; if (device_config_str != NULL) { - strcpy(szText, device_config_str); + strcpy(szText, device_config_str); pText = szText; user_data->device_cfg.i2c_addr = parse_number(&pText, ",", 0, MCP23017_DEFAULT_I2C_ADDR); @@ -127,7 +133,7 @@ static int __parse_endpoint_param_for_mcp23017(device_mcp23017_data_t* user_data if (ep == NULL) continue; if (endpoint_config_str[i] != NULL) { - strcpy(szText, endpoint_config_str[i]); + strcpy(szText, endpoint_config_str[i]); pText = szText; cfgtype_p = strsep(&pText, ","); @@ -205,7 +211,6 @@ static int __parse_endpoint_param_for_mcp23017(device_mcp23017_data_t* user_data return 0; } - // device_config_str : i2c_addr, io_count // endpoint_config_str : endpoint, config_type (default | custom), ... // default: pin_count, start_index, io_skip_count @@ -219,7 +224,7 @@ static int init_input_device_for_mcp23017(void* device_desc_data, input_device_d { device_mcp23017_data_t* user_data; int result; - + user_data = (device_mcp23017_data_t *)kzalloc(sizeof(device_mcp23017_data_t) + sizeof(device_mcp23017_index_table_t) * (device_data->target_endpoint_count - 1), GFP_KERNEL); result = __parse_device_param_for_mcp23017(user_data, device_config_str); @@ -247,10 +252,12 @@ static int init_input_device_for_mcp23017(void* device_desc_data, input_device_d static void start_input_device_for_mcp23017(input_device_data_t *device_data) { device_mcp23017_data_t *user_data = (device_mcp23017_data_t *)device_data->data; + +#if defined(USE_I2C_DIRECT) char outval; i2c_init(bcm_peri_base_probe(), 0xB0); - udelay(1000); + //udelay(1000); // outval = 0x00; // i2c_write(user_data->device_cfg.i2c_addr, MCP23017_IOCON, &outval, 1); @@ -259,27 +266,51 @@ static void start_input_device_for_mcp23017(input_device_data_t *device_data) outval = 0xFF; // Put all GPIOA inputs on MCP23017 in INPUT mode i2c_write(user_data->device_cfg.i2c_addr, MCP23017_GPIOA_MODE, &outval, 1); - udelay(1000); + //udelay(1000); // read one byte on GPIOA (for dummy) - i2c_read_1byte(user_data->device_cfg.i2c_addr, MCP23017_GPIOA_READ); - udelay(1000); + //i2c_read_1byte(user_data->device_cfg.i2c_addr, MCP23017_GPIOA_READ); + //udelay(1000); // Put all inputs on MCP23017 in pullup mode i2c_write(user_data->device_cfg.i2c_addr, MCP23017_GPIOA_PULLUPS_MODE, &outval, 1); - udelay(1000); + //udelay(1000); // Put all GPIOB inputs on MCP23017 in INPUT mode i2c_write(user_data->device_cfg.i2c_addr, MCP23017_GPIOB_MODE, &outval, 1); - udelay(1000); + //udelay(1000); // read one byte on GPIOB (for dummy) - i2c_read_1byte(user_data->device_cfg.i2c_addr, MCP23017_GPIOB_READ); - udelay(1000); + //i2c_read_1byte(user_data->device_cfg.i2c_addr, MCP23017_GPIOB_READ); + //udelay(1000); // Put all inputs on MCP23017 in pullup mode i2c_write(user_data->device_cfg.i2c_addr, MCP23017_GPIOB_PULLUPS_MODE, &outval, 1); - udelay(1000); + //udelay(1000); +#else + struct i2c_board_info i2c_board_info = { + I2C_BOARD_INFO("mcp23017", user_data->device_cfg.i2c_addr) + }; + struct i2c_adapter* i2c_adap = i2c_get_adapter(1); + if (i2c_adap == NULL) { + pr_err("i2c adapter open erro {%d}", 1); + return; + } + user_data->i2c = i2c_new_client_device(i2c_adap, &i2c_board_info); + if (IS_ERR_OR_NULL(user_data->i2c)) { + pr_err("i2c device open erro {%d}", user_data->device_cfg.i2c_addr); + return; + } + i2c_put_adapter(i2c_adap); + + // Put all GPIOA pins to input mode & all pullup + i2c_smbus_write_byte_data(user_data->i2c, MCP23017_GPIOA_MODE, 0xFF); + i2c_smbus_write_byte_data(user_data->i2c, MCP23017_GPIOA_PULLUPS_MODE, 0xFF); + + // Put all GPIOB pins to input mode & all pullup + i2c_smbus_write_byte_data(user_data->i2c, MCP23017_GPIOB_MODE, 0xFF); + i2c_smbus_write_byte_data(user_data->i2c, MCP23017_GPIOB_PULLUPS_MODE, 0xFF); +#endif device_data->is_opend = TRUE; } @@ -288,20 +319,31 @@ static void start_input_device_for_mcp23017(input_device_data_t *device_data) static void check_input_device_for_mcp23017(input_device_data_t *device_data) { int i, j, cnt; - int i2c_addr, io_count; + int io_count; +#if defined(USE_I2C_DIRECT) + int i2c_addr; +#endif char resultA, resultB; unsigned io_value; device_mcp23017_data_t *user_data = (device_mcp23017_data_t *)device_data->data; if (user_data == NULL) return; - i2c_addr = user_data->device_cfg.i2c_addr; io_count = user_data->device_cfg.io_count; - if (io_count <= 0) return; +#if defined(USE_I2C_DIRECT) + i2c_addr = user_data->device_cfg.i2c_addr; i2c_read(i2c_addr, MCP23017_GPIOA_READ, &resultA, 1); i2c_read(i2c_addr, MCP23017_GPIOB_READ, &resultB, 1); +#else + if (!IS_ERR_OR_NULL(user_data->i2c)) { + resultA = i2c_smbus_read_byte_data(user_data->i2c, MCP23017_GPIOA_READ); + resultB = i2c_smbus_read_byte_data(user_data->i2c, MCP23017_GPIOB_READ); + } else { + resultA = resultB = 0xFF; + } +#endif io_value = ((unsigned)resultB << 8) | (unsigned)resultA; @@ -331,9 +373,20 @@ static void check_input_device_for_mcp23017(input_device_data_t *device_data) static void stop_input_device_for_mcp23017(input_device_data_t *device_data) { +#if !defined(USE_I2C_DIRECT) + device_mcp23017_data_t *user_data = (device_mcp23017_data_t *)device_data->data; +#endif + device_data->is_opend = FALSE; +#if defined(USE_I2C_DIRECT) i2c_close(); +#else + if (!IS_ERR_OR_NULL(user_data->i2c)) { + i2c_unregister_device(user_data->i2c); + user_data->i2c = NULL; + } +#endif } diff --git a/device_mcp23s17.c b/device_mcp23s17.c index f40b9e0..2fed1f2 100644 --- a/device_mcp23s17.c +++ b/device_mcp23s17.c @@ -2,6 +2,8 @@ * Copyright (C) 2021 Ju, Gyeong-min ********************************************************************************/ +#include "build_cfg.h" + #include #include #include @@ -9,12 +11,13 @@ #include #include "bcm_peri.h" #include "gpio_util.h" +#if defined(USE_SPI_DIRECT) #include "spi_util.h" +#else +#include +#endif #include "parse_util.h" -//#define GPIO_GET(i) GPIO_READ(i) -//#define GPIO_GET_VALUE(i) getGpio(i) -//#define GPIO_SET_VALUE(i,v) setGpio((i), (v)) //#define MAX_ADDR_IO_COUNT (6) #define MCP23S17_DEFAULT_SPI_CHANNEL (0) @@ -38,7 +41,7 @@ #define MCP23S17_IOCON (0x0A) // MCP23x17 Configuration Register // (0x0B) // Also Configuration Register #define MCP23S17_GPPUA (0x0C) // MCP23x17 Weak Pull-Up Resistor Register -#define MCP23S17_GPPUB (0x0D) // INPUT ONLY: 0 = No Internal 100k Pull-Up (default) 1 = Internal 100k Pull-Up +#define MCP23S17_GPPUB (0x0D) // INPUT ONLY: 0 = No Internal 100k Pull-Up (default) 1 = Internal 100k Pull-Up #define MCP23S17_INTFA (0x0E) // MCP23x17 Interrupt Flag Register #define MCP23S17_INTFB (0x0F) // READ ONLY: 1 = This Pin Triggered the Interrupt #define MCP23S17_INTCAPA (0x10) // MCP23x17 Interrupt Captured Value for Port Register @@ -69,8 +72,11 @@ typedef struct tag_device_mcp23s17_index_table { // device.data에 할당 될 구조체 typedef struct tag_device_mcp23s17_data { - device_mcp23s17_config_t device_cfg; - device_mcp23s17_index_table_t button_cfgs[1]; + device_mcp23s17_config_t device_cfg; +#if !defined(USE_SPI_DIRECT) + struct spi_device* spi; +#endif + device_mcp23s17_index_table_t button_cfgs[1]; } device_mcp23s17_data_t; @@ -81,7 +87,7 @@ static const device_mcp23s17_index_table_t default_input_mcp23s17_config = { {ABS_Y, -DEFAULT_INPUT_ABS_MAX_VALUE}, {ABS_Y, DEFAULT_INPUT_ABS_MAX_VALUE}, {ABS_X, -DEFAULT_INPUT_ABS_MAX_VALUE}, - {ABS_X, DEFAULT_INPUT_ABS_MAX_VALUE}, + {ABS_X, DEFAULT_INPUT_ABS_MAX_VALUE}, {BTN_START, 1}, {BTN_SELECT, 1}, {BTN_A, 1}, @@ -94,7 +100,7 @@ static const device_mcp23s17_index_table_t default_input_mcp23s17_config = { {BTN_TL2, 1}, {BTN_TR2, 1}, {BTN_TRIGGER, 1} - }, + }, INPUT_MCP23S17_DEFAULT_KEYCODE_TABLE_ITEM_COUNT, 0, 0 }; @@ -107,7 +113,7 @@ static int __parse_device_param_for_mcp23s17(device_mcp23s17_data_t* user_data, char* pText; if (device_config_str != NULL) { - strcpy(szText, device_config_str); + strcpy(szText, device_config_str); pText = szText; user_data->device_cfg.spi_channel = parse_number(&pText, ",", 0, MCP23S17_DEFAULT_SPI_CHANNEL); @@ -143,7 +149,7 @@ static int __parse_endpoint_param_for_mcp23s17(device_mcp23s17_data_t* user_data if (ep == NULL) continue; if (endpoint_config_str[i] != NULL) { - strcpy(szText, endpoint_config_str[i]); + strcpy(szText, endpoint_config_str[i]); pText = szText; cfgtype_p = strsep(&pText, ","); @@ -235,7 +241,7 @@ static int init_input_device_for_mcp23s17(void* device_desc_data, input_device_d { device_mcp23s17_data_t* user_data; int result; - + user_data = (device_mcp23s17_data_t *)kzalloc(sizeof(device_mcp23s17_data_t) + sizeof(device_mcp23s17_index_table_t) * (device_data->target_endpoint_count - 1), GFP_KERNEL); result = __parse_device_param_for_mcp23s17(user_data, device_config_str); @@ -260,17 +266,98 @@ static int init_input_device_for_mcp23s17(void* device_desc_data, input_device_d } +#if defined(USE_SPI_DIRECT) +static uint8_t __mcp23s17_spi_read(uint8_t cmd) +{ + unsigned char buf[3] = {0x41, cmd, 0}; + spi_transfern(buf, 3); + return buf[2]; +} + +static void __mcp23s17_spi_write(uint8_t cmd, uint8_t value) +{ + unsigned char buf[3] = {0x40, cmd, value}; + spi_transfern(buf, 3); +} +#else +static uint8_t __mcp23s17_spi_read(struct spi_device *spi, uint8_t cmd) +{ + unsigned char buf[3] = {0x41, cmd, 0}; + struct spi_transfer t = { + .tx_buf = buf, + .rx_buf = buf, + .len = 3, + }; + int r = spi_sync_transfer(spi, &t, 1); + return (r >= 0) ? buf[2] : 0xFF; +} + +static int __mcp23s17_spi_write(struct spi_device *spi, uint8_t cmd, uint8_t value) +{ + unsigned char buf[3] = {0x40, cmd, value}; + return spi_write(spi, buf, 3); +} +#endif + + static void start_input_device_for_mcp23s17(input_device_data_t *device_data) { - //device_mcp23s17_data_t *user_data = (device_mcp23s17_data_t *)device_data->data; - //char FF = 0xFF; + device_mcp23s17_data_t *user_data = (device_mcp23s17_data_t *)device_data->data; +#if defined(USE_SPI_DIRECT) spi_init(bcm_peri_base_probe(), 0xB0); - spi_setClockDivider(256); + //udelay(100); + + spi_begin(); + spi_chipSelect(user_data->device_cfg.spi_channel); + + __mcp23s17_spi_write(MCP23017_GPIOA_MODE, 0xFF); + //udelay(100); - // To-do: 풀업시켜 줘야 한다. - // ... + // read one byte on GPIOA (for dummy) + //__mcp23s17_spi_read(MCP23017_GPIOA_READ); + //udelay(100); + + __mcp23s17_spi_write(MCP23017_GPIOA_PULLUPS_MODE, 0xFF); + //udelay(100); + + __mcp23s17_spi_write(MCP23017_GPIOB_MODE, 0xFF); + //udelay(100); + + // read one byte on GPIOA (for dummy) + //__mcp23s17_spi_read(MCP23017_GPIOB_READ); + //udelay(100); + + __mcp23s17_spi_write(MCP23017_GPIOB_PULLUPS_MODE, 0xFF); + + spi_end(); +#else + struct spi_board_info spi_device_info = { + .modalias = "mcp23s17", + .max_speed_hz = 1 * 1000 * 1000, // speed your device (slave) can handle + .bus_num = 0, // SPI 0 + .chip_select = user_data->device_cfg.spi_channel, + .mode = SPI_MODE_0 // SPI mode 0 + }; + + struct spi_master* master = spi_busnum_to_master(spi_device_info.bus_num); + if (IS_ERR_OR_NULL(master)) { + pr_err("SPI Master {%d} not found.\n", spi_device_info.bus_num); + return; + } + + user_data->spi = spi_new_device(master, &spi_device_info); + if (IS_ERR_OR_NULL(user_data->spi)) { + pr_err("spi open device error {%d}.\n", user_data->device_cfg.spi_channel); + return; + } + + __mcp23s17_spi_write(user_data->spi, MCP23017_GPIOA_MODE, 0xFF); + __mcp23s17_spi_write(user_data->spi, MCP23017_GPIOA_PULLUPS_MODE, 0xFF); + __mcp23s17_spi_write(user_data->spi, MCP23017_GPIOB_MODE, 0xFF); + __mcp23s17_spi_write(user_data->spi, MCP23017_GPIOB_PULLUPS_MODE, 0xFF); +#endif device_data->is_opend = TRUE; } @@ -279,30 +366,34 @@ static void start_input_device_for_mcp23s17(input_device_data_t *device_data) static void check_input_device_for_mcp23s17(input_device_data_t *device_data) { int i, j, cnt; - int spi_channel, io_count; - //char resultA, resultB; + int io_count; + uint8_t resultA, resultB; unsigned io_value; device_mcp23s17_data_t *user_data = (device_mcp23s17_data_t *)device_data->data; if (user_data == NULL) return; - spi_channel = user_data->device_cfg.spi_channel; io_count = user_data->device_cfg.io_count; if (io_count <= 0) return; +#if defined(USE_SPI_DIRECT) spi_begin(); - spi_chipSelect(spi_channel); + spi_chipSelect(user_data->device_cfg.spi_channel); - { - unsigned char buf[3] = {0x41, MCP23S17_GPIOA, 0}; - unsigned char buf2[3] = {0x41, MCP23S17_GPIOB, 0}; - spi_transfern(buf, 3); - spi_transfern(buf2, 3); - io_value = buf[2] << 8 | buf2[2]; - } + resultA = __mcp23s17_spi_read(MCP23S17_GPIOA); + resultB = __mcp23s17_spi_read(MCP23S17_GPIOB); spi_end(); +#else + if (!IS_ERR_OR_NULL(user_data->spi)) { + resultA = __mcp23s17_spi_read(user_data->spi, MCP23S17_GPIOA); + resultB = __mcp23s17_spi_read(user_data->spi, MCP23S17_GPIOB); + } else { + resultA = resultB = 0xFF; + } +#endif + io_value = ((unsigned)resultB << 8) | (unsigned)resultA; for (i = 0; i < device_data->target_endpoint_count; i++) { input_endpoint_data_t* endpoint = device_data->target_endpoints[i]; @@ -330,9 +421,20 @@ static void check_input_device_for_mcp23s17(input_device_data_t *device_data) static void stop_input_device_for_mcp23s17(input_device_data_t *device_data) { +#if !defined(USE_SPI_DIRECT) + device_mcp23s17_data_t *user_data = (device_mcp23s17_data_t *)device_data->data; +#endif + device_data->is_opend = FALSE; - + +#if defined(USE_SPI_DIRECT) spi_close(); +#else + if (!IS_ERR_OR_NULL(user_data->spi)) { + spi_unregister_device(user_data->spi); + user_data->spi = NULL; + } +#endif } diff --git a/device_mux.c b/device_mux.c index 435d0fd..383a67c 100644 --- a/device_mux.c +++ b/device_mux.c @@ -2,6 +2,8 @@ * Copyright (C) 2021 Ju, Gyeong-min ********************************************************************************/ +#include "build_cfg.h" + #include #include #include @@ -10,9 +12,6 @@ #include "gpio_util.h" #include "parse_util.h" -//#define GPIO_GET(i) GPIO_READ(i) -//#define GPIO_GET_VALUE(i) getGpio(i) -//#define GPIO_SET_VALUE(i,v) setGpio((i), (v)) //#define DEFAULT_MUX_BUTTON_COUNT (16) @@ -20,7 +19,7 @@ // {ABS_Y, -1}, // {ABS_Y, 1}, // {ABS_X, -1}, - // {ABS_X, 1}, + // {ABS_X, 1}, // {BTN_START, 1}, // {BTN_SELECT, 1}, // {BTN_A, 1}, @@ -74,7 +73,7 @@ static const device_mux_index_table_t default_input_mux_config = { {ABS_Y, -DEFAULT_INPUT_ABS_MAX_VALUE}, {ABS_Y, DEFAULT_INPUT_ABS_MAX_VALUE}, {ABS_X, -DEFAULT_INPUT_ABS_MAX_VALUE}, - {ABS_X, DEFAULT_INPUT_ABS_MAX_VALUE}, + {ABS_X, DEFAULT_INPUT_ABS_MAX_VALUE}, {BTN_START, 1}, {BTN_SELECT, 1}, {BTN_A, 1}, @@ -87,7 +86,7 @@ static const device_mux_index_table_t default_input_mux_config = { {BTN_TL2, 1}, {BTN_TR2, 1}, {BTN_TRIGGER, 1} - }, + }, INPUT_MUX_DEFAULT_KEYCODE_TABLE_ITEM_COUNT, 0, 0 }; @@ -101,7 +100,7 @@ static int __parse_device_param_for_mux(device_mux_data_t* user_data, char* devi char* pText; char* temp_p, *block_p; - strcpy(szText, device_config_str); + strcpy(szText, device_config_str); pText = szText; temp_p = strsep(&pText, ","); @@ -148,7 +147,7 @@ static int __parse_endpoint_param_for_mux(device_mux_data_t* user_data, char* en if (ep == NULL) continue; if (endpoint_config_str[i] != NULL) { - strcpy(szText, endpoint_config_str[i]); + strcpy(szText, endpoint_config_str[i]); pText = szText; cfgtype_p = strsep(&pText, ","); @@ -239,7 +238,7 @@ static int init_input_device_for_mux(void* device_desc_data, input_device_data_t device_mux_data_t* user_data; int result; //int i, all_io_count; - + if (device_config_str == NULL || strcmp(device_config_str, "") == 0) return -EINVAL; user_data = (device_mux_data_t *)kzalloc(sizeof(device_mux_data_t) + sizeof(device_mux_index_table_t) * (device_data->target_endpoint_count - 1), GFP_KERNEL); @@ -317,7 +316,7 @@ static void check_input_device_for_mux(input_device_data_t *device_data) if (cs_gpio != -1) { gpio_set_value(cs_gpio, user_data->device_cfg.enable_high == 0 ? 0 : 1); udelay(5); - } + } addr = 0; @@ -356,7 +355,7 @@ static void check_input_device_for_mux(input_device_data_t *device_data) if (cs_gpio != -1) { gpio_set_value(cs_gpio, user_data->device_cfg.enable_high == 0 ? 1 : 0); - } + } } diff --git a/device_rotary_am_spinin.c b/device_rotary_am_spinin.c index 06b74fa..c545a70 100644 --- a/device_rotary_am_spinin.c +++ b/device_rotary_am_spinin.c @@ -2,6 +2,8 @@ * Copyright (C) 2021 Ju, Gyeong-min ********************************************************************************/ +#include "build_cfg.h" + #include #include #include @@ -9,7 +11,16 @@ #include #include "bcm_peri.h" #include "gpio_util.h" +#if defined(USE_I2C_DIRECT) #include "i2c_util.h" +#else +#include +#endif +#if defined(USE_SPI_DIRECT) +#include "spi_util.h" +#else +#include +#endif #include "parse_util.h" @@ -26,7 +37,7 @@ // default i2c addr #define AM_SPININ_DEFAULT_I2C_ADDR (0x34) -#define INPUT_AM_SPININ_DEFAULT_PPR (360) +#define INPUT_AM_SPININ_DEFAULT_PPR (400) #define INPUT_AM_SPININ_DEFAULT_MIN_VALUE (-5000) #define INPUT_AM_SPININ_DEFAULT_MAX_VALUE (5000) #define INPUT_AM_SPININ_DEFAULT_SAMPLE_RATE (10) @@ -55,8 +66,14 @@ typedef struct tag_device_am_spinin_index_table { // device.data에 할당 될 구조체 typedef struct tag_device_am_spinin_data { - device_am_spinin_config_t device_cfg; - device_am_spinin_index_table_t button_cfgs[1]; + device_am_spinin_config_t device_cfg; +#if !defined(USE_I2C_DIRECT) + struct i2c_client* i2c; +#endif +#if !defined(USE_SPI_DIRECT) + struct spi_device* spi; +#endif + device_am_spinin_index_table_t button_cfgs[1]; } device_am_spinin_data_t; @@ -65,7 +82,7 @@ typedef struct tag_device_am_spinin_data { static const device_am_spinin_index_table_t default_input_am_spinin_config = { { {REL_X, 0} - }, + }, INPUT_AM_SPININ_DEFAULT_KEYCODE_TABLE_ITEM_COUNT, 0, 0 }; @@ -79,7 +96,7 @@ static int __parse_device_param_for_am_spinin(device_am_spinin_data_t* user_data if (device_config_str != NULL) { char str[10]; - strcpy(szText, device_config_str); + strcpy(szText, device_config_str); pText = szText; if (parse_string(str, 10, &pText, ",", "i2c") == NULL) { @@ -130,7 +147,7 @@ static int __parse_endpoint_param_for_am_spinin(device_am_spinin_data_t* user_da if (ep == NULL) continue; if (endpoint_config_str[i] != NULL) { - strcpy(szText, endpoint_config_str[i]); + strcpy(szText, endpoint_config_str[i]); pText = szText; cfgtype_p = strsep(&pText, ","); @@ -209,7 +226,8 @@ static int __parse_endpoint_param_for_am_spinin(device_am_spinin_data_t* user_da } -static short __spi_trans(char cmd, short value) +#if defined(USE_SPI_DIRECT) +static short __spi_trans_for_am_spinin(char cmd, short value) { unsigned char buf[3]; buf[0] = cmd; @@ -218,6 +236,18 @@ static short __spi_trans(char cmd, short value) spi_transfern(buf, 3); return (short)((unsigned short)buf[1] << 8 | buf[2]); } +#else +static short __spi_trans_for_am_spinin(struct spi_device* spi, char cmd, short value) +{ + unsigned char buf[3]; + buf[0] = cmd; + buf[1] = (value >> 8) & 0xFF; + buf[2] = value & 0xFF; + spi_write_then_read(spi, buf, 3, buf, 3); + return (short)((unsigned short)buf[1] << 8 | buf[2]); +} +#endif + // device_config_str : comm_type, addr, io_count // endpoint_config_str : endpoint, config_type (default | custom), ... @@ -232,7 +262,7 @@ static int init_input_device_for_am_spinin(void* device_desc_data, input_device_ { device_am_spinin_data_t* user_data; int result; - + user_data = (device_am_spinin_data_t *)kzalloc(sizeof(device_am_spinin_data_t) + sizeof(device_am_spinin_index_table_t) * (device_data->target_endpoint_count - 1), GFP_KERNEL); result = __parse_device_param_for_am_spinin(user_data, device_config_str); @@ -258,24 +288,76 @@ static void start_input_device_for_am_spinin(input_device_data_t *device_data) device_am_spinin_data_t *user_data = (device_am_spinin_data_t *)device_data->data; if (user_data->device_cfg.comm_type == AM_SPININ_COMM_I2C) { +#if defined(USE_I2C_DIRECT) i2c_init(bcm_peri_base_probe(), 0xB0); i2c_write_1word(user_data->device_cfg.addr, AM_SPININ_SET_MODE, 0); i2c_write_1word(user_data->device_cfg.addr, AM_SPININ_WRITE_VALUE, 0); i2c_write_1word(user_data->device_cfg.addr, AM_SPININ_SET_MIN_VALUE, user_data->device_cfg.min_value); i2c_write_1word(user_data->device_cfg.addr, AM_SPININ_SET_MAX_VALUE, user_data->device_cfg.max_value); i2c_write_1word(user_data->device_cfg.addr, AM_SPININ_SET_SAMPLERATE, user_data->device_cfg.sample_rate); +#else + struct i2c_board_info i2c_board_info = { + I2C_BOARD_INFO("am_spinin", user_data->device_cfg.addr) + }; + struct i2c_adapter* i2c_adap = i2c_get_adapter(1); + if (i2c_adap == NULL) { + pr_err("i2c adapter open erro {%d}", 1); + return; + } + user_data->i2c = i2c_new_client_device(i2c_adap, &i2c_board_info); + if (IS_ERR_OR_NULL(user_data->i2c)) { + pr_err("i2c device open erro {%d}", user_data->device_cfg.addr); + return; + } + i2c_put_adapter(i2c_adap); + + i2c_smbus_write_word_data(user_data->i2c, AM_SPININ_SET_MODE, 0); + i2c_smbus_write_word_data(user_data->i2c, AM_SPININ_WRITE_VALUE, 0); + i2c_smbus_write_word_data(user_data->i2c, AM_SPININ_SET_MIN_VALUE, user_data->device_cfg.min_value); + i2c_smbus_write_word_data(user_data->i2c, AM_SPININ_SET_MAX_VALUE, user_data->device_cfg.max_value); + i2c_smbus_write_word_data(user_data->i2c, AM_SPININ_SET_SAMPLERATE, user_data->device_cfg.sample_rate); +#endif } else if (user_data->device_cfg.comm_type == AM_SPININ_COMM_SPI) { +#if defined(USE_SPI_DIRECT) spi_init(bcm_peri_base_probe(), 0xB0); spi_setClockDivider(0x01); spi_setDataMode(0); spi_begin(); - __spi_trans(AM_SPININ_SET_MODE, 0); - __spi_trans(AM_SPININ_WRITE_VALUE, 0); - __spi_trans(AM_SPININ_SET_MIN_VALUE, user_data->device_cfg.min_value); - __spi_trans(AM_SPININ_SET_MAX_VALUE, user_data->device_cfg.max_value); - __spi_trans(AM_SPININ_SET_SAMPLERATE, user_data->device_cfg.sample_rate); + spi_chipSelect(user_data->device_cfg.addr); + __spi_trans_for_am_spinin(AM_SPININ_SET_MODE, 0); + __spi_trans_for_am_spinin(AM_SPININ_WRITE_VALUE, 0); + __spi_trans_for_am_spinin(AM_SPININ_SET_MIN_VALUE, user_data->device_cfg.min_value); + __spi_trans_for_am_spinin(AM_SPININ_SET_MAX_VALUE, user_data->device_cfg.max_value); + __spi_trans_for_am_spinin(AM_SPININ_SET_SAMPLERATE, user_data->device_cfg.sample_rate); spi_end(); +#else + struct spi_board_info spi_device_info = { + .modalias = "am_spinin", + .max_speed_hz = 1 * 1000 * 1000, // speed your device (slave) can handle + .bus_num = 0, // SPI 0 + .chip_select = user_data->device_cfg.addr, + .mode = SPI_MODE_0 // SPI mode 0 + }; + + struct spi_master* master = spi_busnum_to_master(spi_device_info.bus_num); + if (IS_ERR_OR_NULL(master)) { + pr_err("SPI Master {%d} not found.\n", spi_device_info.bus_num); + return; + } + + user_data->spi = spi_new_device(master, &spi_device_info); + if (IS_ERR_OR_NULL(user_data->spi)) { + pr_err("spi open device error {%d}.\n", user_data->device_cfg.addr); + return; + } + + __spi_trans_for_am_spinin(user_data->spi, AM_SPININ_SET_MODE, 0); + __spi_trans_for_am_spinin(user_data->spi, AM_SPININ_WRITE_VALUE, 0); + __spi_trans_for_am_spinin(user_data->spi, AM_SPININ_SET_MIN_VALUE, user_data->device_cfg.min_value); + __spi_trans_for_am_spinin(user_data->spi, AM_SPININ_SET_MAX_VALUE, user_data->device_cfg.max_value); + __spi_trans_for_am_spinin(user_data->spi, AM_SPININ_SET_SAMPLERATE, user_data->device_cfg.sample_rate); +#endif } else { return; } @@ -296,18 +378,44 @@ static void check_input_device_for_am_spinin(input_device_data_t *device_data) addr = user_data->device_cfg.addr; if (user_data->device_cfg.comm_type == AM_SPININ_COMM_I2C) { +#if defined(USE_I2C_DIRECT) value = i2c_raw_read_1word(addr); if (value != 0) { i2c_write_1word(addr, AM_SPININ_WRITE_VALUE, 0); } +#else + if (!IS_ERR_OR_NULL(user_data->i2c)) { + value = i2c_smbus_read_word_data(user_data->i2c, AM_SPININ_READ_VALUE); + if (value < 0) { + return; + } + value = (short)value; + if (value != 0) { + i2c_smbus_write_word_data(user_data->i2c, AM_SPININ_WRITE_VALUE, 0); + } + } else { + value = 0; + } +#endif } else if (user_data->device_cfg.comm_type == AM_SPININ_COMM_SPI) { +#if defined(USE_SPI_DIRECT) spi_begin(); spi_chipSelect(addr); - value = __spi_trans(AM_SPININ_READ_VALUE, 0); + value = __spi_trans_for_am_spinin(AM_SPININ_READ_VALUE, 0); if (value != 0) { - __spi_trans(AM_SPININ_WRITE_VALUE, 0); + __spi_trans_for_am_spinin(AM_SPININ_WRITE_VALUE, 0); } spi_end(); +#else + if (!IS_ERR_OR_NULL(user_data->spi)) { + value = __spi_trans_for_am_spinin(user_data->spi, AM_SPININ_READ_VALUE, 0); + if (value != 0) { + __spi_trans_for_am_spinin(user_data->spi, AM_SPININ_WRITE_VALUE, 0); + } + } else { + value = 0; + } +#endif } else { return; } @@ -330,10 +438,24 @@ static void stop_input_device_for_am_spinin(input_device_data_t *device_data) device_data->is_opend = FALSE; if (user_data->device_cfg.comm_type == AM_SPININ_COMM_I2C) { +#if defined(USE_I2C_DIRECT) i2c_close(); +#else + if (!IS_ERR_OR_NULL(user_data->i2c)) { + i2c_unregister_device(user_data->i2c); + user_data->i2c = NULL; + } +#endif } else if (user_data->device_cfg.comm_type == AM_SPININ_COMM_SPI) { +#if defined(USE_SPI_DIRECT) spi_close(); - } +#else + if (!IS_ERR_OR_NULL(user_data->spi)) { + spi_unregister_device(user_data->spi); + user_data->spi = NULL; + } +#endif + } } diff --git a/gpio_util.c b/gpio_util.c index 2410e58..2386c0e 100644 --- a/gpio_util.c +++ b/gpio_util.c @@ -49,7 +49,7 @@ volatile uint32_t* gpio = NULL; static int is_2711; -static void gpio_pullups_mask_2835(unsigned pull_ups) +static void gpio_pullups_mask_2835(unsigned pull_ups) { // *(gpio + 37) = 0x02; // udelay(10); @@ -67,13 +67,13 @@ static void gpio_pullups_mask_2835(unsigned pull_ups) } -static void gpio_pullups_2835(int gpio_map[], int count) +static void gpio_pullups_2835(int gpio_map[], int count) { gpio_pullups_mask_2835(gpio_get_pullup_mask(gpio_map, count)); } -static void gpio_pullups_2711(int gpio_map[], int count) +static void gpio_pullups_2711(int gpio_map[], int count) { int i; for (i = 0; i < count; i++) { @@ -89,7 +89,7 @@ static void gpio_pullups_2711(int gpio_map[], int count) } -void gpio_pullups(int gpio_map[], int count) +void gpio_pullups(int gpio_map[], int count) { if (is_2711) { gpio_pullups_2711(gpio_map, count); @@ -99,13 +99,13 @@ void gpio_pullups(int gpio_map[], int count) } -void gpio_as_input(int gpio_no) +void gpio_as_input(int gpio_no) { INP_GPIO(gpio_no); } -void gpio_as_output(int gpio_no) +void gpio_as_output(int gpio_no) { OUT_GPIO(gpio_no); } @@ -141,10 +141,10 @@ unsigned gpio_get_value(int gpio_no) } -void gpio_set_value(int gpio_no, int onoff) +void gpio_set_value(int gpio_no, int onoff) { - if (onoff) - GPIO_SET = ((unsigned)1 << gpio_no); + if (onoff) + GPIO_SET = ((unsigned)1 << gpio_no); else GPIO_CLR = ((unsigned)1 << gpio_no); } diff --git a/i2c_util.c b/i2c_util.c index c89404a..5dc40de 100644 --- a/i2c_util.c +++ b/i2c_util.c @@ -69,7 +69,7 @@ int i2c_init(u32 peri_base_addr, int size) INP_GPIO(2); SET_GPIO_ALT(2, 0); INP_GPIO(3); - SET_GPIO_ALT(3, 0); + SET_GPIO_ALT(3, 0); return 0; } @@ -86,16 +86,16 @@ void i2c_close(void) } -void wait_i2c_done(void) +void wait_i2c_done(void) { while (!(BSC1_S & BSC_S_DONE)) { - udelay(100); + udelay(1); } } // Function to write data to an I2C device via the FIFO. This doesn't refill the FIFO, so writes are limited to 16 bytes // including the register address. len specifies the number of bytes in the buffer. -void i2c_raw_write(char dev_addr, char *buf, int len) +void i2c_raw_write(char dev_addr, char *buf, int len) { int i; @@ -110,10 +110,12 @@ void i2c_raw_write(char dev_addr, char *buf, int len) BSC1_C = START_WRITE; // Start Write (see #define) wait_i2c_done(); + +// BSC1_S = CLEAR_STATUS; // Reset status bits (see #define) } // Function to read a number of bytes into a buffer from the FIFO of the I2C controller -void i2c_raw_read(char dev_addr, char *buf, int len) +void i2c_raw_read(char dev_addr, char *buf, int len) { int bufidx; @@ -133,11 +135,13 @@ void i2c_raw_read(char dev_addr, char *buf, int len) } wait_i2c_done(); + +// BSC1_S = CLEAR_STATUS; // Reset status bits (see #define) } // Function to write data to an I2C device via the FIFO. This doesn't refill the FIFO, so writes are limited to 16 bytes // including the register address. len specifies the number of bytes in the buffer. -void i2c_write(char dev_addr, char reg_addr, char *buf, int len) +void i2c_write(char dev_addr, char reg_addr, char *buf, int len) { int i; @@ -153,57 +157,59 @@ void i2c_write(char dev_addr, char reg_addr, char *buf, int len) BSC1_C = START_WRITE; // Start Write (see #define) wait_i2c_done(); + +// BSC1_S = CLEAR_STATUS; // Reset status bits (see #define) } // Function to read a number of bytes into a buffer from the FIFO of the I2C controller -void i2c_read(char dev_addr, char reg_addr, char *buf, int len) +void i2c_read(char dev_addr, char reg_addr, char *buf, int len) { i2c_raw_write(dev_addr, ®_addr, sizeof(char)); i2c_raw_read(dev_addr, buf, len); } -void i2c_write_1byte(char dev_addr, char reg_addr, char value) +void i2c_write_1byte(char dev_addr, char reg_addr, char value) { i2c_write(dev_addr, reg_addr, &value, sizeof(char)); } -void i2c_write_1word(char dev_addr, char reg_addr, short value) +void i2c_write_1word(char dev_addr, char reg_addr, short value) { i2c_write(dev_addr, reg_addr, (char *)&value, sizeof(short)); } -void i2c_raw_write_1byte(char dev_addr, char value) +void i2c_raw_write_1byte(char dev_addr, char value) { i2c_raw_write(dev_addr, &value, sizeof(char)); } -void i2c_raw_write_1word(char dev_addr, short value) +void i2c_raw_write_1word(char dev_addr, short value) { i2c_raw_write(dev_addr, (char *)&value, sizeof(short)); } -char i2c_read_1byte(char dev_addr, char reg_addr) +char i2c_read_1byte(char dev_addr, char reg_addr) { char value; i2c_read(dev_addr, reg_addr, &value, 1); return value; } -short i2c_read_1word(char dev_addr, char reg_addr) +short i2c_read_1word(char dev_addr, char reg_addr) { short value; i2c_read(dev_addr, reg_addr, (char *)&value, sizeof(short)); return value; } -char i2c_raw_read_1byte(char dev_addr) +char i2c_raw_read_1byte(char dev_addr) { char value; i2c_raw_read(dev_addr, &value, 1); return value; } -short i2c_raw_read_1word(char dev_addr) +short i2c_raw_read_1word(char dev_addr) { short value; i2c_raw_read(dev_addr, (char *)&value, sizeof(short)); diff --git a/images/74hc165_pinouts.png b/images/74hc165_pinouts.png index 11acb9ef51929d0bb27b76a9d9920a2bc8b443b7..39040fbf1aee9341b36cb66a285271dbcb0282f4 100644 GIT binary patch literal 4801 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 diff --git a/images/i2c-menu.png b/images/i2c-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..e593ff9b21e04677c878f84528158b84c2c6e0f3 GIT binary patch literal 7594 zcmb_>XH-*LyDlmvf=JkaLHY&-6d_6x5G2w>w^Tt9r1vgO2#|ngBOPKvX+qSf^dd+v z5d{$mMLN<;2tq;#5Fq`={hd4RH@2sTdK9CnIOLeKNlC5 z;Pq=JH@UbDBe=K@Apl1>J;q;ews3?;{>H}E*Nu(kLc{O*_y>7&aVbB6Ke>GEi?!$@ zE8BPSw+!`CE_sz$o-i?$dY5KeWBrrA@=|Wwu28<_sWWO>h``QHRCn3m>2+1ds}OPr zN0!!B-mb}?p34z+?1CLN1qGzxvY;CAqy-X%FoIYi3}W_>0`q z9@}((==j8Cip{Jk^hNYMY7D(%&U;|8r2Ag-1euqNeg7_EPU-lEH*bL`5u{|K;gVTZ zpBg4iP3PPe_VE+T0g>dCZX?OQU~F2_U-}kOx9u{wA7%9M<5dR&n!o4ouYixOeta%E z;h!m&bh_)w1Hj2!+15#q07Qv1icceDC|g3hEbeBn@aLbteR#lccP&enArwD2j`KMPG3P`HcqA>5~nTN)Om4n}!`(e@W*uPqmK^e>S@^e=#&{c6jCTLO7o| zZ1}Ws_$i3$pD4b$!L@?gPoGqW+E)iEW3op03 z)$qakXkhcOJ{-6Pr(1&q^!a_t>F11cVe>e6&X@Dyh#J^`&hj|491w@VhXdoN$h%Pe z$d;q^kjD)(6Rs2<>1!O}Xy`SE2rjPUpMM{R#FYPf!0F_Ryl!F2w|e-G<2=&2dn&VB zT#`!HO$_azKZ%9OQOi1inAQh8$*yR4N{q@cDw;YEZ{ zyr^8!HZgY0izb^GD+-VYn#iR9e>VVbVSqe0g3}x}p^}+siB6)L3y`B7t;x=fOvx9R9NjE_NtXunM#*X zxz&+;^cCy++2UYhZAW;Jc`#%>$`)1jyg~Bv{fUgHl8Ae3kKT1j(yynKujsW z&YwUlDlNsnnmnidS}LkPbY{0C9&+fz+rHh#V8p^%C&nsZm3~7wvd@@WM-wCWj{Yo) zYJFFkgWKDpOSXRGvxDpzLv$4Kqg}S?Wc0Mz9osZr;qiOsKqD{Rsl(G;mgqR-e zZ*UR+?mq4ml3)G!_hOGuCUj&sfy$BRcysp>E0}bpBnR<-)J+NQ7b;^ z1*(vz8vWeT)1Pw^8PZXLM7Yfy|FZ{9MV&Puo`#&r5JF=fq?gz9n!p1{x5pu$>7=I_D-N?5~ z`ERGoJ0x^iW8l)fw}|N~W6@LzcucHLt=l~`Dy4k5Hb>6ytO0n#HuQE0xdy6j-~Sz-*09R4ehO;W6Jo7{9Ke}5?BW;*ZNQ6bkpX!cD6Vaw{s*x)N>HZ8TOqiYb3`6ZztPG_1_A^u8TkkbE|hI!($ycGp!) z%S832{)_JYt}V#ST2OHP)DPckgMMF@d@XAoFWzpHcYpTr`=v*8$gQKP3k8mL z&pV3v-!&CQ!6z(P5sLVmf4_oc<(BU(7X#Ms-9jv!%cyd{L!s+7uw$18B&I>R`usQD(W`qd(ceBjbXqET|_U=raZ6ke*P64>u)TtCzMt_4P$NaX-O}JuB1M^Xo=wRcPONiSNnkd;Ff2eBoO0 z8;9bEUzzoV4~j=}=8L_VHYajgYTC~{h>}k;81qiJ)1tg<@u0GprrJ>ephO9JLdLvV zg9jcpfJW8cu13o&(thJbrpM3OxhRJ24sM4je96SJ!i*w|e4o50UR<1<8$DYm2Q5$P z7#*Yk5JGM;pC9_iFadsBBLIS9iMSCxRGx|6Be>7{5~>)>zBBl5fq2JT(a*j`P0ZuL z@1{GO2Z=(lQlii6^8T(LJPUnZb5MN1vr#`re{G#y+YQ;@J^$C?!icx^MSJv8k`1cw z;F@nq9|Y>AODXt*4?K3k_kd@_BaVAw(R5%?n-nd;(t)d+#<%piw^T}tH!wOUK=BvB zwX7I(*h6xJMYpN5Kw&5v*qcu>`W1Fr`y-3)n%sa72HwnLnBiwGQiy< zag>{udva?Vg|~lDIm_C-ukJJ^{%D(IcD}lpj63ZtflM1bgP7XmYs9Alk}}`egoX(;5*$}88{)zOs!7$jyx>7Gc^ofoJbpCmQ`4Oymot{?zRhY&~z{(4%%!p zMCAeXmgg_oz!UUXr7^3m&%h5hNAHzvKva?YM~Z$a5Q1`4zJl5Y1eiMvL|9irF&_m* zDd%D5ZvesQUK87*hCRF#CU+kmy zb@`JQG&1t*dpWm8Q`v;0f~YgdV>0)9&(s)}*0Iz`gK#23y} zFyPz$=Jf+s#4cd{_#a^`4zZ?4})@7 zuCrW^AR1;sSOqv|+hYb-OxjWm%6~q3zHGdtAVUm16~FnTR~s8ZEU~f)=NR zBf}V%8uz6iuZRrv+h2^Sn6y+xX1+Y{Kj(#K^gbQ_iyJ(S!5{F{#f0U9bS zx-`Fg@0Urr;@2u7&+jQ43PEYhvN-Syz+V{8A`mqMxEpUM@GJgt?Rd?SLfIa(RgqI zOKP%C^iSu($p_Jdb}A283}r3K>SAs17;b=qjD{XPb=1U7*T>iE8x*FFJf|%vMx%E5C2pVY*;D~vZo6>%?mpbaz;f%NMTOOIR4l5Pf+}sh}Uj-4q zM-b#gre-JH=r9NxWNaFxr%t8xQ zUH4#g7}h#aJr1-2uPkQf%tse3bubWxN zYru=3Hg1FstW%zD>o4XS8tmDREnr5XU;9JJJO%XV!LXn^=vInAKzfSK7yKq}Btn-K z!3tRti0T$0WN1&uznpF>fy{yr#+`&S-6&!}f>OsTS#Bsctcq}Yp)g2up`V^cTsbA!XJisg=}iF zx4vPHZ?hS9p=(Y4!1j|+_xZpcXrdneny2 zFZIl4STNc8Js;-PpimI};pS9sisaf3U>es<0 zJs1{}HgxVDTN%j+P|-UB8()5Tve!KBz~5L1!E0Fm4QW6LB0EUc!o}koR|#_#4L){b zzBJ3{p0*(0=9@gV8&n*boc1YZt0bP%aPC2Ao)=k7LDWrzM*yqgq)m%Npi&lvv6!yPOi2 zwQ+&v#KL#G%8VbHale))i5JVnpEb=i6a_eF-rs-t>g?*~tYDM{U_A!P0OZ>Yp=&;% zGeab2)m5}}Cl|k9JO1eG??S548}~teQFb?kH6KwKC6JB6a{q6cS!WP}b+)^7eDbs! z?T5TyR^yrB(pDkv=tXr#9XbE=OAl8!`8|+yOQ2ol7=|JR`qS>)Dj6>B+$72uL<;dI z#7YBblq{2>;OHK}&o>vHE0P}02@(pP%x9HErL=sVPwEyaZAE?j`_) zE&N$4^LIu{>U|0rdX(E3))`Z@NX7?l{Ar}^q#xn}(VV?&;L*rBL=5~QHWi|G9<)oL z5mycnx3Z7_C|um>o;WE$%L3=(74~dGE=_A6Jr@zGwzeJu{7B|0S69uZH>M}!w*^}3 zdb%qmg%HdxP~--lno=OVO9rryJ%q4wZ-8r=NjgbzIlpCrtHKHJktVmh zm)2kOg9&My%d?q0okdFmEtDNtS3iITO?>~-X6Dm_h5h8Vd8hVm=3U-ksV_3XNHR~l zI_g-Nsi@GP8JB?X&PS)BySh$3ZvjcrXoZ#&87=Ek)D)t@HmoZX@Ew{c2w;_30jKT}=_E-*SyyYhwPgWX z`#)$;qncz`m)c-x5wc0R6Nns=7hB?`Nw0tDjSrkp7zCU!=y+8Cd_(PYx>^8*s$pu7 zuD;9Tk949vp~@qi{ib}pAp7AiB+#{W9wpofk1~tB$!d=TN~AN2|dBVnphm?(SlZQ}uad(TxpPCl>Tfrt#uJw&~crr;wKf zkh#lOQ;bqDVI`_qOh0~?9xpJuCK4f8^9vlkA35z-AdT+hjj-M}@4UAubQzC=YE4AxKtY0Jga zR7Ph=yCQesi?r^MziD7I>v8brb`da=ngWu)(8|0Vo^^^E-LW6_Gf4HuAO?1KJ2UT$yZ(v9jOMGrh^bmFj0-GP30 z-WlcoXuVpS^P_z_<}+PG&&`_3;f#Gt?%8dR@sEXrvgi8m&*9gAc1k8$uPR)R4-$nl z!1l|jcMbrU!w3uKmHf9V$Sn)ub1gtSkq;8ZNRut~30g5;q3BdXhbSyj(JJJ{;9j%T z6frgUh%0#7RBisAnatwAUf8_%+#-~R;w+aNjNj%X8P}*~7*@K=zo6`hM8>S4%ALhK z7eMEp#_g{~7bw}U)MaMS(aoZxd)MxQ@pS^!c)e{vbUl);wsX8^U;D|uAz9ZD-yJ?a zHVT}@3b_{;$rf8rGBwEVU2nvnkwU(=nKsU7-E;s-wW<|C#JPWb`zN#fU$MMg3NOM9 zDxXK|9z_}7;B$~L@bw}_`M?#}b794-Ct)l{X5zjGo~(~?lX9(D!Co%!MOXo@#&=FSd9`{mw{v15aE#D#B|J0Op{>nb0U89?K%p`;lqYr! zj7UnNhT|)-sy)5a?P<#ft2iy(69ZE%8Ym#MkFwkwZ=z~kiyUO5d?DF{?e%Y3v{D9&Zq!RF-HR69x5=L1xbvbp)wGIM zCrA+igq0HCLta89G)^>L%qraJjloREN{NtrDZ$%R(=gud*bi)Q>W#?;m%cDBU9Xv* zinjRszicDzA8gDiE~#Bk_@EOz*d^Ge!9B4IT`__ur~m&{34q-H9$fu)Iv%fH`OoC0 z(6jI2C%vUxQ2MQ)Tkq7z+B8>m95C5(lb)Cof}#4~@5~?Lydo-?;&QK^-&h&TUg}zz zJL%QVi*zG5r92Rzh8ZVaXF8u=k5xmrwHr%b47#j}xR_8=o?}#_ezG;`lGJgK;l#>C zw#_%B63DIn2KH^%tt^^teR<-Xpw9nFl+4i_!Nye#jX>Q03_-S)6C`2l30y7^Di zpSs@JqaP&(aBsk6GCZz-p^lTaoCLreU|0s?byMHG{Af^-Grj$2r~BzgjTFt&lp8q^ z9iuI)9HBZ7QG#dEu=5*@?!n<{;eBVgT0-`p)td{eDjFj8?`sVbLhZoM)Sx9hTdznd zx6m7HEiFj%_?gGm(bDiT+@t=rAh|@>AiQ2v_KH)(ov*@j!18p8ahNE7zj-hLlc7fjR;J0x2OW@)}MFoiM#MGL($v1a^P6;WZMkIaF5g@RqZQ`$ z_dSJy*45p)kZ=Q#*!Wf^z@%UFJ)%7GTW#zcbMiHHP%vwHX2nc z{__Rn#mhQmzf~8d%Q%?#$o6n$rQUP=G>D>-TLlbB96rj6>a~5q4o~1?;ayyEirxT2 zbPV5JccyyPp-*^y=W1+SZ|!6SSsUiTD5cnWUL4X)*U z?Cca7YFino2}m5hc}KUws-1*}<_+SSV_guswJPN0<&pU6F{z-8SF8YGTa&mh2m>7x zHKGKFIpJ_PCow=)mJ=?^$teq$g~N$C5iKzsE{kYoIsF470

yGl)r5zG1yf|!N~asm)j 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 AsQ>@~ literal 14320 zcmbumWmFqs*EUL(7A-A>;>A6*xKmnOLUFf3aM$8(X>qp{cX#(tiW8&|AV7c=2@(ht zcQ{m@_dM^9Z>{gFGizmF)=ci%v**6|zV@}RguVsJ;^UCxU}0h5%gafrVPV~wzWM*d zgZnr8Uo@Q_H-B!qs>!~_su-c%xH-6MDXA=pg;gDmdtrL-=J=tLoUSVt)?>HdpIZwS zH1Dyn1ir{iNou?|!lX;AFUvLTjJCZ$ZqLenIUD5Au;cQS&)`Kb;>U|$xZa5dc$gJZ z!BpwkbPfXFE=?2uYI;`z^QDRfIsW}ewUET)#qyvMCOU|uWhAm�?u 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 TI(IpK<6L=Zpj5?clTZH-$aC;u diff --git a/images/jstest_adc.png b/images/jstest_adc.png index f6e2aab0c5e11fc8347c232da58d7a656e0a603c..edda0f39f217815b19ca38290f81de6443afe53a 100644 GIT binary patch literal 6880 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 M>M*q`72ELt0|3DlWB>pF literal 13104 zcmYLw1z3~c`#xAGDhPt4peWKzx+J7K#^{)I4wTU&m5>-nj1Ebu(Tom3YLvw2kZzD} z_-%f^|Lgx=7jWKp=bWAQ#Pi(GeLsY#tI9nlq$b3}!+WeCFAc=QyR(2Td)~i={hgX- z$BzAj4+Y9e;uZJPu48ZRSiM(ykB3(l`S8-@F82PxM|nLc9v-PP?gxL?lHMH;kGow# z`aQ_qczZ@Xd~vi9@Ueg77}l=M_V%Ise50%`#}kPsv3Kv?f7_IXfNnE8Vw5xb{aN!L zfS4^n_ieHj<%P+IyG}OV0HOo{x9{k-=sdY|=i^>Wi`!#B>B}{Ad)UnGMQWSW{$Fv% z=;*vNpVH%RneNxoWWK^=`G!7!qi{pVULR@u+rj@8{a*RKCI7D&alaMxUrCT*)yk9s z*$GHDg71b zbBhkkUs1vnklVPf(DQ~9{HpMej$TJG#rw;V;#Y@TC1BP_pZy7`GCb~@6L;5}Oe&1EZy{; z>(O7G$k^^xaF~$7mBLZ{+(DEbzx&lb+a5P>aWdMplniAgPAH%4Mt7y(~9-)lZKAv^Cy zw7uOUt43QHE{d6B)iJG6dhpel0a#cIF--&3LaYwJOkHVGCmE@(S%43-_ z_l#H{FqM!Isg`A}auIV0Go*g`68KlUKv;rSue6IgSZmvCEhc@efS7IDH% z`fyhCt7P^!1H!?&%g(&ZASvGWTxmC^TA`0hjEyJUbew#(yGbv%GGZ1Q)#$*DhsDXx zgN`7yS347ND!n7Hi}fasN6I^J{;~K&T z-}qC@$!kvT&+%z2`_H$5Frji7+D798nYDc!Yom2zfkuK%#m-UQ1B=`{j=@f!$+`la zt#q4+jFByp#_UXvNeAY?_8VQo`ffp3NYXMBRxX9^%syd2^(xCVl!?ke@T}uG{dZ6$ z^qUNry(>JH!U=sYj)novo7Zm{fP_bXk#5arF9dzHCzqQSEiM&T{7lC9eYMYkBP3V8p@T5 zHbKG8w@oKq`bvW@DZPat1Bf^p!tE3%{Z#G0J`$ITpbh*@Eu(ZIS-W;BE@jq(eM=MV z86}-6RV1lXXGW=)W*)Phh@-c#e!@l|lkIdVJ~%3`iMAKM;$jG@%}GTYx)cAK1l|6D zCBdWGb$D3Q^>tyjZ)yAYnH$a63xpbjS?=zk#JJYY&#B$nn-FK77stERCv)fV+ddQ2 z(dGN4PDeB1sg#&~k%Q#IP?{e*+H>|6O(*Wh@@IWu@vFUfv?FqFC|GUw)Nvf<=yii! z^^J@;(d)gE**#c|OdD=)w!>_oOuS>4zl-Qx*pnr|SG%R)dzBBXfT_BhLY|mVv?-0l zSghs(*Ag6Hn+Z$|I^nyjdYKE1)$=XmFXZ6L8?SND=4bOYe3s-$y`oR}^fvyY<+8Vp z&FSL!BUg6lPtp6h&HO<`eCoVApR4KWvJ-#+UoTNzXfd@HE@19}8!y@FpME=`zewC9 z=}}*CY<53nxp=U(u{khseQflFdQ)_ng2wK0?D%i6(eiT1t03U*rfu&mUY~Dceg&Me z{s6$#_F%zmdJbH+S7uCK?G14?c8v%xeIx`7h=||BC${G!sOgO{8(M^PS7kF1XLKVw z77^<|b;#tzpA6#$hc}VZ>~SEg99;Ejcyi9vgwzW7>|R5`e^~2J zPM0f~b`p*ngVRNUaX0cbBMwsF;&4T_K4!Xhs3Ih6zUh$VM@CtguH4Ts-6INFnWJk7 zAnbc+KFDJ9$AL;GVWrP^2#~UI*Hz*@+!zK6%`Hd zw|NA(H<4d9jLHNp7giUh84x!9xLh~@%@1tQ&o#p4+~#eC=X~~(cj>OiFlItq)L=aU zb0?vYu?cuYS`LhPbFA6t>=@8kt$w~d1@Ps7d+g}WIa|ygJyXmN0?u7qV4D8aoX`5+ zK%O44jc%91&K`;EJV_kQ)9I@Myd%vDtBjqQ>})zAZimW3xetnZfls59f?{K2h>14@ z9#$<+hskFF5A8y`t>h&WIeIX;Lk)DO&+Qye%oxyxYS{!wtUlWP1@{n`##L%>;hy6* z%~-TZyih*D(NDwtsj0fr^+Nyebhwv%kyCL}g7r2B;-%ec<5Cva=NF1c)h~&yNz^{> zd0Y#uDvrSx3)6X@$g8?P0KB8 z``x!7Xjm^Rulo7cd+vQRD+UAZe57GR8)}CC*P8()cJY*ZxHjeq8JCMNW@2 zm2xkS`Y3aOuRqHf&}Fr@jvSUka38kdhlKfvj@6*!QE7Sg+TdWAe}0W=<=2awmYpS{ zeZww;clI>6iXYjTmB}@6CF~XKTAZ?cI{iPm<)_?FlKmevYuRhDX8o@YElGIp{~nSE z`M!FyKbSZ}xAZcub6p+jZ~U*0-@Y(~FaClJyx-onr!UBW;AiFWx6#>kjg+L+J)*P! zoXAtFB%;wMLPWA`wvAgDO)>P@FGoAcDkgBQ6i?1^=c*@;25jgj41+)*?J@qa!9I{1seG3JaQ@6T)uh=53Hcw|AW&+ON55;x(>EKhhUOyVzT_M| zvlC^VH6&+@iGQQiE0EhemGM?9)v=ZnQQTzVLl$R@g$spS-~KH>UhJd5d{eY|5?USf zBGPzpEBtHv{UF0HR6crdkgg)JV8rfTn|2f@U`5>jFfxI0g{HX0i%)-{7-`d{*ClV_ z{{A)<@v>W44!hFkW8T$5N$UBtTsA0ck&z^~yo4Pj8TSBsWJ`lWTP~>x-%O-7}g}P^*e;ly{!%H0}QO?O=mJjOZ(e ziT3!4?d%*ozSIsnE9Enjqct1er$;=?^(=FdrnEibhN(Z926kkDME`vsUMUi~Y+ujx zgSy1+zS<#$UB%>vE)RUu(xQTNFUmDTyWr`k;Wq{)`Wkx5j3VV;@n3cfw+#wwzofJ9 zZeS#$v6e>PZ4m_J2=o&f5k~i0#Hoi*mh@HE5K;Z>|APowZfHKUNPDmkyK<sd|of z39D*lS3=m1g@kIe82ekWw~)2LX600tR-^b70VxCTHtETr0ASMHId5a5I7CIDS7UTmP4P&pC3IRH@IS5vvxh|G?Fpr~2 z7&p%rQzeJR?Ch>!!F8)TD8H&ws*>zqcUzd+eOcu*n^DIn(E5DVb}PinQK=T+7$93d zctJi(DA8s5lc+0C7VU0~rgYO*zpT_ifeUzlFb-#K8v}t#h+Au!<}5t*Bh?n+*#a;P@LDl&Hm>!1&g8Ajw{6f*0g!}J+w*+JF~Wp zOuhT8BFqxmS@-Q*PJk$ZYy?Z?{C0q-1LJ8P+4_5y*j-Cedgb=ey|dgH-zIi@%@w;U ztwQZnGqdQ)&@Lp&jRbXvXSJ`Gu~*ZcMFd4sd9yqjXSwj*$wY2fy1V8|^_)!4_H(1@ zRbTxoe)#Xjmk+KrPyBiRm9drtaVbIlU)irw2zIkB=W9Z7bqh}-#S!Dy4icK-X(Ih+ zbvog#Bat`z6T9uSSWk$iOOk!xg^O)Fx8ALntUdC3&FjNE{Y;R*CXf`*FPOGpb`Y>tjW_vmtS7b;Pcz1FLPgtPh7~` zIS0kc>h7xl*e2y4w)KGU*H=)lETM$9W_y5 z2$Z;t9tkt;vTYxOdRLg!W2@%3rK9xyCBItAC~ICg0|@F8W*;6#1tN6~N>%~JV@yX{ z^0$A}yxH&yj$P$umg7E?O7$ zUI8X%=FqX-dchp*)pi`1XNxnhv~)Pj60B->%>Nx^XzY=#Y!eV6{kwK|yY&5y`1t9Q z^DfdE0urNm^Yq6wpId9EOoGuqz*mt!uev;CdY{-ulJZRarHkF)ALz_F?K@{$u>i^E z_rm9!ik$~i96y4;7QVrLOUwIIHpgEeZg?v7g9?*2p?MRg_|dQh_Rv&s{S>Gw9Guua zSnyn+=ntD(5<+oUAKm?#GA!oD z)EODG5wqR}kl4K*w45!MtIB39M*?dKy~&o_CyPcnC3|AKI4Vmbbzcok=Wd*eywxNw zue#8Ja=E{>91dkej9eWSjGXktvbTefMP~)ENZGhQKG|w=4|7;hRIFNRM$S;`#O&;` zswN{v+o4I%UqSWLWOY! zp`Hohi)#G-XxB^@~kdKvddh4U@A#{?lQ5WK%T zgh~r6u4XvbYfNNk#Z8m;a_GkT6MwDH^x~FP_m*Sm|68~8kdQm@%}GyQUEwy8bEmfg zNn;B|nppcsZWV#$4iJ6QXEt*phv|E0W4$qg?Qn6irin|E@^>--v*Q>AOMfK{im|U*@>ec-3!-M*eKFgTTvcUZ1 zJdXS&C*Sr;sL!plH`_DQI~TZ<(b81wb`JSv)Ft;mac|NMwOl)iNF~=Svg}hg2l7z} z?1ZqVhV)~^Xbc(}Q$6lElxJwpNtAuIZJWrp2I%tFx>n8XhA)J~{N*$Ht z=hnW;Qml&KFM^L{5ZT~^+37b@O7}c1X!dd#dVVe^Ffc!x>ne-+=l05ykUEH4New9Y z-^cIk|H!xqj9ivVXlXq2Ajt2>>^=?k`yyZwYQ4I(un(WB$60vAl}q+*ciUT=n_hI% zHlq}0X$L%5=LUA#KDO4{9oP^396iWVYQma$k7R^kc4+_UrsA+r)vgvou@Bm9^enIn zqi`}fTk2nw#J#JpBD1oiURw%PDt{>lt2eE7MIH|s8zpCg4&S&w_OrS7N)kF>y!I{Y zyBF&5jn6OZR3FWZtr>bb< zVP*QAKW@pG+8tVQP}SkmN^y4XWC7CmnC@9bn7m1UkhF>4Oa$0|&`i8cQUi>bdDHeGdZL)v;}7=CW_~_}8BPsvruc zKW(#w{BtmGUQaZ1>RyRMX)oXhxBqij1g$M(USTu>9W{Ps%j zj)P7^*eEvgGEY{5-|x}hcvP*<)#ymh=R(spy~N%mZK~<&-~$^tMJJWYbI9eO3QZdo zs}c%rCOv|w8JE~*zJ)ih%++)J^nO{8gqx6HIg^3}^zGCK%OcdSw7fUNqUbH@3+6|u z73r$YseaohuR{4APU@R!a{g7|XvcgFo36(?(OZQNux-Ef)n+b1A2J3RJ%&ZQ?ffQK zgeRTe?g0u;h!GCfIIzkXauAA4dWzeYc8ZagS3Qe&YA`*3&(@a#u#F{ZQ@nqlPNc`* zu&lVoe)M=wi+@NWq2G^ZrcfL-^J$mUfDe1P{}6RED&NHueBQMAL5({!X7lSm);pqa z0uw9_yJiZ=|7gCH+!658`Yjpj21W8Rd@a*f`Ux%oYbnD)Ac?ODH9O`nByg~1aY;-7 z%bC-XwWfX~bDONfMofO?ZMaJM%g;?^)N!!N!s%#!;Madp6|W_O+-cC!%2f&F8Pqts z_Q(eL)#}DBl}c^jm0vlT85SxQBL7$Q`uOB@JRRLqyD_JUu$6@2M-Tck18Ql-w91Yo8Yy{8>-NLFv`as$NuX?R$i+qiM+tudye5B|R zZP(WQ*+p~I@O*MS!_i9TK5%tHY!dGe8IIU>k|9V$Hb2UOj(-~z7tZ+x&I!;YCJACn zpf356Koko0v<3;^R7cI;s+hks_W_Ec)-cm_qDr1Fso`eIZK!BPD{pF~hfQ(Ku(Ms#AT7ePR=Ejd$^?KpBcCR^3i z#}fGCgK9=9^{1^*~RAehGHYK5se;qTK{Lfzzl@%)teNP7=v_+nIj%gyO{XiH>>XW30SsoV|=h zL?W7K)zREmqOD?n)i#CME;+=nQ7JMWmq+8&%eG*SL{L@&^tGu)pU#Ie2H$jVMU8$G zFuc9B2vxK*I<63C^4G>-#Dj>!SCtvrO>q&=1{k%>`L_53FBVMzk8F?4?3N>Ry%Q6e zxmEacj2Z@D4Fd0_2Mpn%jMvsDbjl_~Rw>R_uhZZC#FO;IS8A?WP>? z_g-W|j(wDK*Gf9X0o_oRsUK}jiSC4{WO4sMmb593RL51fT#Ag19H}r@j2oV^862vW zFQ8Kr_WMKGc-m;{e#R|<42#FPE8I#UpP8Z!G8$#j$lf9So!l)o)-m|>e4m9cU#5;| z_r8TwlSm9SqjquYmGPBf!6utj@dXKDpP%*8yfE~LG7iueCPXnXoh~s{$3B-x6B!~L zBGmend{}7zO?`Eo`GPGOEaF!gGQ`4xJnqMG5ox^By;<`EJGKJCMu#7k7;V*16&U~X zvvvLIx(KYEkQ~E@H*K zk#U=2W_7+;MLUklea(6T(*NbI9~Aiez&QM zNB@2)eaSc(XiGgSANu@5#OIS1#m?!fUFH;V;WV0(oD~zVu~ylt*HZMEP|WrHBd_I} zR0*oDwKdMp^_!Egm)&na)wC3j&rb@Y85{zQDQ>qW^}l~_@kS3Ap<|dhG27wRI}Jc` zmiKNQS|RP-_G4u;EX2M_VY-C+Qk88t!%vp>g;&HfDXYNAJ*zzv2mI?K)`I zX!6&9^@D0)>euUvqk??ZzcHiUa>xMhZ(Hrx2Hbi>LZohf&)A#*S;Wpclbd%lM`{jI zPNA*r2JCp#T&s?=4f9X8ln$}@GE{12dD#oHf0y7GegCF)KVZEF|K@&UgMGDJp{FlO zGu!q?kTJAaZED8wo|wlUkc}|C$f3V>{<2`&2D+rz$3j7G^Dr5m2@{$H!PeEJQCfy} zWUJpTEOlBD*2#~`)u8ncHS@_&7Wd6IvN}GF>a1qDrg0UhX&hl#`l&gTPYPLMh#ugx zG~0ER@62u?85e0cg`(AVAXT)#HQsCRA5#o^Ft=+H;K{W#1(F6*qg!j=#XT_Qrk3$F z0fBZ+jBzY}5%VV*Rl`CZ?^oGnUg_fcKeV|RcGySM4{B8>1f0-(D7GpkoE~5|wFeH} z9ya2T+U<#$(ffIkG5mP?OQ6`i-koGQbA(c&)EQ8$iCZA(7}GRb)%n z%@Mx#$gPrSqExjga(rM-KlB3j&Cje5aFh5w!S(B$%Nk%*WNx3;#_0UD0!6C~tEN&% zk5fc!|KN^==5b@~t`M|rRcLQDfTda&C0me&@AuTz$F(1DjsepklCEAoMh;TlOYb08 zY1Yf*5UwDx8~%v`YwimxZ+xi*Ru3dqs)AjLIaP8dor;rlpfNsulv8pBg=jC5=1spN z2|0ijNPY1HygwcC(rG=KFZg8i7P2zOk{*xnA~I#tnw)8^7*IycJqDcnB_bz1*e+;U>TZUi7#S zP)?$nA346N*+Z!?5cD{RQ%-lzb^ywhwV4!CES5SPC82NY{XHktm2}jiS=oFHB6zkB zy{*qqA&ipEu~jgzMkn@1*<08ZQvNp^`6yi`=_b?{= z#IsYp;qbE|vT;uBgP}Xz6x}cZDjdyjRQIVrh(^!O5-QD$(HN*o6HI6Jg@FlM+44Hv`w=G!| z7m4Gi;b?bOH?O0dvpOzqTdcehCsz9F*z%KjuY2p}*#}ladVR23VAhxg^XIkdq{~J5 z*a^*yuhe?z@n|l-P$4-&h?Ny_IU*PN>|vG754OxeSOi)0$7lA51H`TsPmoOL26_v2=(~};tsQ;uurG1S#1O`;@2A%N zV7xzm{q4_V|BS4C*^})%uE=cQ9dFz^fcYW07L z0-j&ir{Wi?|7)K0-ejZfQm~4rO|#9=8eT5-pKQBzuUSR3vg3(b**yXX(R~M8fc>Yq z{=BsN+8Uczkf0ab%*LZAUXraE%HPn(r^sO@V#RW>j){+3fc@h+Yo@XXLC{a#Z~-i{ z@uTjcCi@pjY?O>KoMvxl_sdipv#bil$B~hEHEsRHV)kM;!=K^vhX_}gB7iTb`Utb^ zXUeoLbA4WwTSb13U4&@&91!>}zAHYl+^$Is^P9HC|9YG7~?S_idzjpAv1RY$O0WfMq~ zGwjI6=ET#%?xNUU{dCg&%?SQ%V5R<8o{~YZ=GqdsoKjhF{ioAORy}6}p|gEqApJg} z=IBh1|Btd1?TPa;SE9GFH}w;9;f z=03KXWuwT+&iq?_=U&u!p>(ziw7OcVnsO9kTjZhAP{n&&L)(I(c-I^;QO-x%l$3C6 zs`5)}w|pxZ{p~pI%KDJ@h*{^Xo)mUVBUG2B2^ht7t8m|gOHLQq z@8k(x8&L2VY~2rIsbFN4!HvzYe%{cdjb1)WEmcD^{vy-Wh-ayc87KXduMholTN7VI zG#X+#EYK^{d{AsvYPHyN4&|d(q9?`49W@YQ=z8Tx6-Q3E+eoM>b;&P7{U{^}po{>r zsR8={U)HTlQ(4fK|H%Kqr5XhEH( zn{ZXErW_Zr=Q(xyrhspO@#Omx@b~So9*FiVCQf#8&C?3*$)`TPY^#Z6>deodv=yqM z)yx*Qp+4|3`zP1=i2#mn+w{uB&uMo{(Y?jQe?cAD){E+6E-K!=!o=i=jT^8r9={L- zRw88mOHGp$lUn{U26(7%oXQw*5n}RL8~7hrb2l!-~jS0rHHcRun7 z;?}1nUr?vN|Cc$fx3EA`j9w?qfNJ$xd@BtgHPGsbF}%1HrKoaQqh{t-u{U>NMRDFI z2@yI;GO2b!vP>Bt_Jp;j5!2`=u`4~@Q;I#HSAFcb8bH@8?F$)C+?T#BP{D^0^7rkVrtXoDx3biJb^RC!5oT#nRig0e+FO1u`6kQ zcRdjGd~Ig;Ezi|56ZZBs_=1Y(wGYdur~EUWw?cq}=zr?5BDoj0vSDJ(uhB6h)b?!~ zhAH&eM$yA|)x}-%#Azvoqnw#116jCJ=_j(iu6B0YMpb4+N+JS*wO3Zs2ksivt_ys< z2Gs1tAk{{t@#F0ZF#yeAu51$z~%JvU@fEFDt4QEy79+9kTk#`Ul3cD5U9))u;#gn=*a zl;NtM31cnk8LbJc1aClYDY-Nf_mFBn6YM8HbuaI$nkpqfPWkj}e4jx0goT&;{VBfK zxGJvFz6+2z8=v`pAZ@?+9;x5sWL##1M3d^xGev!?QAcgoEgQbD!4ICd)CyUOW%aY5 zGq&3BVGk$e4wRE@_vJi66{xxWsaWxL0awaVfkw^{&SkSdepjn-=#9_E%DK$GpoI9{ z{E36Awy))wP}H-&QU2C*s%B>^(|WcQN|+xt;}(nF^ITaOx)LJwSN^WK3Kh{e(D`HV ztAQ^&U$L~-!B*~{a{X0P3X$h-_bQtN#< z`S;j$v`jyQ+Fq8Yv(!Z6xt@Z%1}|%THGMvQ5d7=thsGUt3!Ye_^!}on*a~@OEyF74ou}T3%7IB1$qi!))6)|I~84NvwUdjLF1QmoQygavSGvEM9H?=EhW-WY2 zviH2-$FLDt7h+w--Xs(gpkL1{rSp8s6_M+E@E!2u0G=uK2ZJIiJNBOv`y~u%rNGHv zG0hI2h%)z-gv3S}f4>~Jv1I~V)i#V^wQ@I*cL=7Yv4DXu-XQBVM}|!Y&Q14VQ0}52 zYII$vul-M8!jTlc9+A!~;jm0k*87O8L=G4J;rRqHU+oZT#cj4_E4LM)Vr)CMOrVnc7iZCd3+&gocEeQAa z7cFfVt&U~Tgr-dc(%vJAWQ%m2xU6S=-36nmyG>Y;Yq8Nxq`h%*!~MTFGve(8Qtk#d zdmB+J+Y>VzIA#$TGbf9VadZ2$S51cmq1>B_pN3`J_`~5A7jLrT` zOZ`Izw+naQ2VDtdG(9us;CfEh%$s${SN0qRzdvP*5+tSbfV&DBKZn4XwKN`~emIsb zBR&+q%J|Vm5>X{_k~&1qht*(>%B)g!OulYS zXS1?kWkL2)A3!G=7w@Au2;$9h1QL1SwO(MpZAm1E=`wF;LyK)gWZ`k8sax?e^6pO4 zeRYS*_!GN>>D^NloA)FgP1S?#&=>`k#K;bsGQYu~tMh^x2e9$b%_P)?)b(A`&_d6S zyV0g2luR|NCRS>Y>#g*6^n)D2-8m2kRkxvfoMd%>IwLN!XXua{R}*6WF2+>3=Mu{4LBoX_pF$l9|04#D zqkiQ*a}&sFj1;2_*D>{X&0r0xm+E+~dAM9DDv)$_+19-PJT@RIviwVUv#lnbpLy;U z7N?v!+$rs*2_c`OoA|T#m@8smJ|Xz(c?qF3$v3F6fQ@#nZOJL1oNffHJbX*0eL9Ea&`l-%jhr^MBaLOjvUrCs>J&tOJI85-kSf z*|LTv+xmo za$hiK_(CDwYZw~m&xygMY9k%RFsTO-v$dlq%(RYhS5eZ;$YYu7j^g^a)$U#vHs@bu z7V>E!@WbRl79*c74>5~OT5o!rRF15XSH*)7=@%9gk+-bEqmGTTpv#YMlxQ^D4_XK@RJD8EYbocKie!$rH3@i!k~#$}PJ!#q`o$@7iP%UE7Qj^oUiJv$oQn(Gbx$ z=9xAloRXSoPch}%ZfM+iGlS3ez99BwR(mf;acyoqZdyBQ*ikrr0c(q!`~vAEVAllM zPge;kjuUun`FBBc`p4edNGLZV#{`+;+}*|gxK$7D(qwv`8aga$J{ zDdzNpLWjANPZ_g-N4L{im!~(zWs>|ir2?HW%zdjq>*rmwA-YjsR^f4rd4pKm;QF#c z{F;DVy5WQGSVt@HQ(PrgBqA+gK5Sj^XEEKUm9tn}=DF6U*6?)E>X&?G-ix=IDPe$i@!j4F~HFn#Q-8*fPu%}w^0pBEiVfH`Y( zHF1w-Eak`PR={(jU&}dZnXe4=rTUY^h|Wjv^%0e0p($`@xh7|bTP@cCg7msPun_f> z!^8(Tm&Qt74zY97nMIb!zI+hhAp3fFZ-d#+JmXLQ?CGTusE%5L-l+Q5gykB3zB8Zc z^ykE_wOys^6oco>>fkdJzrmR;*-7m{Y>{k;Rk)mHR)<=$DIs3N!pg#WU&!LXW!KtPoA1S0I#%n-4$33Nd@|QNZe$Zc)h+ogoVe^HS@H4i$CGO*( fYN=!B{tZ6fRkvC#u&fyS08c?iRk~R6!{`44+3e?n diff --git a/images/mcp23017_circuit.png b/images/mcp23017_circuit.png index fe752a3e6b49c862e2a6f30c1980a2c43e6e277a..61debc1fe477ecbf1f88d05d9dea740962338ee4 100644 GIT binary patch literal 11827 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 literal 66915 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 M#NN!J32s!GpUy1b26W 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 Z)$Qe9banqL$J+n-?*ED1nC$!b{{rA^^S%H8 literal 0 HcmV?d00001 diff --git a/images/mcp300x_pinouts.png b/images/mcp300x_pinouts.png index e1175cf06d9df16389317ae58ac03831cecedbeb..f9ae12528903881e9ac7bddfd968876eee6e34a8 100644 GIT binary patch literal 7765 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 literal 33130 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 diff --git a/images/param_ep_sep.png b/images/param_ep_sep.png index 2a4b5ecf0700919182c12f6751cc26e4ba1cf602..b06c789f36b595bb6fec48d750b3c670ecb37112 100644 GIT binary patch literal 4279 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 literal 7127 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 literal 13238 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 #include diff --git a/indev_type.h b/indev_type.h index 6d3308f..858c96f 100644 --- a/indev_type.h +++ b/indev_type.h @@ -10,6 +10,8 @@ extern "C" { #endif +#include "build_cfg.h" + #ifndef BOOL typedef int BOOL; #endif @@ -110,7 +112,7 @@ typedef struct tag_input_endpoint_data { input_buttonset_data_t* target_buttonset; int button_count; - + BOOL is_opened; struct input_dev* indev; diff --git a/parse_util.h b/parse_util.h index 2bf6a99..bc3ce30 100644 --- a/parse_util.h +++ b/parse_util.h @@ -12,4 +12,5 @@ int parse_number(char** token, char* seps, int radix, int default_value); char* parse_string(char *str, int len, char** token, char* seps, char* default_value); + #endif diff --git a/spi_util.c b/spi_util.c index d06a317..53277fb 100644 --- a/spi_util.c +++ b/spi_util.c @@ -59,7 +59,7 @@ void spi_close(void) iounmap((void *)bcm2835_spi0); bcm2835_spi0 = NULL; } -} +} int spi_begin(void) @@ -68,11 +68,11 @@ int spi_begin(void) if (bcm2835_spi0 == NULL) return -ENODEV; /* bcm2835_init() failed, or not root */ - + /* Set the SPI CS register to the some sensible defaults */ paddr = bcm2835_spi0 + BCM2835_SPI0_CS/sizeof(uint32_t); bcm_peri_write(paddr, 0); /* All 0s */ - + /* Clear TX and RX fifos */ bcm_peri_write_nb(paddr, BCM2835_SPI0_CS_CLEAR); @@ -80,7 +80,7 @@ int spi_begin(void) } void spi_end(void) -{ +{ /* Set all the SPI0 pins back to input */ // gpio_fsel(RPI_GPIO_P1_26, BCM2835_GPIO_FSEL_INPT); /* CE1 */ // gpio_fsel(RPI_GPIO_P1_24, BCM2835_GPIO_FSEL_INPT); /* CE0 */ @@ -121,7 +121,7 @@ uint8_t spi_transfer(uint8_t value) /* This is Polled transfer as per section 10.6.1 // BUG ALERT: what happens if we get interupted in this section, and someone else - // accesses a different peripheral? + // accesses a different peripheral? // Clear TX and RX fifos */ bcm_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR); @@ -157,7 +157,7 @@ void spi_transfernb(char* tbuf, char* rbuf, uint32_t len) /* This is Polled transfer as per section 10.6.1 // BUG ALERT: what happens if we get interupted in this section, and someone else - // accesses a different peripheral? + // accesses a different peripheral? */ /* Clear TX and RX fifos */ @@ -210,22 +210,22 @@ void spi_writenb(const char* tbuf, uint32_t len) for (i = 0; i < len; i++) { - /* Maybe wait for TXD */ - while (!(bcm_peri_read(paddr) & BCM2835_SPI0_CS_TXD)) - ; - - /* Write to FIFO, no barrier */ - bcm_peri_write_nb(fifo, tbuf[i]); - - /* Read from FIFO to prevent stalling */ - while (bcm_peri_read(paddr) & BCM2835_SPI0_CS_RXD) - (void) bcm_peri_read_nb(fifo); + /* Maybe wait for TXD */ + while (!(bcm_peri_read(paddr) & BCM2835_SPI0_CS_TXD)) + ; + + /* Write to FIFO, no barrier */ + bcm_peri_write_nb(fifo, tbuf[i]); + + /* Read from FIFO to prevent stalling */ + while (bcm_peri_read(paddr) & BCM2835_SPI0_CS_RXD) + (void) bcm_peri_read_nb(fifo); } - + /* Wait for DONE to be set */ while (!(bcm_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE)) { - while (bcm_peri_read(paddr) & BCM2835_SPI0_CS_RXD) - (void) bcm_peri_read_nb(fifo); + while (bcm_peri_read(paddr) & BCM2835_SPI0_CS_RXD) + (void) bcm_peri_read_nb(fifo); }; /* Set TA = 0, and also set the barrier */ @@ -255,7 +255,7 @@ void spi_setChipSelectPolarity(uint8_t cs, uint8_t active) bcm_peri_set_bits(paddr, active << shift, 1 << shift); } -void spi_write(uint16_t data) +void spi_write(uint16_t data) { volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/sizeof(uint32_t); volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/sizeof(uint32_t); @@ -266,12 +266,12 @@ void spi_write(uint16_t data) /* Set TA = 1 */ bcm_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA); - /* Maybe wait for TXD */ - while (!(bcm_peri_read(paddr) & BCM2835_SPI0_CS_TXD)) {} + /* Maybe wait for TXD */ + while (!(bcm_peri_read(paddr) & BCM2835_SPI0_CS_TXD)) {} - /* Write to FIFO */ - bcm_peri_write_nb(fifo, (uint32_t) data >> 8); - bcm_peri_write_nb(fifo, data & 0xFF); + /* Write to FIFO */ + bcm_peri_write_nb(fifo, (uint32_t) data >> 8); + bcm_peri_write_nb(fifo, data & 0xFF); /* Wait for DONE to be set */ while (!(bcm_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE)) {}