XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
driver.c 文件参考

玄武设备栈:I2C IO扩展芯片:TCA9539:驱动 更多...

driver.c 的引用(Include)关系图:

浏览源代码.

宏定义

#define LOGTAG   "TCA9539"
 

函数

static xwer_t xwds_tca9539_write (struct xwds_tca9539 *tca9539, xwu8_t reg, xwu8_t data, xwtm_t to)
 
static xwer_t xwds_tca9539_read (struct xwds_tca9539 *tca9539, xwu8_t reg, xwu8_t *buf, xwtm_t to)
 
xwer_t xwds_tca9539_drv_start (struct xwds_device *dev)
 TCA9539基本驱动:启动设备
 
xwer_t xwds_tca9539_drv_stop (struct xwds_device *dev)
 TCA9539基本驱动:停止设备
 
xwer_t xwds_tca9539_drv_suspend (struct xwds_device *dev)
 TCA9539基本驱动:暂停设备
 
xwer_t xwds_tca9539_drv_resume (struct xwds_device *dev)
 TCA9539基本驱动:继续设备
 
xwer_t xwds_tca9539_drv_gpio_req (struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmask, xwtm_t to)
 TCA9539 GPIO驱动:申请IO扩展芯片的GPIO
 
xwer_t xwds_tca9539_drv_gpio_rls (struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmask, xwtm_t to)
 TCA9539 GPIO驱动:释放IO扩展芯片的GPIO
 
xwer_t xwds_tca9539_drv_gpio_cfg (struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, void *cfg, xwtm_t to)
 TCA9539 GPIO驱动:配置IO扩展芯片的GPIO
 
xwer_t xwds_tca9539_drv_gpio_set (struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, xwtm_t to)
 TCA9539 GPIO驱动:将IO扩展芯片的GPIO设置为高电平
 
xwer_t xwds_tca9539_drv_gpio_reset (struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, xwtm_t to)
 TCA9539 GPIO驱动:将IO扩展芯片的GPIO设置为低电平
 
xwer_t xwds_tca9539_drv_gpio_toggle (struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, xwtm_t to)
 TCA9539 GPIO驱动:翻转IO扩展芯片的GPIO电平
 
xwer_t xwds_tca9539_drv_gpio_output (struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, xwsq_t out, xwtm_t to)
 TCA9539 GPIO驱动:并行输出多个IO扩展芯片的GPIO
 
xwer_t xwds_tca9539_drv_gpio_input (struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, xwsq_t *in, xwtm_t to)
 TCA9539 GPIO驱动:并行读取多个IO扩展芯片的GPIO
 
void xwds_tca9539_reset (struct xwds_tca9539 *tca9539, bool active)
 TCA9539 API:复位TCA9539
 
xwer_t xwds_tca9539_run (struct xwds_tca9539 *tca9539, xwds_eirq_f eisr, xwtm_t to)
 TCA9539 API:启动TCA9539
 
void xwds_tca9539_quit (struct xwds_tca9539 *tca9539)
 TCA9539 API:停止运行TCA9539
 
void xwds_tca9539_dump (struct xwds_tca9539 *tca9539, xwtm_t to)
 TCA9539 API:输出TCA9539的寄存器信息
 

变量

const struct xwds_iochip_driver xwds_tca9539_drv
 TCA9539的驱动
 

详细描述

玄武设备栈:I2C IO扩展芯片:TCA9539:驱动

作者

在文件 driver.c 中定义.

宏定义说明

◆ LOGTAG

#define LOGTAG   "TCA9539"

在文件 driver.c29 行定义.

函数说明

◆ xwds_tca9539_drv_gpio_cfg()

xwer_t xwds_tca9539_drv_gpio_cfg ( struct xwds_iochip iochip,
xwid_t  port,
xwsq_t  pinmsk,
void *  cfg,
xwtm_t  to 
)

TCA9539 GPIO驱动:配置IO扩展芯片的GPIO

参数
[in]iochipIOCHIP对象指针
[in]portGPIO端口
[in]pinmask引脚的掩码
[in]cfgGPIO配置,取值依据不同IOCHIP
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGEGPIO PORT错误
-ENOSYS不支持的API
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 driver.c174 行定义.

177{
178 struct xwds_tca9539 * tca9539 = xwds_cast(struct xwds_tca9539 *, iochip);
179 const struct xwds_tca9539_pincfg * pincfg = cfg;
180 xwer_t rc;
181 xwu8_t oldval;
182 xwu8_t newval;
183 xwu8_t cfgval;
184 xwu8_t regmsk;
185
186 regmsk = (xwu8_t)pinmsk & 0xFFU;
188 cfgval = regmsk;
189 } else {
190 cfgval = regmsk ^ regmsk;
191 }
192 if (1U == port) {
193 rc = xwds_tca9539_read(tca9539, XWDS_TCA9539_REG_P1_CFG, &oldval, to);
194 if (rc < 0) {
195 goto err_read;
196 }
197 newval = oldval & (~regmsk);
198 newval |= cfgval;
199 rc = xwds_tca9539_write(tca9539, XWDS_TCA9539_REG_P1_CFG, newval, to);
200 if (rc < 0) {
201 goto err_write;
202 }
203 } else {
204 rc = xwds_tca9539_read(tca9539, XWDS_TCA9539_REG_P0_CFG, &oldval, to);
205 if (rc < 0) {
206 goto err_read;
207 }
208 newval = oldval & (~regmsk);
209 newval |= cfgval;
210 rc = xwds_tca9539_write(tca9539, XWDS_TCA9539_REG_P0_CFG, newval, to);
211 if (rc < 0) {
212 goto err_write;
213 }
214 }
215 return XWOK;
216
217err_write:
218err_read:
219 return rc;
220}
#define xwds_cast(type, dev)
Definition standard.h:40
#define XWDS_TCA9539_REG_P1_CFG
Definition device.h:41
#define XWDS_TCA9539_REG_P0_CFG
Definition device.h:40
@ XWDS_TCA9539_PIN_DIRECTION_IN
Definition device.h:48
#define XWOK
No error
Definition errno.h:182
signed long xwer_t
Definition type.h:554
uint8_t xwu8_t
Definition type.h:194
static xwer_t xwds_tca9539_write(struct xwds_tca9539 *tca9539, xwu8_t reg, xwu8_t data, xwtm_t to)
Definition driver.c:32
static xwer_t xwds_tca9539_read(struct xwds_tca9539 *tca9539, xwu8_t reg, xwu8_t *buf, xwtm_t to)
Definition driver.c:55
TCA9539 PIN配置
Definition device.h:120
TCA9539对象
Definition device.h:127
struct xwds_iochip iochip
Definition device.h:128
函数调用图:

◆ xwds_tca9539_drv_gpio_input()

xwer_t xwds_tca9539_drv_gpio_input ( struct xwds_iochip iochip,
xwid_t  port,
xwsq_t  pinmsk,
xwsq_t in,
xwtm_t  to 
)

TCA9539 GPIO驱动:并行读取多个IO扩展芯片的GPIO

参数
[in]iochipIOCHIP对象指针
[in]portGPIO端口
[in]pinmask引脚的掩码
[out]inbuf输入缓冲区
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGEGPIO PORT错误
-EPERMGPIO PIN未被申请
-ENOSYS不支持的API
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 driver.c405 行定义.

408{
409 struct xwds_tca9539 * tca9539 = xwds_cast(struct xwds_tca9539 *, iochip);
410 xwer_t rc;
411 xwu8_t regval;
412 xwu8_t regmsk;
413
414 regmsk = (xwu8_t)pinmsk & 0xFFU;
415 if (1U == port) {
416 rc = xwds_tca9539_read(tca9539,
417 XWDS_TCA9539_REG_P1_INPUT, &regval, to);
418 if (rc < 0) {
419 goto err_read;
420 }
421 *in = regval & regmsk;
422 } else {
423 rc = xwds_tca9539_read(tca9539,
424 XWDS_TCA9539_REG_P0_INPUT, &regval, to);
425 if (rc < 0) {
426 goto err_read;
427 }
428 *in = regval & regmsk;
429 }
430 return XWOK;
431
432err_read:
433 return rc;
434}
#define XWDS_TCA9539_REG_P1_INPUT
Definition device.h:35
#define XWDS_TCA9539_REG_P0_INPUT
Definition device.h:34
函数调用图:

