2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <sys/mount.h>
27 #include "ss_device_handler.h"
29 #define MOVINAND_DEV "/dev/mmcblk0p1"
30 #define FORMAT_MMC PREFIX"/sbin/mkfs.vfat "
31 #define FORMAT_MOVINAND PREFIX"/bin/movi_format.sh"
45 if ((dp = opendir("/sys/block")) == NULL) {
46 PRT_TRACE_ERR("Can not open directory..\n");
51 while (dir = readdir(dp)) {
52 memset(&stat, 0, sizeof(struct stat));
53 lstat(dir->d_name, &stat);
54 if (S_ISDIR(stat.st_mode) || S_ISLNK(stat.st_mode)) {
55 if (strncmp(".", dir->d_name, 1) == 0
56 || strncmp("..", dir->d_name, 2) == 0)
58 if (strncmp("mmcblk", dir->d_name, 6) == 0) {
59 snprintf(buf, 255, "/sys/block/%s/device/type",
62 fd = open(buf, O_RDONLY);
64 PRT_TRACE_ERR("%s open error: %s", buf,
66 r = read(fd, buf, 10);
67 if ((r >= 0) && (r < 10))
70 PRT_TRACE_ERR("%s read error: %s", buf,
73 if (strncmp("SD", buf, 2) == 0) {
74 char *str_mmcblk_num = strndup((dir->d_name) + 6, 1);
75 if (str_mmcblk_num == NULL) {
76 PRT_TRACE_ERR("Memory Allocation Failed");
85 PRT_TRACE("%d \n", mmcblk_num);
93 PRT_TRACE_ERR("Failed to find mmc block number\n");
97 static int ss_mmc_format_tmp(keynode_t *key_nodes, void *data)
99 PRT_TRACE_ERR("mmc_format called");
100 if (vconf_keynode_get_int(key_nodes) == 1) {
101 PRT_TRACE_ERR("format start");
102 device_set_property(DEVTYPE_MMC, MMC_PROP_FORMAT, 0);
109 static int ss_mmc_format(keynode_t *key_nodes, void *data)
111 PRT_TRACE_ERR("mmc format called");
112 device_set_property(DEVTYPE_MMC, MMC_PROP_FORMAT, 0);
117 int ss_mmc_unmounted(int argc, char **argv)
122 PRT_TRACE_ERR("Option is wong");
125 if ((option = atoi(argv[0])) < 0) {
126 PRT_TRACE_ERR("Option is wong : %d", option);
130 if (umount2(MMC_MOUNT_POINT, option) != 0) {
131 PRT_TRACE_ERR("Failed to unmount mmc card\n");
132 vconf_set_int(VCONFKEY_SYSMAN_MMC_UNMOUNT,
133 VCONFKEY_SYSMAN_MMC_UNMOUNT_FAILED);
137 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
138 VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED);
139 vconf_set_int(VCONFKEY_SYSMAN_MMC_UNMOUNT,
140 VCONFKEY_SYSMAN_MMC_UNMOUNT_COMPLETED);
141 mmc_status = VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED;
151 vconf_notify_key_changed("memory/mmc/format", (void *)ss_mmc_format_tmp,
154 ss_action_entry_add_internal(PREDEF_MOUNT_MMC, ss_mmc_inserted, NULL,
156 ss_action_entry_add_internal(PREDEF_UNMOUNT_MMC, ss_mmc_unmounted, NULL,
158 ss_action_entry_add_internal(PREDEF_FORMAT_MMC, ss_mmc_format, NULL,
163 int ss_mmc_inserted()
166 int blk_num, ret, retry = 0;
170 if (mmc_status == VCONFKEY_SYSMAN_MMC_MOUNTED) {
171 PRT_DBG("Mmc is already mounted.\n");
172 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
173 VCONFKEY_SYSMAN_MMC_MOUNTED);
174 vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT,
175 VCONFKEY_SYSMAN_MMC_MOUNT_ALREADY);
179 if (access(MMC_MOUNT_POINT, R_OK) != 0)
180 mkdir(MMC_MOUNT_POINT, 0755);
182 if ((blk_num = get_mmcblk_num()) == -1) {
183 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
184 VCONFKEY_SYSMAN_MMC_REMOVED);
185 vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT,
186 VCONFKEY_SYSMAN_MMC_MOUNT_FAILED);
187 mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED;
192 snprintf(buf, sizeof(buf), "%s%d", MMC_DEV, blk_num);
194 (buf, MMC_MOUNT_POINT, "vfat", 0,
195 "uid=0,gid=0,dmask=0000,fmask=0111,iocharset=iso8859-1,utf8,shortname=mixed")
197 PRT_DBG("Mounted mmc card\n");
198 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
199 VCONFKEY_SYSMAN_MMC_MOUNTED);
200 vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT,
201 VCONFKEY_SYSMAN_MMC_MOUNT_COMPLETED);
202 mmc_status = VCONFKEY_SYSMAN_MMC_MOUNTED;
206 snprintf(buf, sizeof(buf), "%s%dp1", MMC_DEV, blk_num);
208 mount(buf, MMC_MOUNT_POINT, "vfat", 0,
209 "uid=0,gid=0,dmask=0000,fmask=0111,iocharset=iso8859-1,utf8,shortname=mixed"))
211 PRT_DBG("Mounted mmc card partition 1(%s)\n", buf);
212 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
213 VCONFKEY_SYSMAN_MMC_MOUNTED);
214 vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT,
215 VCONFKEY_SYSMAN_MMC_MOUNT_COMPLETED);
216 mmc_status = VCONFKEY_SYSMAN_MMC_MOUNTED;
220 } while (ret == -1 && errno == ENOENT && retry++ < 10);
222 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
223 VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED);
224 vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT,
225 VCONFKEY_SYSMAN_MMC_MOUNT_FAILED);
226 mmc_status = VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED;
227 PRT_TRACE_ERR("Failed to mount mmc card\n");
233 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, VCONFKEY_SYSMAN_MMC_REMOVED);
235 if (umount2(MMC_MOUNT_POINT, MNT_DETACH) != 0) {
236 PRT_TRACE_ERR("Failed to unmount mmc card\n");
238 mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED;