linux,内核(kernel)对AD9371配置流程。
AD9371概念:
AD9371 是一款寬帶射頻 (RF) 收發(fā)器,提供了雙通道發(fā)射器和接收器、集成的合成器和數(shù)字信號(hào)處理功能。 該元件系列提供 FDD 和 TDD 應(yīng)用中的 3G/4G 微處理器和宏基站設(shè)備所需的高性能和低功耗的多功能組合。 AD9371 工作頻率為 300 MHz 至 6 GHz,涵蓋大部分需執(zhí)照和免執(zhí)照蜂窩頻帶。 該 IC 支持高達(dá) 100 MHz 的接收器帶寬。 器件還支持觀測(cè)接收器,發(fā)送合成帶寬高達(dá) 250 MHz,可適應(yīng)數(shù)字校正算法。
AD9371 包括寬帶直接轉(zhuǎn)換信號(hào)路徑,具有最尖端的噪聲系數(shù)和線性度。 每個(gè)完整的接收器和發(fā)射器子系統(tǒng)包括 DC 偏移校正、正交錯(cuò)誤校正和可編程數(shù)字濾波器,因而無(wú)需在數(shù)字基帶中使用這些功能。 集成的多個(gè)輔助功能,如輔助模數(shù)轉(zhuǎn)換器 (ADC)、輔助數(shù)模轉(zhuǎn)換器 (DAC) 和通用輸入/輸出 (GPIO) 可提供額外的監(jiān)視和控制能力。
| 特性 | ? |
|
|
| 應(yīng)用 | ? |
|
內(nèi)核菜單欄配置:
Linux Kernel ConfigurationDevice 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將內(nèi)核固件"Mykonos_M3.bin"加入到內(nèi)核配置菜單欄中
?drive? -->
? ? ? Generic Driver Option--->
在內(nèi)核源碼中:/drive/iio/ad9371.c
其在內(nèi)核初始化流程如下:
ad9371初始化 1. 從ad9371_probe開(kāi)始執(zhí)行 2. clk = devm_clk_get(&spi->dev, "jesd_rx_clk"); 獲取jesd_rx_clk的結(jié)構(gòu)體 3. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*phy)); 分配IIO驅(qū)動(dòng)資源 4. ret = ad9371_alloc_mykonos_device(phy); 分配9371 API參數(shù)內(nèi)存 5. phy->pdata = ad9371_phy_parse_dt(indio_dev, &spi->dev); 設(shè)置9371 API默認(rèn)參數(shù),還未配到9371 6. phy->reset_gpio = devm_gpiod_get(&spi->dev, "reset", GPIOD_OUT_LOW); ad9371_reset(phy); 復(fù)位9371 7. phy->sysref_req_gpio = devm_gpiod_get(&spi->dev, "sysref_req", GPIOD_OUT_HIGH); sysref_req拉高 8. 初始化SPI接口參數(shù) 9. 如果有TX, phy->jesd_tx_clk = devm_clk_get(&spi->dev, "jesd_tx_clk"); 獲取jesd_tx_clk的結(jié)構(gòu)體 10. phy->jesd_rx_os_clk = devm_clk_get(&spi->dev, "jesd_rx_os_clk"); 獲取jesd_rx_os_clk的結(jié)構(gòu)體 11. phy->dev_clk = devm_clk_get(&spi->dev, "dev_clk"); 獲取dev_clk的結(jié)構(gòu)體 12. phy->fmc_clk = devm_clk_get(&spi->dev, "fmc_clk"); 獲取fmc_clk的結(jié)構(gòu)體 13. phy->sysref_dev_clk = devm_clk_get(&spi->dev, "sysref_dev_clk"); 獲取sysref_dev_clk的結(jié)構(gòu)體 14. phy->sysref_fmc_clk = devm_clk_get(&spi->dev, "sysref_fmc_clk"); 獲取sysref_fmc_clk的結(jié)構(gòu)體 15. ret = clk_prepare_enable(phy->fmc_clk); 打開(kāi)fmc_clk時(shí)鐘*****fpga device clk 16. ret = clk_prepare_enable(phy->dev_clk); 打開(kāi)dev_clk時(shí)鐘 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); 注冊(cè)rx_sampl_clk時(shí)鐘 20. 生成配置接口文件profile_config 21. 生成配置接口文件gain_table_config 22. 注冊(cè)IIO驅(qū)動(dòng) 23. ret = ad9371_register_axi_converter(phy); ? 24. ret = ad9371_register_debugfs(indio_dev); 生成debugfs下的參數(shù)文件接口ad9371_setup() 1. 獲取dev_clk,fmc_clk,這兩個(gè)必須相等 2. 如果rx使能,ad9371_set_jesd_lanerate()算rx lanerate,設(shè)置到phy->jesd_rx_clk 3. ret = ad9371_update_sysref(phy, lmfc); 計(jì)算LMFC,看是否和sysref匹配,判斷fpga的sysref和9371的sysref是否一致 4. ret = ad9371_reset(phy); 復(fù)位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 計(jì)算TX RX通道參數(shù)5.7 CMB_SPIWriteByte(device->spiSettings, MYKONOS_ADDR_CONFIGURATION_CONTROL_2, txChannelSettings);CMB_SPIWriteByte(device->spiSettings, MYKONOS_ADDR_CONFIGURATION_CONTROL_4, rxChannelSettings); 設(shè)置rx tx參數(shù)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的狀態(tài) 10. MYKONOS_initArm(), Load Mykonos ARM10.1 retVal = MYKONOS_setupJesd204bFramer(device); 配置204b framer 11. MYKONOS_loadArmFromBinary() 加載固件文件 12. Set RF PLL Frequencies 13. ret = ad9371_init_cal(phy, initCalMask); 校準(zhǔn) 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在應(yīng)用層配置設(shè)置:
請(qǐng)參考:
AD9371配置設(shè)置https://wiki.analog.com/resources/tools-software/linux-drivers/iio-transceiver/ad9371
?
?
總結(jié)
以上是生活随笔為你收集整理的linux,内核(kernel)对AD9371配置流程。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux的 i2c 驱动框架分析
- 下一篇: 得到app产品体验报告