◆ xwds_tca9539_drv_gpio_output()

xwer_t xwds_tca9539_drv_gpio_output ( struct xwds_iochip iochip,
xwid_t  port,
xwsq_t  pinmsk,
xwsq_t  out,
xwtm_t  to 
)

TCA9539 GPIO驱动:并行输出多个IO扩展芯片的GPIO

参数
[in]iochipIOCHIP对象指针
[in]portGPIO端口
[in]pinmask引脚的掩码
[in]out输出值
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGEGPIO PORT错误
-EPERMGPIO PIN未被申请
-ENOSYS不支持的API
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 driver.c359 行定义.

362{
363 struct xwds_tca9539 * tca9539 = xwds_cast(struct xwds_tca9539 *, iochip);
364 xwer_t rc;
365 xwu8_t oldval;
366 xwu8_t newval;
367 xwu8_t regmsk;
368
369 regmsk = (xwu8_t)pinmsk & 0xFFU;
370 if (1U == port) {
371 rc = xwds_tca9539_read(tca9539,
372 XWDS_TCA9539_REG_P1_OUTPUT, &oldval, to);
373 if (rc < 0) {
374 goto err_read;
375 }
376 newval = oldval & (~regmsk);
377 newval |= (regmsk & (xwu8_t)out);
378 rc = xwds_tca9539_write(tca9539,
379 XWDS_TCA9539_REG_P1_OUTPUT, newval, to);
380 if (rc < 0) {
381 goto err_write;
382 }
383 } else {
384 rc = xwds_tca9539_read(tca9539,
385 XWDS_TCA9539_REG_P0_OUTPUT, &oldval, to);
386 if (rc < 0) {
387 goto err_read;
388 }
389 newval = oldval & (~regmsk);
390 newval |= (regmsk & (xwu8_t)out);
391 rc = xwds_tca9539_write(tca9539,
392 XWDS_TCA9539_REG_P0_OUTPUT, newval, to);
393 if (rc < 0) {
394 goto err_write;
395 }
396 }
397 return XWOK;
398
399err_write:
400err_read:
401 return rc;
402}
#define XWDS_TCA9539_REG_P0_OUTPUT
Definition device.h:36
#define XWDS_TCA9539_REG_P1_OUTPUT
Definition device.h:37
函数调用图:

◆ xwds_tca9539_drv_gpio_req()

xwer_t xwds_tca9539_drv_gpio_req ( struct xwds_iochip iochip,
xwid_t  port,
xwsq_t  pinmask,
xwtm_t  to 
)

TCA9539 GPIO驱动:申请IO扩展芯片的GPIO

参数
[in]iochipIOCHIP对象指针
[in]portGPIO端口
[in]pinmask引脚的掩码
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGEGPIO PORT错误
-EBUSYGPIO PIN已被使用
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

< 去除未使用变量的警告

< 去除未使用变量的警告

< 去除未使用变量的警告

< 去除未使用变量的警告

<No error

在文件 driver.c150 行定义.

153{
154 XWOS_UNUSED(iochip);
155 XWOS_UNUSED(port);
156 XWOS_UNUSED(pinmask);
157 XWOS_UNUSED(to);
158 return XWOK;
159}
#define XWOS_UNUSED(x)
Definition standard.h:66

◆ xwds_tca9539_drv_gpio_reset()

xwer_t xwds_tca9539_drv_gpio_reset ( struct xwds_iochip iochip,
xwid_t  port,
xwsq_t  pinmsk,
xwtm_t  to 
)

TCA9539 GPIO驱动:将IO扩展芯片的GPIO设置为低电平

参数
[in]iochipIOCHIP对象指针
[in]portGPIO端口
[in]pinmask引脚的掩码
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGEGPIO PORT错误
-EPERMGPIO PIN未被申请
-ENOSYS不支持的API
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 driver.c269 行定义.

