XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
at24md.c
浏览该文件的文档.
1
21#include <xwos/standard.h>
22#include <string.h>
23#include <xwcd/ds/device.h>
24#include <xwcd/ds/soc/gpio.h>
28
29static __xwbsp_code
30xwer_t at24md_putc(struct xwds_eeprom * eeprom, xwu8_t data, xwsq_t addr, xwtm_t to);
31
32static __xwbsp_code
33xwer_t at24md_getc(struct xwds_eeprom * eeprom, xwu8_t * buf, xwsq_t addr, xwtm_t to);
34
35static __xwbsp_code
36xwer_t at24md_pgwrite(struct xwds_eeprom * eeprom,
37 xwu8_t * data, xwsz_t * size, xwsq_t pgidx,
38 xwtm_t to);
39
40static __xwbsp_code
41xwer_t at24md_pgread(struct xwds_eeprom * eeprom,
42 xwu8_t * buf, xwsz_t * size, xwsq_t pgidx,
43 xwtm_t to);
44
47 .i2cp = {
48 .base = {
49 .name = "xwds.eeprom",
50 .probe = NULL,
51 .remove = NULL,
52 .start = xwds_eeprom_drv_start,
54#if defined(XWCDCFG_ds_PM) && (1 == XWCDCFG_ds_PM)
55 .suspend = xwds_eeprom_drv_suspend,
56 .resume = xwds_eeprom_drv_resume,
57#endif
58 },
59 },
60 .putc = at24md_putc,
61 .getc = at24md_getc,
62 .pgwrite = at24md_pgwrite,
63 .pgread = at24md_pgread,
64};
65
66static __xwbsp_code
67xwer_t at24md_putc(struct xwds_eeprom * eeprom, xwu8_t data, xwsq_t addr, xwtm_t to)
68{
69 struct xwds_i2cm * bus;
70 struct xwds_i2c_msg msg;
71 xwer_t rc;
72 xwu8_t txdata[3];
73 xwu16_t i2cpaddr;
74
75 i2cpaddr = eeprom->i2cp.addr;
76 bus = eeprom->i2cp.bus;
77 txdata[0] = (xwu8_t)((addr >> (xwsq_t)8) & (xwu8_t)0xFF);
78 txdata[1] = (xwu8_t)(addr & (xwu8_t)0xFF);
79 txdata[2] = data;
80 msg.addr = ((i2cpaddr & (xwu16_t)0x00F0) |
81 (((addr >> (xwsq_t)16) & (xwu16_t)0x7) << (xwu16_t)1));
85 msg.data = txdata;
86 msg.size = sizeof(txdata);
87 rc = xwds_i2cm_xfer(bus, &msg, to);
88 return rc;
89}
90
91static __xwbsp_code
93{
94 struct xwds_i2cm * bus;
95 struct xwds_i2c_msg msg;
96 xwer_t rc;
97 xwu8_t txdata[2];
98 xwu16_t i2cpaddr;
99
100 i2cpaddr = eeprom->i2cp.addr;
101 bus = eeprom->i2cp.bus;
102 txdata[0] = (xwu8_t)((addr >> (xwsq_t)8) & (xwu8_t)0xFF);
103 txdata[1] = (xwu8_t)(addr & (xwu8_t)0xFF);
104 msg.addr = ((i2cpaddr & (xwu16_t)0x00F0) |
105 (((addr >> (xwsq_t)16) & (xwu16_t)0x7) << (xwu16_t)1));
107 msg.data = txdata;
108 msg.size = 2;
109 rc = xwds_i2cm_xfer(bus, &msg, to);
110 if (XWOK == rc) {
111 msg.addr = ((i2cpaddr & (xwu16_t)0x00F0) |
112 (((addr >> (xwsq_t)16) & (xwu16_t)0x7) << (xwu16_t)1));
116 msg.data = buf;
117 msg.size = 1;
118 rc = xwds_i2cm_xfer(bus, &msg, to);
119 }
120 return rc;
121}
122
123static __xwbsp_code
125 xwu8_t * data, xwsz_t * size, xwsq_t pgidx,
126 xwtm_t to)
127{
128 struct xwds_i2cm * bus;
129 const struct xwds_eeprom_parameter * parameter;
130 struct xwds_i2c_msg msg;
131 xwer_t rc;
132 xwu16_t i2cpaddr;
133 xwsq_t addr;
134 xwsz_t wrsz = *size;
135 xwu8_t txdata[wrsz + 2];
136
137 i2cpaddr = eeprom->i2cp.addr;
138 bus = eeprom->i2cp.bus;
139 parameter = &eeprom->parameter;
140 addr = ((pgidx * parameter->page_size) & (xwsq_t)0x7FFFF);
141 txdata[0] = (xwu8_t)((addr >> (xwsq_t)8) & (xwu8_t)0xFF);
142 txdata[1] = (xwu8_t)(addr & (xwu8_t)0xFF);
143 memcpy(&txdata[2], data, wrsz);
144 msg.addr = ((i2cpaddr & (xwu16_t)0x00F0) |
145 (((addr >> (xwsq_t)16) & (xwu16_t)0x7) << (xwu16_t)1));
149 msg.data = txdata;
150 msg.size = wrsz + 2;
151 rc = xwds_i2cm_xfer(bus, &msg, to);
152 if (rc < 0) {
153 *size = 0;
154 }
155 return rc;
156}
157
158static __xwbsp_code
160 xwu8_t * buf, xwsz_t * size, xwsq_t pgidx,
161 xwtm_t to)
162{
163 struct xwds_i2cm * bus;
164 const struct xwds_eeprom_parameter * parameter;
165 struct xwds_i2c_msg msg;
166 xwer_t rc;
167 xwu16_t i2cpaddr;
168 xwsq_t addr;
169 xwsz_t rdsz = *size;
170 xwu8_t txdata[2];
171
172 i2cpaddr = eeprom->i2cp.addr;
173 bus = eeprom->i2cp.bus;
174 parameter = &eeprom->parameter;
175 addr = ((pgidx * parameter->page_size) & (xwsq_t)0x7FFFF);
176 txdata[0] = (xwu8_t)((addr >> (xwsq_t)8) & (xwu8_t)0xFF);
177 txdata[1] = (xwu8_t)(addr & (xwu8_t)0xFF);
178 msg.addr = ((i2cpaddr & (xwu16_t)0x00F0) |
179 (((addr >> (xwsq_t)16) & (xwu16_t)0x7) << (xwu16_t)1));
181 msg.data = txdata;
182 msg.size = 2;
183 rc = xwds_i2cm_xfer(bus, &msg, to);
184 if (XWOK == rc) {
185 msg.addr = ((i2cpaddr & (xwu16_t)0x00F0) |
186 (((addr >> (xwsq_t)16) & (xwu16_t)0x7) << (xwu16_t)1));
190 msg.data = buf;
191 msg.size = rdsz;
192 rc = xwds_i2cm_xfer(bus, &msg, to);
193 if (XWOK == rc) {
194 *size = msg.size;
195 } else {
196 *size = 0;
197 }
198 } else {
199 *size = 0;
200 }
201 return rc;
202}
static xwer_t at24md_pgread(struct xwds_eeprom *eeprom, xwu8_t *buf, xwsz_t *size, xwsq_t pgidx, xwtm_t to)
Definition at24md.c:159
static xwer_t at24md_pgwrite(struct xwds_eeprom *eeprom, xwu8_t *data, xwsz_t *size, xwsq_t pgidx, xwtm_t to)
Definition at24md.c:124
const struct xwds_eeprom_driver at24md_drv
Definition at24md.c:46
static xwer_t at24md_getc(struct xwds_eeprom *eeprom, xwu8_t *buf, xwsq_t addr, xwtm_t to)
Definition at24md.c:92
static xwer_t at24md_putc(struct xwds_eeprom *eeprom, xwu8_t data, xwsq_t addr, xwtm_t to)
Definition at24md.c:67
玄武设备栈:设备基类
xwer_t xwds_i2cm_xfer(struct xwds_i2cm *i2cm, struct xwds_i2c_msg *msg, xwtm_t to)
XWDS API:传输I2C消息
Definition master.c:201
@ XWDS_I2C_F_WR
Definition common.h:43
@ XWDS_I2C_F_START
Definition common.h:46
@ XWDS_I2C_F_RD
Definition common.h:42
@ XWDS_I2C_F_STOP
Definition common.h:56
#define __xwbsp_rodata
Definition compiler.h:251
#define __xwbsp_code
Definition compiler.h:231
#define XWOK
No error
Definition errno.h:182
xws64_t xwtm_t
XWOS系统时间 (有符号)
Definition type.h:742
signed long xwer_t
Definition type.h:554
#define NULL
Definition type.h:28
unsigned long xwsz_t
Definition type.h:339
uint8_t xwu8_t
Definition type.h:194
unsigned long xwsq_t
Definition type.h:445
uint16_t xwu16_t
Definition type.h:230
xwer_t xwds_eeprom_drv_start(struct xwds_device *dev)
EEPROM基本驱动:启动设备
Definition driver.c:48
xwer_t xwds_eeprom_drv_suspend(struct xwds_device *dev)
EEPROM基本驱动:继续设备
Definition driver.c:108
xwer_t xwds_eeprom_drv_stop(struct xwds_device *dev)
EEPROM基本驱动:停止设备
Definition driver.c:87
xwer_t xwds_eeprom_drv_resume(struct xwds_device *dev)
EEPROM基本驱动:暂停设备
Definition driver.c:114
I2C EEPROM 驱动
玄武设备栈:I2C:外设
I2C EEPROM 设备
玄武设备栈:SOC:GPIO
const char * name
Definition device.h:115
EEPROM驱动函数表
Definition driver.h:38
struct xwds_i2cp_driver i2cp
Definition driver.h:39
const struct xwds_eeprom_parameter parameter
Definition device.h:40
struct xwds_i2cp i2cp
Definition device.h:39
I2C消息
Definition common.h:62
xwsz_t size
Definition common.h:68
xwu8_t * data
Definition common.h:67
xwu16_t addr
Definition common.h:63
xwu16_t flag
Definition common.h:66
I2C主机
Definition master.h:53
struct xwds_driver base
Definition peripheral.h:42
xwu16_t addr
Definition peripheral.h:53
struct xwds_i2cm * bus
Definition peripheral.h:52
XWOS的标准头文件