LINUX,內核(KERNEL)對AD9371配置流程

AD9371 是一款寬帶射頻 (RF) 收發器,提供了雙通道發射器和接收器、集成的合成器和數字信號處理功能。 該元件系列提供 FDD 和 TDD 應用中的 3G/4G 微處理器和宏基站設備所需的高性能和低功耗的多功能組合。 AD9371 工作頻率爲 300 MHz 至 6 GHz,涵蓋大部分需執照和免執照蜂窩頻帶。 該 IC 支持高達 100 MHz 的接收器帶寬。 器件還支持觀測接收器,發送合成帶寬高達 250 MHz,可適應數字校正算法。

AD9371 包括寬帶直接轉換信號路徑,具有最尖端的噪聲係數和線性度。 每個完整的接收器和發射器子系統包括 DC 偏移校正、正交錯誤校正和可編程數字濾波器,因而無需在數字基帶中使用這些功能。 集成的多個輔助功能,如輔助模數轉換器 (ADC)、輔助數模轉換器 (DAC) 和通用輸入/輸出 (GPIO) 可提供額外的監視和控制能力。

特性 雙通道差分發射器 (Tx) 雙通道差分接收器 (Rx) 帶兩路輸入的觀測接收器 (ORx) 嗅探器接收器 (SnRx),3 路輸入 頻率/調諧範圍:300 MHz 至 6 GHz Tx 合成帶寬 (BW) 至 250 MHz Rx 帶寬:8 MHz 至 100 MHz 支持頻分雙工 (FDD) 和時分雙工 (TDD) 操作 Tx、Rx、ORx 和時鐘生成的全集成獨立小數 N 分頻射頻 (RF) 頻率合成器 JESD204B 數字接口 串行接口:串行外設接口 (SPI) 電源輸出 – 7 dbm 供電電壓:3.3 V 電流c接收:1 A 電流 – 發射:1.1 A GPIO:19 工作溫度:-40C° 至 +85C° 196-LFBGA 應用 微波 航空航天 軍事 3G/4G 微處理器和宏基站 (BTS) 內核菜單欄配置:

Linux Kernel Configuration Device Drivers ---> <> Industrial I/O support ---> --- Industrial I/O support -- Enable ring buffer support within IIO -- Industrial I/O lock free software ring -- Enable triggered sampling support

          *** Analog to digital converters ***
    [--snip--]

	-*- Analog Devices High-Speed AXI ADC driver core
	< > Analog Devices AD9361, AD9364 RF Agile Transceiver driver
	<*> Analog Devices AD9371 RF Transceiver driver
	< > Analog Devices AD6676 Wideband IF Receiver driver
	< > Analog Devices AD9467, AD9680, etc. high speed ADCs
	< > Analog Devices Motor Control (AD-FMCMOTCON) drivers
	< > Generic FFT driver
	<*> Generic AXI JESD204B configuration driver

    [--snip--]

Frequency Synthesizers DDS/PLL  --->
		Direct Digital Synthesis  --->
 		<*> Analog Devices CoreFPGA AXI DDS driver

將內核固件"Mykonos_M3.bin"加入到內核配置菜單欄中

drive -->

  Generic Driver Option--->

在內核源碼中:/drive/iio/ad9371.c

其在內核初始化流程如下:

ad9371初始化

  1. 從ad9371_probe開始執行
  2. clk = devm_clk_get(&spi->dev, "jesd_rx_clk"); 獲取jesd_rx_clk的結構體
  3. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*phy)); 分配IIO驅動資源
  4. ret = ad9371_alloc_mykonos_device(phy); 分配9371 API參數內存
  5. phy->pdata = ad9371_phy_parse_dt(indio_dev, &spi->dev); 設置9371 API默認參數,還未配到9371
  6. phy->reset_gpio = devm_gpiod_get(&spi->dev, "reset", GPIOD_OUT_LOW); ad9371_reset(phy); 復位9371
  7. phy->sysref_req_gpio = devm_gpiod_get(&spi->dev, "sysref_req", GPIOD_OUT_HIGH); sysref_req拉高
  8. 初始化SPI接口參數
  9. 如果有TX, phy->jesd_tx_clk = devm_clk_get(&spi->dev, "jesd_tx_clk"); 獲取jesd_tx_clk的結構體
  10. phy->jesd_rx_os_clk = devm_clk_get(&spi->dev, "jesd_rx_os_clk"); 獲取jesd_rx_os_clk的結構體
  11. phy->dev_clk = devm_clk_get(&spi->dev, "dev_clk"); 獲取dev_clk的結構體
  12. phy->fmc_clk = devm_clk_get(&spi->dev, "fmc_clk"); 獲取fmc_clk的結構體
  13. phy->sysref_dev_clk = devm_clk_get(&spi->dev, "sysref_dev_clk"); 獲取sysref_dev_clk的結構體
  14. phy->sysref_fmc_clk = devm_clk_get(&spi->dev, "sysref_fmc_clk"); 獲取sysref_fmc_clk的結構體
  15. ret = clk_prepare_enable(phy->fmc_clk); 打開fmc_clk時鐘*****fpga device clk
  16. ret = clk_prepare_enable(phy->dev_clk); 打開dev_clk時鐘
  17. ret = request_firmware(&phy->fw, FIRMWARE, &spi->dev); 加載固件文件
  18. ret = ad9371_setup(phy); 配置9371
  19. ad9371_clk_register(phy, "-rx_sampl_clk", NULL, NULL, CLK_GET_RATE_NOCACHE | CLK_IGNORE_UNUSED , RX_SAMPL_CLK); 註冊rx_sampl_clk時鐘
  20. 生成配置接口文件profile_config
  21. 生成配置接口文件gain_table_config
  22. 註冊IIO驅動
  23. ret = ad9371_register_axi_converter(phy); ?
  24. ret = ad9371_register_debugfs(indio_dev); 生成debugfs下的參數文件接口

ad9371_setup()

  1. 獲取dev_clk,fmc_clk,這兩個必須相等
  2. 如果rx使能,ad9371_set_jesd_lanerate()算rx lanerate,設置到phy->jesd_rx_clk
  3. ret = ad9371_update_sysref(phy, lmfc); 計算LMFC,看是否和sysref匹配,判斷fpga的sysref和9371的sysref是否一致
  4. ret = ad9371_reset(phy); 復位9371
  5. ret = MYKONOS_initialize(mykDevice);
    5.1 /* Enable Reference clock - Set REFCLK pad common mode voltage / CMB_SPIWriteByte(device->spiSettings, MYKONOS_ADDR_REF_PAD_CONFIG2, 0x07);
    5.2 CMB_SPIWriteByte(device->spiSettings, MYKONOS_ADDR_SYSREF_PAD_CONFIG, 0x12); //Enable SYSREF input buffer 5.3 選擇tx rx orx的SYNCB輸入模式 5.4 /
    Set number of device clock cycles per microsecond [round(freq/2) - 1] / CMB_SPIWriteByte(device->spiSettings, MYKONOS_ADDR_REFERENCE_CLOCK_CYCLES, (uint8_t)((((device->clocks->deviceClock_kHz / 1000) + 1) >> 1) - 1)); 5.5 / Set profile specific digital clock dividers / CMB_SPIWriteByte(device->spiSettings, MYKONOS_ADDR_CONFIGURATION_CONTROL_1, 0x04); / Negate Rx2 so phase matches Rx1 /
    5.6 計算TX RX通道參數 5.7 CMB_SPIWriteByte(device->spiSettings, MYKONOS_ADDR_CONFIGURATION_CONTROL_2, txChannelSettings); CMB_SPIWriteByte(device->spiSettings, MYKONOS_ADDR_CONFIGURATION_CONTROL_4, rxChannelSettings); 設置rx tx參數 5.8 /
    Set the CLKPLL with the frequency from the device data structure */ retVal = MYKONOS_initDigitalClocks(device);
  6. ret = MYKONOS_checkPllsLockStatus(mykDevice, &pllLockStatus); CLKPLL Status Check
  7. ret = MYKONOS_enableMultichipSync(mykDevice, 1, NULL); Perform MultiChip Sync (MCS) on Mykonos Device
  8. ad9371_sysref_req(phy, SYSREF_PULSE);
  9. ret = MYKONOS_enableMultichipSync(mykDevice, 0, &mcsStatus); 回讀MCS的狀態
  10. MYKONOS_initArm(), Load Mykonos ARM 10.1 retVal = MYKONOS_setupJesd204bFramer(device); 配置204b framer
  11. MYKONOS_loadArmFromBinary() 加載固件文件
  12. Set RF PLL Frequencies
  13. ret = ad9371_init_cal(phy, initCalMask); 校準
  14. /**** Enable SYSREF to Mykonos JESD204B Framers / / < User: Make sure SYSREF is stopped/disabled > / / < User: make sure BBIC JESD is reset and ready to recieve CGS chars> ***/ ret = MYKONOS_enableSysrefToRxFramer(mykDevice, 1);
  15. Enable SYSREF to Mykonos JESD204B Deframer 在應用層配置設置:

請參考:

AD9371配置設置https://wiki.analog.com/resources/tools-software/linux-drivers/iio-transceiver/ad9371

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章