有說明。這個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 獨有的。
沒有留言:
張貼留言