2017/3/13

rtc S35390A

http://jyhshin3.blogspot.tw/2010/03/s35390a-driver-for-8051.html
有說明。這個rtc 只用 4 個 bit 做 chip address, 剩下3個拿來當 command code.
所以當一般 i2c 裝置來看的化,他佔了 8 個位址。

kernel source code 也是這樣寫:
        s35390a->client[0] = client;
        i2c_set_clientdata(client, s35390a);

        /* This chip uses multiple addresses, use dummy devices for them */
        for (i = 1; i < 8; ++i) {
                s35390a->client[i] = i2c_new_dummy(client->adapter,
                                        client->addr + i);
                if (!s35390a->client[i]) {
                        dev_err(&client->dev, "Address %02x unavailable\n",
                                                client->addr + i);
                        err = -EBUSY;
                        goto exit_dummy;
                }


這樣看,他的 address 應該填 0x30 ..

在 defconfig 加上:
CONFIG_RTC_DRV_S35390A=y

在 board config 的 i2c bus device list 上加上:
       {       .type           = "s35390a",
               .addr           = 0x30,
               .flags          = 0,
       }


用 i2cdetect -y 1 (因為在 i2c-1 上)
可以看到
30: UU UU UU UU UU UU UU UU 38 39 3a 3b 3c 3d 3e 3f
符合source code..


struct i2c_msg {
        __u16 addr;     /* slave address                        */
        __u16 flags;
#define I2C_M_TEN               0x0010  /* this is a ten bit chip address */
#define I2C_M_RD                0x0001  /* read data, from slave to master */
#define I2C_M_NOSTART           0x4000  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_REV_DIR_ADDR      0x2000  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_IGNORE_NAK        0x1000  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NO_RD_ACK         0x0800  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_RECV_LEN          0x0400  /* length will be first received byte */
#define I2C_M_NEED_DELAY        0x0020  // add by kfx
#define I2C_M_REG8_DIRECT       0x0040  // add by kfx
        __u16 len;              /* msg length                           */
        __u8 *buf;              /* pointer to msg data                  */
        __u32 scl_rate;  // add by kfx
        int udelay;             //add by kfx
        __u16 read_type;
}

因為出現 i2c_transfer 的 warning, clk to low (0), 所以減查一下。發現只有 initialize i2c_msg 的前 4 個欄位。
所以在 初始值加一個欄位後 OK



check Android interface

在 Setting App 中... 最後 call AlarmManagerService 的 SetTimeMillis.
這個是 call /dev/alarm 的 ioctl ANDROID_ALARM_SET_RTC

找到 GPS, settime 也是call 這個 ioctl
所以 kernel rtc module 應該只要 implement set_time read_time 就可以,,.(?)
統整一下
i2c:

board config 的 i2c bus client data , id name 要填的是 client device driver 中 id table 填寫的 name, 不是 driver 的name。
填對了,client device driver 的 probe function 才會被呼叫。

i2cdetect -y devie 中 device 寫 0,1,2.. 就可以,他會一一去 read id address
列表中,沒反應的就會寫出 i2c address id
有反應的好像就是 --,有註冊的就是 UU

rtc:

最少要 implement read_time, set_time
register 後,會以 rtc0,1,2 的方式自動...

android 的 time set 和 gps 最後都會用 ANDROID_ALARM_SET_RTC 的 /dev/alarm ioctl 呼叫。
這個constant 定自在 bionic, 是 android 獨有的。

沒有留言:

張貼留言