IO口crossbar映射功能
📎 原始文档:https://www.kdocs.cn/l/cslmq4EUYL9b IO口crossbar映射功能
1、crossbar 含义
关于AC7000/AC897/AD697/AC698/BD19/JL701N/JL703N/AC706N/JL709N/JL708N /JL710N等系列的芯片,新加入了crossbar架构功能(Crossbar(即CrossPoint)被称为[交叉开关](https://baike.baidu.com/item/%E4%BA%A4%E5%8F%89%E5%BC%80%E5%85%B3)矩阵或纵横式交换[矩阵](https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5/18069)。),即可以理解为重映射功能,增加了crossbar功能后,所有的io口都可以任意的映射,外设模块没有指定的io,可以使用crossbar重映射到任意的gpio上。例如SD卡、iis、spi、iic、uart、ALINK、timer 、通用io等都可以使用重映射到指定的io中去使用。
701系列,PD和PE组IO不支持crossbar。
注意:并不是所有IC系列都带用Crossbar功能,可以通过查看对应IC 的datasheet或芯片用户手册确认。
例如AC700X的:

2、使用注意点
Crossbar具有输出和输出的指定功能:在SDK中可以查看io_imap.h和io_omap.h里面看具有的映射io 功能。
1、io_imap :表示为映射输入功能,io的功能定义如下:
2、io_omap:表示为映射输出的功能,io功能如下:
3、USB功能的io只能是DM 和 DP,没有映射功能。
4、关于SDK中如何使用crossbar功能的接口说明,可以在SDK 中 include_lib/driver/cpu/br36/asm/gpio.h文件中查看:
注意:只有以上可以映射的功能,才可以映射使用,SDK没有定义的请不要去使用映射功能(数字可以映射,模拟的映射不了),硬件设计之前,请开发板或者demo验证一下是否可以,最简单的是查看程序是否有定义功能。
3、DEMO
- 以下是SPI 使用crossbar映射功能测试参考配置:

- 701N 120SDK与上图在映射上多了一个mode参数

- JL701N 输时钟
//clkout: src --> clkout0/1/2/3 --> FO_GP_OCH0/1/2/3/4/5 --> gpio
extern void clk_out(u8 gpio, enum CLK_OUT_SOURCE clk);
extern void clk_out1(u8 gpio, enum CLK_OUT_SOURCE clk);
extern void clk_out2(u8 gpio, enum CLK_OUT_SOURCE clk);
extern void clk_out3(u8 gpio, enum CLK_OUT_SOURCE clk);
//例子
clk_out(IO_PORTA_07, BTOSC_24M_CLK_OUT); //输出24M时钟
- AC695N 输时钟

/**
* @brief gpio_set_output_channle
*
* @param gpio 参考宏IO_PORTx_xx,如IO_PORTA_00
* @param clk 参考枚举CHx_UTx_TX,如CH0_UT0_TX
*
* @return
*/
u32 gpio_output_channle(u32 gpio, u32 clk);
- 700N接口说明
//=================================================================================//
//@brief: CrossBar 输出设置 API, 将指定IO口设置为某个外设的输出
//@input:
// gpio: 需要输出外设信号的IO口;
// fun_index: 需要输出到指定IO口的外设信号, 可以输出外设信号列表请查看io_omap.h文件;
// dir_ctl: IO口方向由外设控制使能, 常设为1;
// data_ctl: IO口电平状态由外设控制使能, 常设为1;
// low_power_mode: 低功耗状态是否保持io功能;
//@return:
// 1)0: 执行正确;
// 2)-EINVAL: 传参出错;
//@note: 所映射的IO需要在设置IO状态为输出配置;
//@example: 将UART0的Tx信号输出到IO_PORTA_05口:
// gpio_direction_output(IO_PORTA_05, 1); //设置IO为输出状态
// gpio_set_fun_output_port(IO_PORTA_05, FO_UART0_TX, 1, 1); //将UART0的Tx信号输出到IO_PORTA_05口
//=================================================================================//
int gpio_set_fun_output_port(u32 gpio, u32 fun_index, u8 dir_ctl, u8 data_ctl, u8 low_power_mode);
//=================================================================================//
//@brief: CrossBar 输入设置 API, 将某个外设的输入设置为从某个IO输入
//@input:
// gpio: 需要输入外设信号的IO口;
// pfun: 需要从指定IO输入的外设信号, 可以输入的外设信号列表请查看gpio.h文件enum PFI_TABLE枚举项;
// low_power_mode: 低功耗状态是否保持io功能;
//@return:
// 1)0: 执行正确;
// 2)-EINVAL: 传参出错;
//@note: 所映射的IO需要在设置IO状态为输入配置;
//@example: 将UART0的Rx信号设置为IO_PORTA_05口输入:
// gpio_set_die(data->rx_pin, 1); //数字输入使能
// gpio_set_pull_up(data->rx_pin, 1); //上拉输入使能
// gpio_direction_input(IO_PORTA_05); //设置IO为输入状态
// gpio_set_fun_input_port(IO_PORTA_05, PFI_UART0_RX); //将UART0的Rx信号设置为IO_PORTA_05口输入
//=================================================================================//
int gpio_set_fun_input_port(u32 gpio, enum PFI_TABLE pfun, u32 low_power_mode);