feat: 實作 sw_drv, sw_drv_if, adgs1412 driver

1. sw_t 是一個 64位元的資料結構, 最大可支援 64 pin sw (adgs1412 最多支援 16 顆)
This commit is contained in:
chain40
2024-03-29 00:26:06 +08:00
parent 84ace26dd6
commit d9a2a7b4e2
8 changed files with 279 additions and 4 deletions
+80
View File
@@ -0,0 +1,80 @@
#include "adgs1412.h"
#include "sw_drv_if.h"
#include "edc20_pin_ctrl.h"
#include "nrf_delay.h"
#if (DEF_ELITE_MODEL == DEF_ELITE_EDC_20)
#define ASGS1412_COUNT 2
#else
#error "unsupport"
#endif
#define SW_PER_ASGS1412 4
#define SW_TOTAL_COUNT (SW_PER_ASGS1412 * ASGS1412_COUNT)
#define SW_PER_BYTE SW_PER_ASGS1412
#if (SW_TOTAL_COUNT > 64)
#error "unsupport"
#endif
#define DAISY_CHAIN_MODE 0x2500
static sw_t m_sw;
static int adgs1412_reset(void)
{
nrf_gpio_pin_clear(RST_SW_PIN);
nrf_delay_ms(1);
nrf_gpio_pin_set(RST_SW_PIN);
return 0;
}
static int adgs1412_write(sw_t sw_mask)
{
uint8_t cmd[sizeof(uint64_t) / SW_PER_BYTE];
uint64_t val = m_sw.val = sw_mask.val;
for (int i = 1; i <= sizeof(cmd); i++)
{
cmd[sizeof(cmd) - i] = val & ((0x01 << SW_PER_BYTE) - 1);
val = val >> 4;
}
spi2_write(CS_SW_PIN, (uint8_t *)cmd, sizeof(cmd), NULL, 0);
return 0;
}
static int adgs1412_read(sw_t *p_sw_mask)
{
*p_sw_mask = m_sw;
return 0;
}
static int adgs1412_get_sw_count(uint32_t *p_sw_cnt)
{
*p_sw_cnt = SW_TOTAL_COUNT;
return 0;
}
static int adgs1412_init(void)
{
/* reset */
adgs1412_reset();
/* enter daisy chain mode */
uint16_t cmd = __REV16(DAISY_CHAIN_MODE);
spi2_write(CS_SW_PIN, (uint8_t *)&cmd, sizeof(cmd), NULL, 0);
/* sw status initialize */
m_sw.val = 0;
adgs1412_write(m_sw);
return 0;
}
const sw_drv_if_t adgs1412 = {
.init = adgs1412_init,
.reset = adgs1412_reset,
.write = adgs1412_write,
.read = adgs1412_read,
.get_sw_count = adgs1412_get_sw_count,
};
+8
View File
@@ -0,0 +1,8 @@
#pragma once
#ifndef __ADGS1412_H__
#define __ADGS1412_H__
#include "sw_drv_if.h"
extern const sw_drv_if_t adgs1412;
#endif // !__ADGS1412_H__
+5
View File
@@ -181,6 +181,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|VisualGDB'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="adc_drv.c" />
<ClCompile Include="adgs1412.c" />
<ClCompile Include="ads8691.c" />
<ClCompile Include="apa102_2020.c" />
<ClCompile Include="dac_drv.c" />
@@ -200,6 +201,7 @@
<ClCompile Include="le_gatt.c" />
<ClCompile Include="le_srv.c" />
<ClCompile Include="main.c" />
<ClCompile Include="sw_drv.c" />
<ClCompile Include="syscalls.c" />
<None Include="nRF52811_XXAA_s140.lds" />
<None Include="nRF52840_XXAA_S140_reserve.lds" />
@@ -345,6 +347,7 @@
<ClInclude Include="..\bmd380_sdk\integration\nrfx\nrfx_log.h" />
<ClInclude Include="adc_drv.h" />
<ClInclude Include="adc_drv_if.h" />
<ClInclude Include="adgs1412.h" />
<ClInclude Include="ads8691.h" />
<ClInclude Include="apa102_2020.h" />
<ClInclude Include="app_config.h" />
@@ -363,6 +366,8 @@
<ClInclude Include="led_drv.h" />
<ClInclude Include="led_drv_if.h" />
<ClInclude Include="max5136.h" />
<ClInclude Include="sw_drv.h" />
<ClInclude Include="sw_drv_if.h" />
<ClInclude Include="sdk_config.h" />
<ClInclude Include="radio_config.h" />
<ClInclude Include="sdio_config.h" />
+15
View File
@@ -1392,6 +1392,12 @@
<ClCompile Include="ads8691.c">
<Filter>Source files</Filter>
</ClCompile>
<ClCompile Include="mux_drv.c">
<Filter>Source files</Filter>
</ClCompile>
<ClCompile Include="adgs1412.c">
<Filter>Source files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="nRF52840_XXAA_S140_reserve.lds">
@@ -1711,6 +1717,15 @@
<ClInclude Include="ads8691.h">
<Filter>Header files</Filter>
</ClInclude>
<ClInclude Include="mux_drv.h">
<Filter>Header files</Filter>
</ClInclude>
<ClInclude Include="mux_drv_if.h">
<Filter>Header files</Filter>
</ClInclude>
<ClInclude Include="adgs1412.h">
<Filter>Header files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Text Include="..\bmd380_sdk\external\segger_rtt\license\license.txt">
+12 -4
View File
@@ -29,6 +29,7 @@ extern "C"
#include "dac_drv.h"
#include "elite_pin_ctrl.h"
#include "led_drv.h"
#include "sw_drv.h"
#ifdef __cplusplus
}
@@ -117,14 +118,21 @@ static void nrf_sdh_freertos_task_hook(void *p_context)
twi_init();
spi_init();
led_init();
sw_init();
adc_init();
dac_init();
int32_t val;
adc_gain(NP_GAIN_1P500);
for (int i = 0; i < 8; i++)
if (1)
{
adc_read(i, &val);
sw_t sw;
uint32_t sw_cnt;
sw_count(&sw_cnt);
sw_read(&sw);
sw.sw0 = 1;
sw.sw2 = 1;
sw.sw4 = 1;
sw.sw5 = 1;
sw_write(sw);
}
led_set(LED_IDEL_DISCONNECT);
+54
View File
@@ -0,0 +1,54 @@
#include "sw_drv.h"
#include "adgs1412.h"
#if (DEF_ELITE_MODEL == DEF_ELITE_EDC_20)
const sw_drv_if_t *p_inst = &adgs1412;
#else
static mux_drv_if_t *p_inst = NULL;
#endif
int sw_init(void)
{
if (p_inst == NULL)
{
return SW_DRV_ERROR;
}
return p_inst->init();
}
int sw_reset(void)
{
if (p_inst == NULL)
{
return SW_DRV_ERROR;
}
return p_inst->reset();
}
int sw_write(sw_t sw_mask)
{
if (p_inst == NULL)
{
return SW_DRV_ERROR;
}
return p_inst->write(sw_mask);
}
int sw_read(sw_t *p_sw_mask)
{
if (p_inst == NULL)
{
return SW_DRV_ERROR;
}
return p_inst->read(p_sw_mask);
}
int sw_count(uint32_t *p_sw_count)
{
if (p_inst == NULL)
{
return SW_DRV_ERROR;
}
return p_inst->get_sw_count(p_sw_count);
}
+17
View File
@@ -0,0 +1,17 @@
#pragma once
#ifndef __SW_DRV_H__
#define __SW_DRV_H__
#include "sw_drv_if.h"
#include <stdlib.h>
#define SW_DRV_ERROR (-1)
#define SW_DRV_SUCCESS (0)
int sw_init(void);
int sw_reset(void);
int sw_write(sw_t sw_mask);
int sw_read(sw_t *p_sw_mask);
int sw_count(uint32_t *p_sw_count);
#endif // !__MUX_DRV_H__
+88
View File
@@ -0,0 +1,88 @@
#pragma once
#ifndef __MUX_DRV_IF_H__
#define __MUX_DRV_IF_H__
#include <stdint.h>
typedef union
{
uint64_t val;
struct
{
uint64_t sw0 : 1;
uint64_t sw1 : 1;
uint64_t sw2 : 1;
uint64_t sw3 : 1;
uint64_t sw4 : 1;
uint64_t sw5 : 1;
uint64_t sw6 : 1;
uint64_t sw7 : 1;
uint64_t sw8 : 1;
uint64_t sw9 : 1;
uint64_t sw10 : 1;
uint64_t sw11 : 1;
uint64_t sw12 : 1;
uint64_t sw13 : 1;
uint64_t sw14 : 1;
uint64_t sw15 : 1;
uint64_t sw16 : 1;
uint64_t sw17 : 1;
uint64_t sw18 : 1;
uint64_t sw19 : 1;
uint64_t sw20 : 1;
uint64_t sw21 : 1;
uint64_t sw22 : 1;
uint64_t sw23 : 1;
uint64_t sw24 : 1;
uint64_t sw25 : 1;
uint64_t sw26 : 1;
uint64_t sw27 : 1;
uint64_t sw28 : 1;
uint64_t sw29 : 1;
uint64_t sw30 : 1;
uint64_t sw31 : 1;
uint64_t sw32 : 1;
uint64_t sw33 : 1;
uint64_t sw34 : 1;
uint64_t sw35 : 1;
uint64_t sw36 : 1;
uint64_t sw37 : 1;
uint64_t sw38 : 1;
uint64_t sw39 : 1;
uint64_t sw40 : 1;
uint64_t sw41 : 1;
uint64_t sw42 : 1;
uint64_t sw43 : 1;
uint64_t sw44 : 1;
uint64_t sw45 : 1;
uint64_t sw46 : 1;
uint64_t sw47 : 1;
uint64_t sw48 : 1;
uint64_t sw49 : 1;
uint64_t sw50 : 1;
uint64_t sw51 : 1;
uint64_t sw52 : 1;
uint64_t sw53 : 1;
uint64_t sw54 : 1;
uint64_t sw55 : 1;
uint64_t sw56 : 1;
uint64_t sw57 : 1;
uint64_t sw58 : 1;
uint64_t sw59 : 1;
uint64_t sw60 : 1;
uint64_t sw61 : 1;
uint64_t sw62 : 1;
uint64_t sw63 : 1;
};
} sw_t;
typedef struct
{
int (*init)(void);
int (*reset)(void);
int (*write)(sw_t sw_mask);
int (*read)(sw_t *p_sw_mask);
int (*get_sw_count)(uint32_t *p_sw_count);
} sw_drv_if_t;
#endif // !__MUX_DRV_IF_H__