272{
273 struct xwds_tca9539 * tca9539 = xwds_cast(struct xwds_tca9539 *, iochip);
274 xwer_t rc;
275 xwu8_t oldval;
276 xwu8_t newval;
277 xwu8_t regmsk;
278
279 regmsk = (xwu8_t)pinmsk & 0xFFU;
280 if (1U == port) {
281 rc = xwds_tca9539_read(tca9539,
282 XWDS_TCA9539_REG_P1_OUTPUT, &oldval, to);
283 if (rc < 0) {
284 goto err_read;
285 }
286 newval = oldval & (~regmsk);
287 rc = xwds_tca9539_write(tca9539,
288 XWDS_TCA9539_REG_P1_OUTPUT, newval, to);
289 if (rc < 0) {
290 goto err_write;
291 }
292 } else {
293 rc = xwds_tca9539_read(tca9539,
294 XWDS_TCA9539_REG_P0_OUTPUT, &oldval, to);
295 if (rc < 0) {
296 goto err_read;
297 }
298 newval = oldval & (~regmsk);
299 rc = xwds_tca9539_write(tca9539,
300 XWDS_TCA9539_REG_P0_OUTPUT, newval, to);
301 if (rc < 0) {
302 goto err_write;
303 }
304 }
305 return XWOK;
306
307err_write:
308err_read:
309 return rc;
310}
函数调用图:

◆ xwds_tca9539_drv_gpio_rls()

xwer_t xwds_tca9539_drv_gpio_rls ( struct xwds_iochip iochip,
xwid_t  port,
xwsq_t  pinmask,
xwtm_t  to 
)

TCA9539 GPIO驱动:释放IO扩展芯片的GPIO

参数
[in]iochipIOCHIP对象指针
[in]portGPIO端口
[in]pinmask引脚的掩码
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGEGPIO PORT错误
-EPERMGPIO PIN未被申请
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

< 去除未使用变量的警告

< 去除未使用变量的警告

< 去除未使用变量的警告

< 去除未使用变量的警告

<No error

在文件 driver.c162 行定义.

165{
166 XWOS_UNUSED(iochip);
167 XWOS_UNUSED(port);
168 XWOS_UNUSED(pinmask);
169 XWOS_UNUSED(to);
170 return XWOK;
171}

◆ xwds_tca9539_drv_gpio_set()

xwer_t xwds_tca9539_drv_gpio_set ( struct xwds_iochip iochip,
xwid_t  port,
xwsq_t  pinmsk,
xwtm_t  to 
)

TCA9539 GPIO驱动:将IO扩展芯片的GPIO设置为高电平

参数
[in]iochipIOCHIP对象指针
[in]portGPIO端口
[in]pinmask引脚的掩码
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGEGPIO PORT错误
-EPERMGPIO PIN未被申请
-ENOSYS不支持的API
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 driver.c223 行定义.

226{
227 struct xwds_tca9539 * tca9539 = xwds_cast(struct xwds_tca9539 *, iochip);
228 xwer_t rc;
229 xwu8_t oldval;
230 xwu8_t newval;
231 xwu8_t regmsk;
232
233 regmsk = (xwu8_t)pinmsk & 0xFFU;
234 if (1U == port) {
235 rc = xwds_tca9539_read(tca9539,
236 XWDS_TCA9539_REG_P1_OUTPUT, &oldval, to);
237 if (rc < 0) {
238 goto err_read;
239 }
240 newval = oldval & (~regmsk);
241 newval |= regmsk;
242 rc = xwds_tca9539_write(tca9539,
243 XWDS_TCA9539_REG_P1_OUTPUT, newval, to);
244 if (rc < 0) {
245 goto err_write;
246 }
247 } else {
248 rc = xwds_tca9539_read(tca9539,
249 XWDS_TCA9539_REG_P0_OUTPUT, &oldval, to);
250 if (rc < 0) {
251 goto err_read;
252 }
253 newval = oldval & (~regmsk);
254 newval |= regmsk;
255 rc = xwds_tca9539_write(tca9539,
256 XWDS_TCA9539_REG_P0_OUTPUT, newval, to);
257 if (rc < 0) {
258 goto err_write;
259 }
260 }
261 return XWOK;
262
263err_write:
264err_read:
265 return rc;
266}
函数调用图:

◆ xwds_tca9539_drv_gpio_toggle()

xwer_t xwds_tca9539_drv_gpio_toggle ( struct xwds_iochip iochip,
xwid_t  port,
xwsq_t  pinmsk,
xwtm_t  to 
)

TCA9539 GPIO驱动:翻转IO扩展芯片的GPIO电平

参数
[in]iochipIOCHIP对象指针
[in]portGPIO端口
[in]pinmask引脚的掩码
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGEGPIO PORT错误
-EPERMGPIO PIN未被申请
-ENOSYS不支持的API
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 driver.c313 行定义.

316{
317 struct xwds_tca9539 * tca9539 = xwds_cast(struct xwds_tca9539 *, iochip);
318 xwer_t rc;
319 xwu8_t oldval;
320 xwu8_t newval;
321 xwu8_t regmsk;
322
323 regmsk = (xwu8_t)pinmsk & 0xFFU;
324 if (1U == port) {
325 rc = xwds_tca9539_read(tca9539,
326 XWDS_TCA9539_REG_P1_OUTPUT, &oldval, to);
327 if (rc < 0) {
328 goto err_read;
329 }
330 newval = oldval & (~regmsk);
331 newval ^= regmsk;
332 rc = xwds_tca9539_write(tca9539,
333 XWDS_TCA9539_REG_P1_OUTPUT, newval, to);
334 if (rc < 0) {
335 goto err_write;
336 }
337 } else {
338 rc = xwds_tca9539_read(tca9539,
339 XWDS_TCA9539_REG_P0_OUTPUT, &oldval, to);
340 if (rc < 0) {
341 goto err_read;
342 }
343 newval = oldval & (~regmsk);
344 newval ^= regmsk;
345 rc = xwds_tca9539_write(tca9539,
346 XWDS_TCA9539_REG_P0_OUTPUT, newval, to);
347 if (rc < 0) {
348 goto err_write;
349 }
350 }
351 return XWOK;
352
353err_write:
354err_read:
355 return rc;
356}
函数调用图:

◆ xwds_tca9539_drv_resume()

xwer_t xwds_tca9539_drv_resume ( struct xwds_device dev)

TCA9539基本驱动:继续设备

在文件 driver.c142 行定义.

143{
144 return xwds_tca9539_drv_start(dev);
145}
xwer_t xwds_tca9539_drv_start(struct xwds_device *dev)
TCA9539基本驱动:启动设备
Definition driver.c:83
函数调用图:

◆ xwds_tca9539_drv_stop()

xwer_t xwds_tca9539_drv_stop ( struct xwds_device dev)

TCA9539基本驱动:停止设备

<No error

在文件 driver.c117 行定义.

118{
119 struct xwds_tca9539 * tca9539;
120 const struct xwds_resource_gpio * gpiorsc;
121
122 tca9539 = xwds_cast(struct xwds_tca9539 *, dev);
123 gpiorsc = tca9539->gpiorsc.irq;
124 if (NULL != gpiorsc) {
125 xwds_gpio_rls(gpiorsc->soc, gpiorsc->port, gpiorsc->pinmask);
126 }
127 gpiorsc = tca9539->gpiorsc.rst;
128 if (NULL != gpiorsc) {
129 xwds_gpio_rls(gpiorsc->soc, gpiorsc->port, gpiorsc->pinmask);
130 }
131 return XWOK;
132}
#define NULL
Definition type.h:28
xwer_t xwds_gpio_rls(struct xwds_soc *soc, xwid_t port, xwsq_t pinmask)
XWDS API:释放SOC的GPIO
Definition gpio.c:63
设备栈GPIO资源
Definition standard.h:98
struct xwds_soc * soc
Definition standard.h:99
const struct xwds_resource_gpio * irq
Definition device.h:131
const struct xwds_resource_gpio * rst
Definition device.h:130
struct xwds_tca9539::@39 gpiorsc
函数调用图:
这是这个函数的调用关系图:

◆ xwds_tca9539_drv_suspend()

xwer_t xwds_tca9539_drv_suspend ( struct xwds_device dev)

TCA9539基本驱动:暂停设备

在文件 driver.c136 行定义.

137{
138 return xwds_tca9539_drv_stop(dev);
139}
xwer_t xwds_tca9539_drv_stop(struct xwds_device *dev)
TCA9539基本驱动:停止设备
Definition driver.c:117
函数调用图:

◆ xwds_tca9539_dump()

void xwds_tca9539_dump ( struct xwds_tca9539 tca9539,
xwtm_t  to 
)

