在rt5350 openwrt系统下spi的rtc ds3234配置

来源:互联网 发布:mac 拷贝隐藏文件 编辑:程序博客网 时间:2024/05/23 13:02

驱动配置(kernel_menuconfig)

Device Drivers  --->

[*] SPIsupport  --->

<*>   Ralink RT288x SPIController

         [*]Real Time Clock  --->

                   ***SPI RTC drivers ***

                   <*>   Maxim/Dallas DS3234                                //开启rtc的驱动

 

dts配置

对trunk/target/linux/ramips/dts/MPRA2.dts(在menuconfig里选择的配置文件)进行rtc的配置

palmbus@10000000 {

         ……

spi@b00 {

         status = "okay";

    m25p80@0 {

         ……

};

ds3234@1 {

    #address-cells =<1>;                                       

    #size-cells = <0>;

    compatible ="dallas,ds3234";                      ##ds3234的驱动属性

    spi-max-frequency =<2000000>;              ##最大时钟频率2000000

    reg = <1>;                                                               ##片选1

};

};

};

 

dts中spi的结点的加载过程会调用trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_rt305x/linux-3.18.11/drivers/spi/spi.c中的

static void of_register_spi_devices(structspi_master *master) 函数可看到对结点属性的解析,可根据自身需求进行配置。

例如reg属性的解析在这里(及片选)

/* 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;

编译烧写后,执行hwhwclock–w再用hwhwclock –r 读取rtc的时间测试。

发现出现hwclock: RTC_RD_TIME: Invalid argument 读取失败

于是用dmesg| grep ds323查看相关的打印

 [    0.830000] ds3234 spi32766.1: Control Reg:0x00

[   0.830000] ds3234 spi32766.1: Ctrl/Stat Reg: 0x00

[   0.830000] ds3234 spi32766.1: rtc core: registered ds3234 as rtc0

[   0.830000] ds3234 spi32766.1: hctosys: unable to read the hardware clock

rtc设备注册成功了,但是好像寄存器的值不对,也不能正常读取数据。

 

修改驱动

为了查找原因在spi.c文件中把

dev_dbg(&spi->dev, "setup mode%d, %s%s%s%s%u bits/w, %u Hz max --> %d\n",

                            (int)(spi->mode & (SPI_CPOL | SPI_CPHA)),

                            (spi->mode& SPI_CS_HIGH) ? "cs_high, " : "",

                            (spi->mode& SPI_LSB_FIRST) ? "lsb, " : "",

                            (spi->mode& SPI_3WIRE) ? "3wire, " : "",

                            (spi->mode& SPI_LOOP) ? "loopback, " : "",

                            spi->bits_per_word,spi->max_speed_hz,

                            status);

改成dev_info 查看打印信息发现

[   0.830000] ds3234 spi32766.1: setup mode 3, 8 bits/w, 2000000 Hz max--> 0

发现mode 是3

在rtc-ds3234.c(trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_rt305x/linux-3.18.11/drivers/rtc文件夹下)驱动文件中的staticint ds3234_probe(struct spi_device *spi)函数中

有这样一句spi->mode = SPI_MODE_3;

继续看这个宏发现#define SPI_MODE_3                  (SPI_CPOL|SPI_CPHA)

极性和相位都置1了。在看看ds3234的极性和相位都是0

于是改为SPI_MODE_0

再重新编译烧写后,用hwhwclock –w再用hwhwclock –r发现成功了。终于完成了对ds3234的配置

 


0 0
原创粉丝点击