4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the License);
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
23 #include "core/devices.h"
24 #include "core/edbus-handler.h"
25 #include "core/common.h"
27 #define FILE_BUFF_MAX 1024
28 #define NOT_INITIALIZED (-1)
30 #define METHOD_GET_NUM "GetNum"
31 #define METHOD_GET_SERIAL "GetSerial"
32 #define SERIAL_PATH_NAME "/csa/imei/serialno.dat"
34 #define METHOD_GET_REVISION "GetHWRev"
35 #define PATH_NAME "/proc/cpuinfo"
36 #define REVISION_NAME "Revision"
37 #define SERIAL_NAME "Serial"
38 #define SERIAL_TOK_DELIMITER ","
39 #define TOK_DELIMITER ":"
40 #define END_DELIMITER " \n"
42 #define CONVERT_TYPE 10
43 #define REVISION_SIZE 4
46 char serial[FILE_BUFF_MAX];
47 char num[FILE_BUFF_MAX];
50 static struct serial_info info;
52 static int read_from_file(const char *path, char *buf, size_t size)
60 fd = open(path, O_RDONLY, 0);
62 _E("Could not open '%s'", path);
66 count = read(fd, buf, size);
69 count = (count < size) ? count : size - 1;
70 while (count > 0 && buf[count - 1] == '\n')
82 static int get_revision(char *rev)
84 char buf[FILE_BUFF_MAX];
91 _E("Invalid argument !\n");
95 if (read_from_file(PATH_NAME, buf, FILE_BUFF_MAX) < 0) {
96 _E("fail to read %s\n", PATH_NAME);
100 tag = strstr(buf, REVISION_NAME);
102 _E("cannot find Hardware in %s\n", PATH_NAME);
106 start = strstr(tag, TOK_DELIMITER);
108 _E("cannot find Hardware in %s\n", PATH_NAME);
113 ptr = strtok(start, END_DELIMITER);
117 memset(rev, 0x00, REVISION_SIZE);
118 rev_num = strtol(ptr, NULL, radix);
119 sprintf(rev, "%d", rev_num);
124 static int get_cpuinfo_serial(void)
126 char buf[FILE_BUFF_MAX];
130 if (read_from_file(PATH_NAME, buf, FILE_BUFF_MAX) < 0) {
131 _E("fail to read %s\n", PATH_NAME);
135 tag = strstr(buf, SERIAL_NAME);
137 _E("cannot find Hardware in %s\n", PATH_NAME);
141 start = strstr(tag, TOK_DELIMITER);
143 _E("cannot find Hardware in %s\n", PATH_NAME);
148 ptr = strtok(start, END_DELIMITER);
149 strncpy(info.serial, ptr, strlen(ptr));
150 _D("%s", info.serial);
154 static DBusMessage *dbus_revision_handler(E_DBus_Object *obj, DBusMessage *msg)
156 DBusMessageIter iter;
158 char rev[FILE_BUFF_MAX];
160 static int ret = NOT_INITIALIZED;
162 if (ret != NOT_INITIALIZED)
164 ret = get_revision(rev);
166 ret = strtol(rev, &ptr, CONVERT_TYPE);
170 reply = dbus_message_new_method_return(msg);
171 dbus_message_iter_init_append(reply, &iter);
172 dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
176 static int get_serial(void)
178 static int ret = -EIO;
183 char buf[FILE_BUFF_MAX];
188 fd = open(SERIAL_PATH_NAME, O_RDONLY, 0);
192 r = read(fd, buf, FILE_BUFF_MAX);
193 if (r < 0 || r >= FILE_BUFF_MAX)
197 serial = strstr(buf, SERIAL_TOK_DELIMITER);
199 serial = strtok(tag, SERIAL_TOK_DELIMITER);
203 strncpy(info.serial, serial, r);
205 strncpy(info.serial, buf, r);
207 _D("%s %d", info.serial, r);
214 static int get_num(void)
216 static int ret = -EIO;
221 char buf[FILE_BUFF_MAX];
226 fd = open(SERIAL_PATH_NAME, O_RDONLY, 0);
230 r = read(fd, buf, FILE_BUFF_MAX);
231 if (r < 0 || r >= FILE_BUFF_MAX)
234 num = strstr(buf, SERIAL_TOK_DELIMITER);
238 strtok(tag, SERIAL_TOK_DELIMITER);
239 strtok(NULL, SERIAL_TOK_DELIMITER);
240 num = strtok(NULL, END_DELIMITER);
244 strncpy(info.num, num, r);
245 _D("%s %d", info.num, r);
252 static DBusMessage *dbus_serial_handler(E_DBus_Object *obj, DBusMessage *msg)
254 DBusMessageIter iter, arr;
257 static int ret = NOT_INITIALIZED;
258 char buf[FILE_BUFF_MAX];
263 ret = get_cpuinfo_serial();
265 len = strlen(info.serial);
266 strncpy(buf, info.serial, len);
267 _D("%s %d", buf, len);
270 _E("fail to get serial");
272 reply = dbus_message_new_method_return(msg);
273 dbus_message_iter_init_append(reply, &iter);
274 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, ¶m);
275 dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
279 static DBusMessage *dbus_num_handler(E_DBus_Object *obj, DBusMessage *msg)
281 DBusMessageIter iter, arr;
284 static char buf[FILE_BUFF_MAX];
285 static char *param = buf;
286 static int ret = NOT_INITIALIZED;
290 len = strlen(info.num);
291 strncpy(buf, info.num, len);
292 _D("%s %d", buf, len);
295 _E("fail to get num");
297 reply = dbus_message_new_method_return(msg);
298 dbus_message_iter_init_append(reply, &iter);
299 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, ¶m);
300 dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
304 static const struct edbus_method edbus_methods[] = {
305 { METHOD_GET_SERIAL, NULL, "si", dbus_serial_handler },
306 { METHOD_GET_REVISION, NULL, "i", dbus_revision_handler },
307 { METHOD_GET_NUM, NULL, "si", dbus_num_handler },
310 static void board_init(void *data)
314 ret = register_edbus_method(DEVICED_PATH_BOARD, edbus_methods, ARRAY_SIZE(edbus_methods));
316 _E("fail to init edbus method(%d)", ret);
319 _E("fail to get serial info(%d)", ret);
322 _E("fail to get num info(%d)", ret);
325 static const struct device_ops board_device_ops = {
326 .priority = DEVICE_PRIORITY_NORMAL,
331 DEVICE_OPS_REGISTER(&board_device_ops)