TCA9539 API:输出TCA9539的寄存器信息

参数
[in]tca9539I2C TCA9539对象的指针
[in]to期望唤醒的时间点
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

在文件 driver.c537 行定义.

538{
539 xwer_t rc;
540 xwu8_t val[8];
541
542 rc = xwds_tca9539_read(tca9539,
543 XWDS_TCA9539_REG_P0_INPUT, &val[0], to);
544 if (rc < 0) {
545 goto err_read;
546 }
547 rc = xwds_tca9539_read(tca9539,
548 XWDS_TCA9539_REG_P1_INPUT, &val[1], to);
549 if (rc < 0) {
550 goto err_read;
551 }
552 rc = xwds_tca9539_read(tca9539,
553 XWDS_TCA9539_REG_P0_OUTPUT, &val[2], to);
554 if (rc < 0) {
555 goto err_read;
556 }
557 rc = xwds_tca9539_read(tca9539,
558 XWDS_TCA9539_REG_P1_OUTPUT, &val[3], to);
559 if (rc < 0) {
560 goto err_read;
561 }
562 rc = xwds_tca9539_read(tca9539,
563 XWDS_TCA9539_REG_P0_POLINV, &val[4], to);
564 if (rc < 0) {
565 goto err_read;
566 }
567 rc = xwds_tca9539_read(tca9539,
568 XWDS_TCA9539_REG_P1_POLINV, &val[5], to);
569 if (rc < 0) {
570 goto err_read;
571 }
572 rc = xwds_tca9539_read(tca9539,
573 XWDS_TCA9539_REG_P0_CFG, &val[6], to);
574 if (rc < 0) {
575 goto err_read;
576 }
577 rc = xwds_tca9539_read(tca9539,
578 XWDS_TCA9539_REG_P1_CFG, &val[7], to);
579 if (rc < 0) {
580 goto err_read;
581 }
582 xwlogf(INFO, LOGTAG,
583 "[ID:%d] 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X\r\n",
584 tca9539->iochip.bc.i2cp.dev.id,
585 val[0], val[1], val[2], val[3],
586 val[4], val[5], val[6], val[7]);
587err_read:
588 return;
589}
#define XWDS_TCA9539_REG_P0_POLINV
Definition device.h:38
#define XWDS_TCA9539_REG_P1_POLINV
Definition device.h:39
#define xwlogf(lv, tag, fmt,...)
格式化日志,并输出
Definition xwlog.h:119
#define LOGTAG
Definition driver.c:29
xwid_t id
Definition device.h:131
struct xwds_device dev
Definition peripheral.h:49
struct xwds_i2cp i2cp
Definition chip.h:99
union xwds_iochip::@19 bc
函数调用图:

◆ xwds_tca9539_quit()

void xwds_tca9539_quit ( struct xwds_tca9539 tca9539)

TCA9539 API:停止运行TCA9539

参数
[in]tca9539I2C TCA9539对象的指针
[in]to期望唤醒的时间点
注解
  • 上下文:中断、中断底半部、线程

在文件 driver.c525 行定义.

526{
527 const struct xwds_resource_gpio * gpiorsc;
528
529 gpiorsc = tca9539->gpiorsc.irq;
530 if (NULL != gpiorsc) {
531 xwds_eirq_rls(gpiorsc->soc,
532 gpiorsc->port, gpiorsc->pinmask, tca9539->eirq);
533 }
534}
xwer_t xwds_eirq_rls(struct xwds_soc *soc, xwid_t port, xwsq_t pinmask, xwid_t eiid)
XWDS API:释放外部中断
Definition eirq.c:80
xwid_t eirq
Definition device.h:133
函数调用图:

◆ xwds_tca9539_read()

static xwer_t xwds_tca9539_read ( struct xwds_tca9539 tca9539,
xwu8_t  reg,
xwu8_t buf,
xwtm_t  to 
)
static

<No error

在文件 driver.c55 行定义.

