2 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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)) != NULL) {
52 memset(&stat, 0, sizeof(struct stat));
53 if (lstat(dir->d_name, &stat) < 0)
55 if (S_ISDIR(stat.st_mode) || S_ISLNK(stat.st_mode)) {
56 if (strncmp(".", dir->d_name, 1) == 0
57 || strncmp("..", dir->d_name, 2) == 0)
59 if (strncmp("mmcblk", dir->d_name, 6) == 0) {
60 snprintf(buf, 255, "/sys/block/%s/device/type",
63 fd = open(buf, O_RDONLY);
65 PRT_TRACE_ERR("%s open error: %s", buf,
69 r = read(fd, buf, 10);
70 if ((r >= 0) && (r < 10))
73 PRT_TRACE_ERR("%s read error: %s", buf,
76 if (strncmp("SD", buf, 2) == 0) {
77 char *str_mmcblk_num = strndup((dir->d_name) + 6, 1);
78 if (str_mmcblk_num == NULL) {
79 PRT_TRACE_ERR("Memory Allocation Failed");
88 PRT_TRACE("%d \n", mmcblk_num);
96 PRT_TRACE_ERR("Failed to find mmc block number\n");
100 static int ss_mmc_format(keynode_t *key_nodes, void *data)
102 PRT_TRACE_ERR("mmc format called");
103 device_set_property(DEVTYPE_MMC, MMC_PROP_FORMAT, 0);
108 int ss_mmc_unmounted(int argc, char **argv)
113 PRT_TRACE_ERR("Option is wong");
116 if ((option = atoi(argv[0])) < 0) {
117 PRT_TRACE_ERR("Option is wong : %d", option);
121 if (umount2(MMC_MOUNT_POINT, option) != 0) {
122 PRT_TRACE_ERR("Failed to unmount mmc card\n");
123 vconf_set_int(VCONFKEY_SYSMAN_MMC_UNMOUNT,
124 VCONFKEY_SYSMAN_MMC_UNMOUNT_FAILED);
128 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
129 VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED);
130 vconf_set_int(VCONFKEY_SYSMAN_MMC_UNMOUNT,
131 VCONFKEY_SYSMAN_MMC_UNMOUNT_COMPLETED);
132 mmc_status = VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED;
142 ss_action_entry_add_internal(PREDEF_MOUNT_MMC, ss_mmc_inserted, NULL,
144 ss_action_entry_add_internal(PREDEF_UNMOUNT_MMC, ss_mmc_unmounted, NULL,
146 ss_action_entry_add_internal(PREDEF_FORMAT_MMC, ss_mmc_format, NULL,
151 int ss_mmc_inserted()
154 int blk_num, ret, retry = 0;
158 if (mmc_status == VCONFKEY_SYSMAN_MMC_MOUNTED) {
159 PRT_DBG("Mmc is already mounted.\n");
160 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
161 VCONFKEY_SYSMAN_MMC_MOUNTED);
162 vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT,
163 VCONFKEY_SYSMAN_MMC_MOUNT_ALREADY);
167 if (access(MMC_MOUNT_POINT, R_OK) != 0) {
168 r = mkdir(MMC_MOUNT_POINT, 0755);
170 PRT_TRACE_ERR("Make Directory is failed");
175 if ((blk_num = get_mmcblk_num()) == -1) {
176 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
177 VCONFKEY_SYSMAN_MMC_REMOVED);
178 vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT,
179 VCONFKEY_SYSMAN_MMC_MOUNT_FAILED);
180 mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED;
185 snprintf(buf, sizeof(buf), "%s%d", MMC_DEV, blk_num);
187 (buf, MMC_MOUNT_POINT, "vfat", 0,
188 "uid=0,gid=0,dmask=0000,fmask=0111,iocharset=iso8859-1,utf8,shortname=mixed,smackfsroot=*,smackfsdef=*")
190 PRT_DBG("Mounted mmc card\n");
191 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
192 VCONFKEY_SYSMAN_MMC_MOUNTED);
193 vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT,
194 VCONFKEY_SYSMAN_MMC_MOUNT_COMPLETED);
195 mmc_status = VCONFKEY_SYSMAN_MMC_MOUNTED;
199 snprintf(buf, sizeof(buf), "%s%dp1", MMC_DEV, blk_num);
201 mount(buf, MMC_MOUNT_POINT, "vfat", 0,
202 "uid=0,gid=0,dmask=0000,fmask=0111,iocharset=iso8859-1,utf8,shortname=mixed,smackfsroot=*,smackfsdef=*"))
204 PRT_DBG("Mounted mmc card partition 1(%s)\n", buf);
205 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
206 VCONFKEY_SYSMAN_MMC_MOUNTED);
207 vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT,
208 VCONFKEY_SYSMAN_MMC_MOUNT_COMPLETED);
209 mmc_status = VCONFKEY_SYSMAN_MMC_MOUNTED;
213 } while (ret == -1 && errno == ENOENT && retry++ < 10);
215 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS,
216 VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED);
217 vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT,
218 VCONFKEY_SYSMAN_MMC_MOUNT_FAILED);
219 mmc_status = VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED;
220 PRT_TRACE_ERR("Failed to mount mmc card\n");
226 vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, VCONFKEY_SYSMAN_MMC_REMOVED);
228 if (umount2(MMC_MOUNT_POINT, MNT_DETACH) != 0) {
229 PRT_TRACE_ERR("Failed to unmount mmc card\n");
231 mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED;