关于SDK中 bflb_device_get_by_name 的疑问分析

[复制链接]
查看680 | 回复7 | 2023-12-3 16:52:19 | 显示全部楼层 |阅读模式
本帖最后由 干簧管 于 2023-12-3 17:00 编辑

学习Ai-M61-32S的外设demo代码时发现每个例程前都有 bflb_device_get_by_name 来获得外设句柄

  1. gpio = bflb_device_get_by_name("gpio");
  2. i2c0 = bflb_device_get_by_name("i2c0");
  3. dma0_ch0 = bflb_device_get_by_name("dma0_ch0");
复制代码
于是感觉这个和 linux 中的of函数获取dts的属性有点类似,那么就来找找这个函数的具体实现吧
  1. >>>>drivers\lhal\config\bl602\device_table.c
  2. struct bflb_device_s *bflb_device_get_by_name(const char *name)
  3. {
  4.     for (uint8_t i = 0; i < sizeof(bl616_device_table) / sizeof(bl616_device_table[0]); i++) {
  5.         if (strcmp(bl616_device_table[i].name, name) == 0) {
  6.             return &bl616_device_table[i];
  7.         }
  8.     }
  9.     return NULL;
  10. }
复制代码
如上,函数中通过name查找 bflb_device_s 类型结构体 bl616_device_table 中的name字段,如果一致则返回其地址,然后这个bl616_device_table 就定义在这个文件上面,如下:含有name、reg_baseirq_num 等字段,其中 reg_base 刚好和我们的硬件打交道,即外设物理地址
  1. struct bflb_device_s bl616_device_table[] = {
  2.     { .name = "adc",
  3.       .reg_base = AON_BASE,
  4.       .irq_num = BL616_IRQ_GPADC_DMA,
  5.       .idx = 0,
  6.       .sub_idx = 0,
  7.       .dev_type = BFLB_DEVICE_TYPE_ADC,
  8.       .user_data = NULL },
  9.     { .name = "dac",
  10.       .reg_base = GLB_BASE,
  11.       .irq_num = 0xff,
  12.       .idx = 0,
  13.       .sub_idx = 0,
  14.       .dev_type = BFLB_DEVICE_TYPE_DAC,
  15.       .user_data = NULL },
  16.     { .name = "ef_ctrl",
  17.       .reg_base = EF_CTRL_BASE,
  18.       .irq_num = 0xff,
  19.       .idx = 0,
  20.       .sub_idx = 0,
  21.       .dev_type = BFLB_DEVICE_TYPE_EF_CTRL,
  22.       .user_data = NULL },
  23.     { .name = "gpio",
  24.       .reg_base = GLB_BASE,
  25.       .irq_num = BL616_IRQ_GPIO_INT0,
  26.       .idx = 0,
  27.       .sub_idx = 0,
  28.       .dev_type = BFLB_DEVICE_TYPE_GPIO,
  29.       .user_data = NULL },
  30.     { .name = "uart0",
  31.       .reg_base = UART0_BASE,
  32.       .irq_num = BL616_IRQ_UART0,
  33.       .idx = 0,
  34.       .dev_type = BFLB_DEVICE_TYPE_UART,
  35.       .user_data = NULL },
  36.     { .name = "uart1",
  37.       .reg_base = UART1_BASE,
  38.       .irq_num = BL616_IRQ_UART1,
  39.       .idx = 1,
  40.       .dev_type = BFLB_DEVICE_TYPE_UART,
  41.       .user_data = NULL },
  42.     { .name = "spi0",
  43.       .reg_base = SPI_BASE,
  44.       .irq_num = BL616_IRQ_SPI0,
  45.       .idx = 0,
  46.       .dev_type = BFLB_DEVICE_TYPE_SPI,
  47.       .user_data = NULL },
  48.     { .name = "pwm_v2_0",
  49.       .reg_base = PWM_BASE,
  50.       .irq_num = BL616_IRQ_PWM,
  51.       .idx = 0,
  52.       .sub_idx = 0,
  53.       .dev_type = BFLB_DEVICE_TYPE_PWM,
  54.       .user_data = NULL },
  55.     { .name = "dma0_ch0",
  56.       .reg_base = DMA_BASE + 1 * DMA_CHANNEL_OFFSET,
  57.       .irq_num = BL616_IRQ_DMA0_ALL,
  58.       .idx = 0,
  59.       .sub_idx = 0,
  60.       .dev_type = BFLB_DEVICE_TYPE_DMA,
  61.       .user_data = NULL },
  62.     { .name = "dma0_ch1",
  63.       .reg_base = DMA_BASE + 2 * DMA_CHANNEL_OFFSET,
  64.       .irq_num = BL616_IRQ_DMA0_ALL,
  65.       .idx = 0,
  66.       .sub_idx = 1,
  67.       .dev_type = BFLB_DEVICE_TYPE_DMA,
  68.       .user_data = NULL },
  69.     { .name = "dma0_ch2",
  70.       .reg_base = DMA_BASE + 3 * DMA_CHANNEL_OFFSET,
  71.       .irq_num = BL616_IRQ_DMA0_ALL,
  72.       .idx = 0,
  73.       .sub_idx = 2,
  74.       .dev_type = BFLB_DEVICE_TYPE_DMA,
  75.       .user_data = NULL },
  76.     { .name = "dma0_ch3",
  77.       .reg_base = DMA_BASE + 4 * DMA_CHANNEL_OFFSET,
  78.       .irq_num = BL616_IRQ_DMA0_ALL,
  79.       .idx = 0,
  80.       .sub_idx = 3,
  81.       .dev_type = BFLB_DEVICE_TYPE_DMA,
  82.       .user_data = NULL },
  83.     { .name = "dma0_ch4",
  84.       .reg_base = DMA_BASE + 5 * DMA_CHANNEL_OFFSET,
  85.       .irq_num = BL616_IRQ_DMA0_ALL,
  86.       .idx = 0,
  87.       .sub_idx = 4,
  88.       .dev_type = BFLB_DEVICE_TYPE_DMA,
  89.       .user_data = NULL },
  90.     { .name = "dma0_ch5",
  91.       .reg_base = DMA_BASE + 6 * DMA_CHANNEL_OFFSET,
  92.       .irq_num = BL616_IRQ_DMA0_ALL,
  93.       .idx = 0,
  94.       .sub_idx = 5,
  95.       .dev_type = BFLB_DEVICE_TYPE_DMA,
  96.       .user_data = NULL },
  97.     { .name = "dma0_ch6",
  98.       .reg_base = DMA_BASE + 7 * DMA_CHANNEL_OFFSET,
  99.       .irq_num = BL616_IRQ_DMA0_ALL,
  100.       .idx = 0,
  101.       .sub_idx = 6,
  102.       .dev_type = BFLB_DEVICE_TYPE_DMA,
  103.       .user_data = NULL },
  104.     { .name = "dma0_ch7",
  105.       .reg_base = DMA_BASE + 8 * DMA_CHANNEL_OFFSET,
  106.       .irq_num = BL616_IRQ_DMA0_ALL,
  107.       .idx = 0,
  108.       .sub_idx = 7,
  109.       .dev_type = BFLB_DEVICE_TYPE_DMA,
  110.       .user_data = NULL },
  111.     { .name = "i2c0",
  112.       .reg_base = I2C0_BASE,
  113.       .irq_num = BL616_IRQ_I2C0,
  114.       .idx = 0,
  115.       .sub_idx = 0,
  116.       .dev_type = BFLB_DEVICE_TYPE_I2C,
  117.       .user_data = NULL },
  118.     { .name = "i2c1",
  119.       .reg_base = I2C1_BASE,
  120.       .irq_num = BL616_IRQ_I2C1,
  121.       .idx = 1,
  122.       .sub_idx = 0,
  123.       .dev_type = BFLB_DEVICE_TYPE_I2C,
  124.       .user_data = NULL },
  125.     { .name = "i2s0",
  126.       .reg_base = I2S_BASE,
  127.       .irq_num = BL616_IRQ_I2S,
  128.       .idx = 0,
  129.       .sub_idx = 0,
  130.       .dev_type = BFLB_DEVICE_TYPE_I2S,
  131.       .user_data = NULL },
  132.     { .name = "timer0",
  133.       .reg_base = TIMER_BASE,
  134.       .irq_num = BL616_IRQ_TIMER0,
  135.       .idx = 0,
  136.       .sub_idx = 0,
  137.       .dev_type = BFLB_DEVICE_TYPE_TIMER,
  138.       .user_data = NULL },
  139.     { .name = "timer1",
  140.       .reg_base = TIMER_BASE,
  141.       .irq_num = BL616_IRQ_TIMER1,
  142.       .idx = 1,
  143.       .sub_idx = 0,
  144.       .dev_type = BFLB_DEVICE_TYPE_TIMER,
  145.       .user_data = NULL },
  146.     { .name = "rtc",
  147.       .reg_base = HBN_BASE,
  148.       .irq_num = BL616_IRQ_HBN_OUT0,
  149.       .idx = 0,
  150.       .sub_idx = 0,
  151.       .dev_type = BFLB_DEVICE_TYPE_RTC,
  152.       .user_data = NULL },
  153.     { .name = "aes",
  154.       .reg_base = SEC_ENG_BASE,
  155.       .irq_num = 0xff,
  156.       .idx = 0,
  157.       .sub_idx = 0,
  158.       .dev_type = BFLB_DEVICE_TYPE_AES,
  159.       .user_data = NULL },
  160.     { .name = "sha",
  161.       .reg_base = SEC_ENG_BASE,
  162.       .irq_num = 0xff,
  163.       .idx = 0,
  164.       .sub_idx = 0,
  165.       .dev_type = BFLB_DEVICE_TYPE_SHA,
  166.       .user_data = NULL },
  167.     { .name = "trng",
  168.       .reg_base = SEC_ENG_BASE,
  169.       .irq_num = 0xff,
  170.       .idx = 0,
  171.       .sub_idx = 0,
  172.       .dev_type = BFLB_DEVICE_TYPE_TRNG,
  173.       .user_data = NULL },
  174.     { .name = "pka",
  175.       .reg_base = SEC_ENG_BASE,
  176.       .irq_num = 0xff,
  177.       .idx = 0,
  178.       .sub_idx = 0,
  179.       .dev_type = BFLB_DEVICE_TYPE_PKA,
  180.       .user_data = NULL },
  181.     { .name = "emac0",
  182.       .reg_base = EMAC_BASE,
  183.       .irq_num = BL616_IRQ_EMAC,
  184.       .idx = 0,
  185.       .sub_idx = 0,
  186.       .dev_type = BFLB_DEVICE_TYPE_ETH,
  187.       .user_data = NULL },
  188.     { .name = "watchdog",
  189.       .reg_base = TIMER_BASE,
  190.       .irq_num = BL616_IRQ_WDG,
  191.       .idx = 0,
  192.       .sub_idx = 0,
  193.       .dev_type = BFLB_DEVICE_TYPE_TIMER,
  194.       .user_data = NULL },
  195.     { .name = "cks",
  196.       .reg_base = CKS_BASE,
  197.       .irq_num = 0,
  198.       .idx = 0,
  199.       .sub_idx = 0,
  200.       .dev_type = BFLB_DEVICE_TYPE_CKS,
  201.       .user_data = NULL },
  202.     { .name = "mjpeg",
  203.       .reg_base = MJPEG_BASE,
  204.       .irq_num = BL616_IRQ_MJPEG,
  205.       .idx = 0,
  206.       .sub_idx = 0,
  207.       .dev_type = BFLB_DEVICE_TYPE_MJPEG,
  208.       .user_data = NULL },
  209.     { .name = "irrx",
  210.       .reg_base = IR_BASE,
  211.       .irq_num = BL616_IRQ_IRRX,
  212.       .idx = 0,
  213.       .sub_idx = 0,
  214.       .dev_type = BFLB_DEVICE_TYPE_IR,
  215.       .user_data = NULL },
  216.     { .name = "cam0",
  217.       .reg_base = DVP2AXI0_BASE,
  218.       .irq_num = BL616_IRQ_DVP2BUS_INT0,
  219.       .idx = 0,
  220.       .sub_idx = 0,
  221.       .dev_type = BFLB_DEVICE_TYPE_CAMERA,
  222.       .user_data = NULL },
  223.     { .name = "cam1",
  224.       .reg_base = DVP2AXI1_BASE,
  225.       .irq_num = BL616_IRQ_DVP2BUS_INT1,
  226.       .idx = 0,
  227.       .sub_idx = 0,
  228.       .dev_type = BFLB_DEVICE_TYPE_CAMERA,
  229.       .user_data = NULL },
  230.     { .name = "auadc",
  231.       .reg_base = AUADC_BASE,
  232.       .irq_num = BL616_IRQ_AUADC,
  233.       .idx = 0,
  234.       .sub_idx = 0,
  235.       .dev_type = BFLB_DEVICE_TYPE_AUDIOADC,
  236.       .user_data = NULL },
  237.     { .name = "audac",
  238.       .reg_base = AUDAC_BASE,
  239.       .irq_num = BL616_IRQ_AUDAC,
  240.       .idx = 0,
  241.       .sub_idx = 0,
  242.       .dev_type = BFLB_DEVICE_TYPE_AUDIODAC,
  243.       .user_data = NULL },
  244.     { .name = "sdio2",
  245.       .reg_base = SDU_BASE,
  246.       .irq_num = BL616_IRQ_SDIO,
  247.       .idx = 0,
  248.       .sub_idx = 0,
  249.       .dev_type = BFLB_DEVICE_TYPE_SDIO2,
  250.       .user_data = NULL },
  251.     { .name = "dbi",
  252.       .reg_base = DBI_BASE,
  253.       .irq_num = BL616_IRQ_DBI,
  254.       .idx = 0,
  255.       .sub_idx = 0,
  256.       .dev_type = BFLB_DEVICE_TYPE_DBI,
  257.       .user_data = NULL },
  258.     { .name = "plfm_dma_ch0",
  259.       .reg_base = PLFM_DMA_BASE,
  260.       .irq_num = 0,
  261.       .idx = 0,
  262.       .sub_idx = 0,
  263.       .dev_type = BFLB_DEVICE_TYPE_PLFMDMA,
  264.       .user_data = NULL },
  265.     { .name = "plfm_dma_ch1",
  266.       .reg_base = PLFM_DMA_BASE,
  267.       .irq_num = 0,
  268.       .idx = 1,
  269.       .sub_idx = 0,
  270.       .dev_type = BFLB_DEVICE_TYPE_PLFMDMA,
  271.       .user_data = NULL },
  272.     { .name = "plfm_dma_ch2",
  273.       .reg_base = PLFM_DMA_BASE,
  274.       .irq_num = 0,
  275.       .idx = 2,
  276.       .sub_idx = 0,
  277.       .dev_type = BFLB_DEVICE_TYPE_PLFMDMA,
  278.       .user_data = NULL },      
  279.     { .name = "plfm_dma_ch3",
  280.       .reg_base = PLFM_DMA_BASE,
  281.       .irq_num = 0,
  282.       .idx = 3,
  283.       .sub_idx = 0,
  284.       .dev_type = BFLB_DEVICE_TYPE_PLFMDMA,
  285.       .user_data = NULL },
  286.     { .name = "plfm_dma_ch4",
  287.       .reg_base = PLFM_DMA_BASE,
  288.       .irq_num = 0,
  289.       .idx = 4,
  290.       .sub_idx = 0,
  291.       .dev_type = BFLB_DEVICE_TYPE_PLFMDMA,
  292.       .user_data = NULL },
  293. };
复制代码
如下,reg_base 字段的宏定义在 XXX_memorymap.h  文件中进行了定义
  1. >>>>drivers\lhal\config\bl616\bl616_memorymap.h

  2. #define MCU_MISC_BASE                        ((uint32_t)0x20009000)
  3. #define L1C_BASE                             ((uint32_t)0x20009000)
  4. #define UART0_BASE                           ((uint32_t)0x2000a000)
  5. #define UART1_BASE                           ((uint32_t)0x2000a100)
  6. #define SPI_BASE                             ((uint32_t)0x2000a200)
  7. #define I2C0_BASE                            ((uint32_t)0x2000a300)
  8. #define PWM_BASE                             ((uint32_t)0x2000a400)
  9. #define TIMER_BASE                           ((uint32_t)0x2000a500)
复制代码
然后也可以通过id字段匹配。
最后请问下坛友,关于介绍芯片这些寄存器的spec文档哪里有下载呀?谢谢!



回复

使用道具 举报

WT_0213 | 2023-12-4 08:42:20 | 显示全部楼层
研究的很深入呀
回复 支持 反对

使用道具 举报

bzhou830 | 2023-12-4 08:44:29 | 显示全部楼层
博流sdk介绍里面有说这个
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

爱笑 | 2023-12-4 11:48:29 | 显示全部楼层
用心做好保姆工作
回复

使用道具 举报

干簧管 | 2023-12-5 09:21:42 | 显示全部楼层
bzhou830 发表于 2023-12-4 08:44
博流sdk介绍里面有说这个

好的,我去学习下,感谢大佬指点
回复 支持 反对

使用道具 举报

干簧管 | 2023-12-5 09:22:58 | 显示全部楼层
WT_0213 发表于 2023-12-4 08:42
研究的很深入呀

一般一般
回复 支持 反对

使用道具 举报

WT_0213 | 2023-12-5 09:26:37 | 显示全部楼层
回复

使用道具 举报

心云 | 2023-12-5 09:59:59 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则