58{
59 xwer_t rc;
60 struct xwds_i2cm * bus;
61 struct xwds_i2c_msg msg;
62
63 bus = tca9539->iochip.bc.i2cp.bus;
64 msg.addr = tca9539->iochip.bc.i2cp.addr;
66 msg.data = &reg;
67 msg.size = 1;
68 rc = xwds_i2cm_xfer(bus, &msg, to);
69 if (XWOK == rc) {
70 msg.addr = tca9539->iochip.bc.i2cp.addr;
71 msg.flag = ((xwu16_t)XWDS_I2C_F_START |
74 msg.data = buf;
75 msg.size = 1;
76 rc = xwds_i2cm_xfer(bus, &msg, to);
77 }
78 return rc;
79}
xwer_t xwds_i2cm_xfer(struct xwds_i2cm *i2cm, struct xwds_i2c_msg *msg, xwtm_t to)
XWDS API:传输I2C消息
Definition master.c:201
@ XWDS_I2C_F_WR
Definition common.h:43
@ XWDS_I2C_F_START
Definition common.h:46
@ XWDS_I2C_F_RD
Definition common.h:42
@ XWDS_I2C_F_STOP
Definition common.h:56
uint16_t xwu16_t
Definition type.h:230
I2C消息
Definition common.h:62
I2C主机
Definition master.h:53
xwu16_t addr
Definition peripheral.h:53
struct xwds_i2cm * bus
Definition peripheral.h:52
函数调用图:
这是这个函数的调用关系图:

◆ xwds_tca9539_reset()

void xwds_tca9539_reset ( struct xwds_tca9539 tca9539,
bool  active 
)

TCA9539 API:复位TCA9539

参数
[in]tca9539TCA9539对象的指针
[in]active是否使能复位
注解
  • 上下文:线程、中断底半部、线程

在文件 driver.c461 行定义.

462{
463 const struct xwds_resource_gpio * gpiorsc;
464
465 gpiorsc = tca9539->gpiorsc.rst;
466 if (gpiorsc) {
467 if (active) {
468 xwds_gpio_reset(gpiorsc->soc, gpiorsc->port, gpiorsc->pinmask);
469 } else {
470 xwds_gpio_set(gpiorsc->soc, gpiorsc->port, gpiorsc->pinmask);
471 }
472 }
473}
xwer_t xwds_gpio_reset(struct xwds_soc *soc, xwid_t port, xwsq_t pinmask)
XWDS API:将SOC的GPIO设置为低电平
Definition gpio.c:170
xwer_t xwds_gpio_set(struct xwds_soc *soc, xwid_t port, xwsq_t pinmask)
XWDS API:将SOC的GPIO设置为高电平
Definition gpio.c:131
函数调用图:
这是这个函数的调用关系图:

◆ xwds_tca9539_run()

xwer_t xwds_tca9539_run ( struct xwds_tca9539 tca9539,
xwds_eirq_f  eisr,
xwtm_t  to 
)

TCA9539 API:启动TCA9539

参数
[in]tca9539I2C TCA9539对象的指针
[in]eisr中断处理函数
[in]to期望唤醒的时间点 @retrun 错误码
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 driver.c476 行定义.

477{
478 const struct xwds_tca9539_cfg * chipcfg;
479 const struct xwds_resource_gpio * gpiorsc;
480 xwer_t rc;
481
482 chipcfg = (const struct xwds_tca9539_cfg *)tca9539->iochip.gpio.cfg;
483 rc = xwds_tca9539_write(tca9539,
484 XWDS_TCA9539_REG_P0_CFG, chipcfg->p0.direction.u8,
485 to);
486 if (rc < 0) {
487 goto err_write;
488 }
489 rc = xwds_tca9539_write(tca9539,
490 XWDS_TCA9539_REG_P1_CFG, chipcfg->p1.direction.u8,
491 to);
492 if (rc < 0) {
493 goto err_write;
494 }
495 rc = xwds_tca9539_write(tca9539,
496 XWDS_TCA9539_REG_P0_OUTPUT, chipcfg->p0.out.u8,
497 to);
498 if (rc < 0) {
499 goto err_write;
500 }
501 rc = xwds_tca9539_write(tca9539,
502 XWDS_TCA9539_REG_P1_OUTPUT, chipcfg->p1.out.u8,
503 to);
504 if (rc < 0) {
505 goto err_write;
506 }
507 gpiorsc = tca9539->gpiorsc.irq;
508 if (NULL != gpiorsc) {
509 rc = xwds_eirq_req(gpiorsc->soc,
510 gpiorsc->port, gpiorsc->pinmask, tca9539->eirq,
512 eisr, tca9539);
513 if (rc < 0) {
514 goto err_eirq_req;
515 }
516 }
517 return XWOK;
518
519err_eirq_req:
520err_write:
521 return rc;
522}
xwer_t xwds_eirq_req(struct xwds_soc *soc, xwid_t port, xwsq_t pinmask, xwid_t eiid, xwsq_t eiflag, xwds_eirq_f isr, xwds_eirq_arg_t arg)
XWDS API:申请外部中断
Definition eirq.c:26
@ XWDS_SOC_EIF_TM_FALLING
Definition eirq.h:42
@ XWDS_SOC_EIF_WKUP
Definition eirq.h:49
struct xwds_iochip::@20 gpio
void * cfg
Definition chip.h:108
TCA9539配置
Definition device.h:56
函数调用图:

◆ xwds_tca9539_write()

static xwer_t xwds_tca9539_write ( struct xwds_tca9539 tca9539,
xwu8_t  reg,
xwu8_t  data,
xwtm_t  to 
)
static

在文件 driver.c32 行定义.

35{
36 xwer_t rc;
37 struct xwds_i2cm * bus;
38 struct xwds_i2c_msg msg;
39 xwu8_t txdata[2];
40
41 bus = tca9539->iochip.bc.i2cp.bus;
42 txdata[0] = (xwu8_t)reg;
43 txdata[1] = (xwu8_t)data;
44 msg.addr = tca9539->iochip.bc.i2cp.addr;
45 msg.flag = ((xwu16_t)XWDS_I2C_F_START |
48 msg.data = txdata;
49 msg.size = sizeof(txdata);
50 rc = xwds_i2cm_xfer(bus, &msg, to);
51 return rc;
52}
xwu8_t * data
Definition common.h:67
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ xwds_tca9539_drv

const struct xwds_iochip_driver xwds_tca9539_drv
初始值:
= {
.base = {
.name = "xwds.tca9539",
.probe = ((void *)0) ,
.remove = ((void *)0) ,
},
}
xwer_t xwds_tca9539_drv_gpio_input(struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, xwsq_t *in, xwtm_t to)
TCA9539 GPIO驱动:并行读取多个IO扩展芯片的GPIO
Definition driver.c:405
xwer_t xwds_tca9539_drv_gpio_req(struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmask, xwtm_t to)
TCA9539 GPIO驱动:申请IO扩展芯片的GPIO
Definition driver.c:150
xwer_t xwds_tca9539_drv_gpio_reset(struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, xwtm_t to)
TCA9539 GPIO驱动:将IO扩展芯片的GPIO设置为低电平
Definition driver.c:269
xwer_t xwds_tca9539_drv_suspend(struct xwds_device *dev)
TCA9539基本驱动:暂停设备
Definition driver.c:136
xwer_t xwds_tca9539_drv_gpio_output(struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, xwsq_t out, xwtm_t to)
TCA9539 GPIO驱动:并行输出多个IO扩展芯片的GPIO
Definition driver.c:359
xwer_t xwds_tca9539_drv_gpio_cfg(struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, void *cfg, xwtm_t to)
TCA9539 GPIO驱动:配置IO扩展芯片的GPIO
Definition driver.c:174
xwer_t xwds_tca9539_drv_resume(struct xwds_device *dev)
TCA9539基本驱动:继续设备
Definition driver.c:142
xwer_t xwds_tca9539_drv_gpio_toggle(struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, xwtm_t to)
TCA9539 GPIO驱动:翻转IO扩展芯片的GPIO电平
Definition driver.c:313
xwer_t xwds_tca9539_drv_gpio_set(struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmsk, xwtm_t to)
TCA9539 GPIO驱动:将IO扩展芯片的GPIO设置为高电平
Definition driver.c:223
xwer_t xwds_tca9539_drv_gpio_rls(struct xwds_iochip *iochip, xwid_t port, xwsq_t pinmask, xwtm_t to)
TCA9539 GPIO驱动:释放IO扩展芯片的GPIO
Definition driver.c:162

TCA9539的驱动

在文件 driver.c437 行定义.