ZYNQ:Linux添加I2C-RTC驅動


硬件情況

image-20201016151350538

使用的是DS1338這款RTC時鍾芯片,I2C總線對應到PS端的I2C1。

配置

內核

添加有關的驅動:

因為DS1338用的驅動與DS13307相似,一找發現是同一個配置。

CONFIG_RTC_DRV_DS1307
    Device Drivers  --->
    	[*] Real Time Clock  --->
    		<*>   Dallas/Maxim DS1307/37/38/39/40/41, ST M41T00, EPSON RX-8025, ISL12057
    		[ ]     HWMON support for rtc-ds130
    		[ ]     Century bit support for rtc-ds1307

設備樹

修改system-user.dtsi,添加有關的設備樹:

編譯內核以后發現rtc時鍾還是不能用。

查閱文檔時,根據其他人的問題描述,才想起來發現需要使用設備樹。

&i2c1 {                          // 根據 zynq-7000.dtsi,選擇了i2c1
    status = "okay";			 // 開啟
    #address-cells = <1>; 
    #size-cells = <0>;
    
    // 添加 RTC 設備節點, @68 代表設備地址
    rtc0:rtc-ds1338@68 {
        	// 根據 drivers/rtc/rtc-ds1307.c 中的 compatible 表 找到的。
             compatible = "dallas,ds1338"; 
        
             // 設備地址
             reg = <0x68>; // PDF P13 : 1101 000 R/nW , 0x68+ R/nW 
    };
};

附錄:RTC配置調試記錄

尋找ds1338驅動

$ cd drivers/rtc
$ alias ft="grep -nR 2>/dev/null"
$ ft 1338

Kconfig:234:	  should handle DS1307, DS1337, DS1338, DS1339, DS1340, DS1341,
Binary file rtc-ds1307.o matches
rtc-ds1307.c:39:	ds_1338,
rtc-ds1307.c:78:#define DS1307_REG_CONTROL	0x07		/* or ds1338 */
rtc-ds1307.c:80:#	define DS1338_BIT_OSF		0x20
rtc-ds1307.c:189:	[ds_1338] = {
rtc-ds1307.c:244:	{ "ds1338", ds_1338 },
rtc-ds1307.c:277:		.compatible = "dallas,ds1338",
rtc-ds1307.c:278:		.data = (void *)ds_1338
rtc-ds1307.c:338:	{ .id = "DS1338", .driver_data = ds_1338 },
rtc-ds1307.c:1563:	case ds_1338:
rtc-ds1307.c:1569:		if (regs[DS1307_REG_CONTROL] & DS1338_BIT_OSF) {
rtc-ds1307.c:1572:				     ~DS1338_BIT_OSF);

drivers/rtc/rtc-ds1307.c發現了對應的設備樹適配接口:

static const struct of_device_id ds1307_of_match[] = {
    {         
        .compatible = "dallas,ds1307",
        .data = (void *)ds_1307
    },    
    {         
        .compatible = "dallas,ds1308",
        .data = (void *)ds_1308
    },    
    {         
        .compatible = "dallas,ds1337",
        .data = (void *)ds_1337
    },    
    {         
        .compatible = "dallas,ds1338", // 我所需要的設備樹節點屬性
        .data = (void *)ds_1338
    },    
    {         
        .compatible = "dallas,ds1339",
        .data = (void *)ds_1339
    },    
    {         
        .compatible = "dallas,ds1388",                                                                                                                             
        .data = (void *)ds_1388
    },  

知道后面應該會使用到compatible = "dallas,ds1338",復制了下來。

配置i2c總線

本文地址:https://www.cnblogs.com/schips/p/xilinx_zynq_linux_config_rtc_with_dts.html

之前配置好了I2C總線以后,能夠找到2個i2c總線驅動:

# ls /dev/i2c-*
/dev/i2c-0  /dev/i2c-1

但是發現一直不行。

# dmsg
...

hwclock: can't open '/dev/misc/rtc': No such file or directory
...

一度懷疑過是不是要手動創建設備節點(例如alsa),試過幾次以后放棄了這個方向。

rtc從設備地址的確定

下載並翻閱了DS1338Z的手冊,找到了讀寫地址有關描述:

讀寫有關地址

設備地址(7位):1101000 = 0x68

設備讀地址(BIT[0] = 1, R):11010001 = 0xD1

設備讀地址(BIT[0] = 0, W):11010000 = 0xD0

移植使用i2c-tools

根據文檔采用了i2c-tools這個工具。

因為整個系統的源碼是通過PetaLinux構建以后提取出來的,因此使用i2c-tools也是需要事先移植。

移植很簡單,見《arm linux 移植 i2c-tools 與 簡單使用

通過這個工具快速確定了總線、以及設備地址:

/mnt/i2c_tools/sbin# ./i2cdetect -l
i2c-1	i2c       	Cadence I2C at e0005000         	I2C adapter
i2c-0	i2c       	Cadence I2C at e0004000         	I2C adapter

/mnt/i2c_tools/sbin# ./i2cdump -f  -y 1 0x68 
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 28 52 23 02 02 01 00 b3 40 20 71 04 96 28 48 03    (R#???.?@ q??(H?
10: 80 00 42 c8 05 02 40 30 20 00 20 08 00 55 44 22    ?.B???@0 . ?.UD"
20: 49 a9 24 28 48 10 44 20 21 f1 2d a2 04 00 43 8c    I?$(H?D !?-??.C?
30: 50 24 00 24 20 2c 14 20 01 a0 01 89 02 00 21 88    P$.$ ,? ?????.!?
40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX

更正設備樹

根據這個情況,對設備樹進行了改正。

其實是因為自己記錯了總線,總以為是i2c-0

此后,rtc功能正常:

# dmsg
...
i2c /dev entries driver
cdns-i2c e0004000.i2c: 400 kHz mmio e0004000 irq 23
rtc-ds1307 1-0068: SET TIME!
rtc-ds1307 1-0068: registered as rtc0
cdns-i2c e0005000.i2c: 400 kHz mmio e0005000 irq 24
...

也能夠通過hwclock 進行讀寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM