国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Linux系統(tǒng)自帶SPI接口驅(qū)動(dòng)自測(cè)

2019-11-09 14:30:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友


轉(zhuǎn)自http://blog.csdn.net/yaolanshu_june/article/details/52152790

本文主要驗(yàn)證kernel/Documentation/spi目錄下spidev_test.c的測(cè)試?yán)蹋芊裾?刂芐PI接口。

一、驅(qū)動(dòng)配置1.修改設(shè)備樹(shù)找到內(nèi)核源碼linux-imx_share/arch/arm/boot/dts目錄下的imx6qdl-sabresd.dtsi,找到ecspi1的代碼

將spidev這段注釋去掉,開(kāi)啟這段代碼。

2.修改內(nèi)核配置輸入:make ARCH=arm menuconfig進(jìn)行內(nèi)核配置,進(jìn)入配置界面,依次選擇Device Drivers->SPI support,使User mode SPI device driver support選項(xiàng)起作用,選擇Y,并save。

選擇這個(gè)的目的是使spidev.c參與編譯,原因可以參考linux-imx_share/drivers/spi目錄下的Kconfig和Makefile。

配置好之后,運(yùn)行./build.sh,編譯生成zImage,zImage-imx6dl-sabresd-emmc.dtb燒寫(xiě)進(jìn)板子。檢查新燒進(jìn)去的系統(tǒng)里,dev目錄下有無(wú)spidev32766.0。如有,表示spidev的設(shè)備驅(qū)動(dòng)燒寫(xiě)成功。

二、測(cè)試1.找到ECSPI的引腳,連接MISO和MOSI,進(jìn)行自回環(huán)測(cè)試。

2.編寫(xiě)makefile生成自測(cè)代碼spidev_test.c對(duì)應(yīng)的可執(zhí)行程序。

 使用rz命令,將spidev_test上載至板子

接收的數(shù)據(jù)正確,自回環(huán)測(cè)試成功。------------------------------------------------------------------------------------------------------------------------------------疑問(wèn):生成的設(shè)備節(jié)點(diǎn)為什么是spidev32766.0?

在spidev.c中的函數(shù)spidev_PRobe里,找到設(shè)備節(jié)點(diǎn)的賦值。[objc] view plain copy print?spidev->devt = MKDEV(SPIDEV_MAJOR, minor);  //計(jì)算出設(shè)備號(hào)  //創(chuàng)建設(shè)備/dev/spidev%d.%d(spidev總線號(hào).片選號(hào))  dev = device_create(spidev_class, &spi->dev, spidev->devt,              spidev, "spidev%d.%d",              spi->master->bus_num, spi->chip_select);  下面看下spi->master->bus_num和spi->chip_select的值。

在drivers/spi目錄下的spi.c文件中,spi_alloc_master函數(shù)中,給master->bus_num = -1進(jìn)行了初始化。[objc] view plain copy print?struct spi_master *spi_alloc_master(struct device *dev, unsigned size)  {      struct spi_master   *master;        if (!dev)          return NULL;        master = kzalloc(size + sizeof(*master), GFP_KERNEL);      if (!master)          return NULL;        device_initialize(&master->dev);      <span style="color:#3333ff;">master->bus_num = -1;  //初始化      <span style="color:#3333ff;">master->num_chipselect = 1;      master->dev.class = &spi_master_class;      master->dev.parent = get_device(dev);      spi_master_set_devdata(master, &master[1]);        return master;  }  在spi_register_master函數(shù)中,對(duì)bus_num進(jìn)行了處理[objc] view plain copy print?/* convention:  dynamically assigned bus IDs count down from the max */      if (master->bus_num < 0) <span style="font-family: Arial, Helvetica, sans-serif;">{</span> [objc] view plain copy print?/* FIXME switch to an IDR based scheme, something like  * I2C now uses, so we can't run out of "dynamic" IDs  */  master->bus_num = atomic_dec_return(&dyn_bus_id);  dynamic = 1; 

其中dyn_bus_id計(jì)算結(jié)果是32767[objc] view plain copy print?static atomic_t     dyn_bus_id = ATOMIC_INIT((1<<15) - 1);  [objc] view plain copy print?#define atomic_dec_return(v)    (atomic_sub_return(1, v))  [objc] view plain copy print?static inline int atomic_sub_return(int i, atomic_t *v)  {      unsigned long flags;      int val;        raw_local_irq_save(flags);      val = v->counter;      v->counter = val -= i;      raw_local_irq_restore(flags);        return val;  }  如此計(jì)算出master->bus_num=32766。of_register_spi_devices函數(shù)里chip_select的獲得是通過(guò)value賦值的,而value是通過(guò)設(shè)備樹(shù)里的reg后面的值取得的[objc] view plain copy print?/* Device address */          rc = of_property_read_u32(nc, "reg", &value);          if (rc) {              dev_err(&master->dev, "%s has no valid 'reg' property (%d)/n",                  nc->full_name, rc);              spi_dev_put(spi);              continue;          }          spi->chip_select = value;  [objc] view plain copy print?spidev: spidev@0 {          spi-max-frequency = <24000000>;            reg = <0>;            compatible = "rohm,dh2228fv";             };  所以生成的設(shè)備節(jié)點(diǎn)號(hào)是spidev32766.0。

如果在imx6qdl-sabresd.dtsi設(shè)備樹(shù)里,改成下面這樣,則生成的設(shè)備節(jié)點(diǎn)號(hào)是spidev32766.1。[plain] view plain copy print?&ecspi1 {      fsl,spi-num-chipselects = <2>; //改成2      cs-gpios = <&gpio2 30 0>;      pinctrl-names = "default";      pinctrl-0 = <&pinctrl_ecspi1_1>;      status = "okay";        Flash: m25p32@0 {          #address-cells = <1>;          #size-cells = <1>;          compatible = "winbond,w25q32";          spi-max-frequency = <20000000>;          reg = <0>;      };        spidev: spidev@1 {          spi-max-frequency = <24000000>;            reg = <1>;            compatible = "rohm,dh2228fv";             };    }; 


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武城县| 阳新县| 竹山县| 南召县| 雅江县| 荆州市| 通榆县| 平湖市| 海林市| 蒙城县| 沈阳市| 灵宝市| 天柱县| 化德县| 阳朔县| 香港| 河间市| 四平市| 抚远县| 乌拉特中旗| 揭西县| 双桥区| 东兰县| 鹤山市| 阜南县| 英吉沙县| 镇远县| 涡阳县| 芒康县| 安义县| 乌苏市| 乐平市| 蕲春县| 榕江县| 华池县| 万载县| 大兴区| 澄江县| 宜春市| 富蕴县| 湘潭县|