mdss_video_enhance.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985
  1. /* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. * You should have received a copy of the GNU General Public License
  13. * along with this program; if not, write to the Free Software
  14. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  15. * 02110-1301, USA.
  16. *
  17. */
  18. #include <linux/module.h>
  19. #include <linux/kernel.h>
  20. #include <linux/errno.h>
  21. #include <linux/clk.h>
  22. #include <linux/mutex.h>
  23. #include <linux/poll.h>
  24. #include <linux/wait.h>
  25. #include <linux/fs.h>
  26. #include <linux/irq.h>
  27. #include <linux/mm.h>
  28. #include <linux/fb.h>
  29. #include <linux/ctype.h>
  30. #include <linux/miscdevice.h>
  31. #include <linux/dma-mapping.h>
  32. #include <linux/delay.h>
  33. #include <linux/device.h>
  34. #include <linux/fb.h>
  35. #include <linux/msm_mdp.h>
  36. #include <linux/ioctl.h>
  37. #include <linux/lcd.h>
  38. #include "mdss_fb.h"
  39. #include "mdss_video_enhance.h"
  40. #include "mdss_dsi.h"
  41. //#include "mdp4_video_tuning.h"
  42. //#include "msm_fb.h"
  43. //#include "mdp.h"
  44. #include "mdp3.h"
  45. //#define MDP4_VIDEO_ENHANCE_TUNING
  46. //#define VIDEO_ENHANCE_DEBUG
  47. #ifdef VIDEO_ENHANCE_DEBUG
  48. #define DPRINT(x...) printk(KERN_ERR "mdnie " x)
  49. #else
  50. #define DPRINT(x...)
  51. #endif
  52. #define MAX_LUT_SIZE 256
  53. #define MDNIE_COLOR_BLINDE_CMD 18
  54. unsigned int mDNIe_data[MAX_LUT_SIZE * 3];
  55. int play_speed_1_5;
  56. #if defined(CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_HD_PT) || \
  57. defined(CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_WVGA_PT)
  58. boolean camera_mode;
  59. #endif
  60. int mDNIe_data_sharpness;
  61. enum Lcd_mDNIe_UI {
  62. mDNIe_UI_MODE,
  63. mDNIe_VIDEO_MODE,
  64. mDNIe_CAMERA_MODE,
  65. mDNIe_NAVI,
  66. mDNIe_GALLERY,
  67. mDNIe_BYPASS,
  68. mDNIe_DMB_MODE,
  69. #ifdef BROWSER_COLOR_TONE_SET
  70. mDNIe_BROWSER_TONE1 = 40,
  71. mDNIe_BROWSER_TONE2,
  72. mDNIe_BROWSER_TONE3,
  73. #endif
  74. };
  75. enum Lcd_mDNIe_User_Set {
  76. mDNIe_DYNAMIC,
  77. mDNIe_STANDARD,
  78. mDNIe_MOVIE,
  79. };
  80. enum Lcd_mDNIe_Negative {
  81. mDNIe_NEGATIVE_OFF = 0,
  82. mDNIe_NEGATIVE_ON,
  83. };
  84. enum ACCESSIBILITY {
  85. ACCESSIBILITY_OFF,
  86. NEGATIVE,
  87. COLOR_BLIND,
  88. ACCESSIBILITY_MAX,
  89. };
  90. static struct class *mdnie_class;
  91. struct device *tune_mdnie_dev;
  92. enum Lcd_mDNIe_UI current_mDNIe_Mode = mDNIe_UI_MODE;
  93. enum Lcd_mDNIe_Negative current_Negative_Mode = mDNIe_NEGATIVE_OFF;
  94. static bool g_mdine_enable ;
  95. #ifdef MDP4_VIDEO_ENHANCE_TUNING
  96. #define MAX_FILE_NAME 128
  97. #define TUNING_FILE_PATH "/sdcard/tuning/"
  98. static int tuning_enable ;
  99. static char tuning_filename[MAX_FILE_NAME];
  100. static int load_tuning_data(char *filename);
  101. static int parse_text(char *src, int len);
  102. #endif
  103. #ifdef MDP4_VIDEO_ENHANCE_TUNING
  104. static int parse_text(char *src, int len)
  105. {
  106. int i, count, ret;
  107. int index = 0;
  108. int j = 0;
  109. char *str_line[300];
  110. char *sstart;
  111. char *c;
  112. unsigned int data1, data2, data3;
  113. int sharpvalue;
  114. c = src;
  115. count = 0;
  116. sstart = c;
  117. sharpvalue = 0;
  118. for (i = 0; i < len; i++, c++) {
  119. char a = *c;
  120. if (a == '\r' || a == '\n') {
  121. if (c > sstart) {
  122. str_line[count] = sstart;
  123. count++;
  124. }
  125. *c = '\0';
  126. sstart = c + 1;
  127. }
  128. }
  129. if (c > sstart) {
  130. str_line[count] = sstart;
  131. count++;
  132. }
  133. ret = sscanf(str_line[0], "%d\n", &sharpvalue);
  134. DPRINT("sharp ret %d, sharpvalue %d\n", ret, sharpvalue);
  135. mDNIe_data_sharpness = sharpvalue;
  136. for (i = 1; i < count; i++) {
  137. DPRINT("line:%d, [start]%s[end]\n", i, str_line[i]);
  138. ret =
  139. sscanf(str_line[i], "0x%x, 0x%x, 0x%x\n", &data1, &data2,
  140. &data3);
  141. DPRINT("Result => [0x%2x 0x%2x 0x%2x] %s\n", data1, data2,
  142. data3, (ret == 3) ? "Ok" : "Not available");
  143. DPRINT("ret => %d\n", ret);
  144. if (ret == 3) {
  145. mDNIe_data[j++] = data1;
  146. mDNIe_data[j++] = data2;
  147. mDNIe_data[j++] = data3;
  148. index++;
  149. }
  150. }
  151. return index;
  152. }
  153. static int load_tuning_data(char *filename)
  154. {
  155. struct file *filp;
  156. char *dp;
  157. long l;
  158. loff_t pos;
  159. int ret, num;
  160. mm_segment_t fs;
  161. DPRINT("[CMC623:INFO]:%s called loading file name : [%s]\n", __func__,
  162. filename);
  163. fs = get_fs();
  164. set_fs(get_ds());
  165. filp = filp_open(filename, O_RDONLY, 0);
  166. if (IS_ERR(filp)) {
  167. printk(KERN_ERR "[CMC623:ERROR]:File open failed\n");
  168. return -1;
  169. }
  170. l = filp->f_path.dentry->d_inode->i_size;
  171. DPRINT("[CMC623:INFO]: Loading File Size : %ld(bytes)", l);
  172. dp = kmalloc(l + 10, GFP_KERNEL);
  173. if (dp == NULL) {
  174. DPRINT
  175. ("[CMC623:ERROR]:Can't not alloc memory"\
  176. "for tuning file load\n");
  177. filp_close(filp, current->files);
  178. return -1;
  179. }
  180. pos = 0;
  181. memset(dp, 0, l);
  182. DPRINT("[CMC623:INFO] : before vfs_read()\n");
  183. ret = vfs_read(filp, (char __user *)dp, l, &pos);
  184. DPRINT("[CMC623:INFO] : after vfs_read()\n");
  185. if (ret != l) {
  186. DPRINT("[CMC623:ERROR] : vfs_read() filed ret : %d\n", ret);
  187. kfree(dp);
  188. filp_close(filp, current->files);
  189. return -1;
  190. }
  191. filp_close(filp, current->files);
  192. set_fs(fs);
  193. num = parse_text(dp, l);
  194. if (!num) {
  195. DPRINT("[CMC623:ERROR]:Nothing to parse\n");
  196. kfree(dp);
  197. return -1;
  198. }
  199. DPRINT("[CMC623:INFO] : Loading Tuning Value's Count : %d", num);
  200. lut_tune(num, mDNIe_data);
  201. sharpness_tune(mDNIe_data_sharpness);
  202. kfree(dp);
  203. return num;
  204. }
  205. static ssize_t tuning_show(struct device *dev,
  206. struct device_attribute *attr, char *buf)
  207. {
  208. int ret = 0;
  209. ret = sprintf(buf, "Tunned File Name : %s\n", tuning_filename);
  210. return ret;
  211. }
  212. static ssize_t tuning_store(struct device *dev,
  213. struct device_attribute *attr, const char *buf,
  214. size_t size)
  215. {
  216. char *pt;
  217. memset(tuning_filename, 0, sizeof(tuning_filename));
  218. sprintf(tuning_filename, "%s%s", TUNING_FILE_PATH, buf);
  219. pt = tuning_filename;
  220. while (*pt) {
  221. if (*pt == '\r' || *pt == '\n') {
  222. *pt = 0;
  223. break;
  224. }
  225. pt++;
  226. }
  227. DPRINT("[CMC623:INFO]:%s:%s\n", __func__, tuning_filename);
  228. if (load_tuning_data(tuning_filename) <= 0) {
  229. DPRINT("[CMC623:ERROR]:load_tunig_data() failed\n");
  230. return size;
  231. }
  232. tuning_enable = 1;
  233. return size;
  234. }
  235. static DEVICE_ATTR(tuning, 0664, tuning_show, tuning_store);
  236. #endif
  237. void free_cmap(struct fb_cmap *cmap)
  238. {
  239. kfree(cmap->red);
  240. kfree(cmap->green);
  241. kfree(cmap->blue);
  242. }
  243. #if 0
  244. void lut_tune(int num, unsigned int *pLutTable)
  245. {
  246. __u16 *r, *g, *b, i;
  247. int j;
  248. struct fb_info *info;
  249. struct fb_cmap test_cmap;
  250. struct fb_cmap *cmap;
  251. struct msm_fb_data_type *mfd;
  252. uint32_t out;
  253. /*for final assignment*/
  254. u16 r_1, g_1, b_1;
  255. info = registered_fb[0];
  256. cmap = &test_cmap;
  257. /*=====================================
  258. * cmap allocation
  259. =====================================*/
  260. cmap->red = 0;
  261. cmap->green = 0;
  262. cmap->blue = 0;
  263. cmap->transp = 0;
  264. cmap->start = 0;
  265. cmap->len = num; /*MAX_LUT_SIZE;//LUT has 256 entries*/
  266. cmap->red = kmalloc(cmap->len * sizeof(__u16), GFP_KERNEL);
  267. if (!cmap->red) {
  268. printk(KERN_ERR "can't malloc cmap!");
  269. goto fail_rest;
  270. }
  271. cmap->green = kmalloc(cmap->len * sizeof(__u16), GFP_KERNEL);
  272. if (!cmap->green) {
  273. printk(KERN_ERR "can't malloc cmap!");
  274. goto fail_rest;
  275. }
  276. cmap->blue = kmalloc(cmap->len * sizeof(__u16), GFP_KERNEL);
  277. if (!cmap->blue) {
  278. printk(KERN_ERR "can't malloc cmap!");
  279. goto fail_rest;
  280. }
  281. r = cmap->red;
  282. g = cmap->green;
  283. b = cmap->blue;
  284. j = 0;
  285. DPRINT("cmap->len %d\n", cmap->len);
  286. /* Assigning the cmap */
  287. for (i = 0; i < cmap->len; i++) {
  288. *r++ = pLutTable[j++];
  289. *g++ = pLutTable[j++];
  290. *b++ = pLutTable[j++];
  291. }
  292. /*instead of an ioctl */
  293. //mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
  294. j = 0;
  295. for (i = 0; i < cmap->len; i++) {
  296. r_1 = pLutTable[j++];
  297. g_1 = pLutTable[j++];
  298. b_1 = pLutTable[j++];
  299. #ifdef CONFIG_FB_MSM_MDP40
  300. MIPI_OUTP(MDP_BASE + 0x94800 +
  301. #else
  302. MIPI_OUTP(MDP_BASE + 0x93800 +
  303. #endif
  304. (0x400 * mdp_lut_i) + cmap->start * 4 + i * 4,
  305. ((g_1 & 0xff) |
  306. ((b_1 & 0xff) << 8) | ((r_1 & 0xff) << 16)));
  307. }
  308. mfd = (struct msm_fb_data_type *) registered_fb[0]->par;
  309. if (mfd->panel.type == MIPI_CMD_PANEL) {
  310. //mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
  311. mutex_lock(&mdp_lut_push_sem);
  312. mdp_lut_push = 1;
  313. mdp_lut_push_i = mdp_lut_i;
  314. mutex_unlock(&mdp_lut_push_sem);
  315. } else {
  316. /*mask off non LUT select bits*/
  317. out = MIPI_INP(MDP_BASE + 0x90070) & ~((0x1 << 10) | 0x7);
  318. MIPI_OUTP(MDP_BASE + 0x90070, (mdp_lut_i << 10) | 0x7 | out);
  319. //mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
  320. }
  321. mdp_lut_i = (mdp_lut_i + 1)%2;
  322. fail_rest:
  323. free_cmap(cmap);
  324. /*close(fb);*/
  325. }
  326. #endif
  327. #if 0
  328. void sharpness_tune(int num)
  329. {
  330. char *vg_base;
  331. //mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
  332. vg_base = MDP_BASE + MDP4_VIDEO_BASE;
  333. MIPI_OUTP(vg_base + 0x8200, mdp4_ss_table_value((int8_t) num, 0));
  334. MIPI_OUTP(vg_base + 0x8204, mdp4_ss_table_value((int8_t) num, 1));
  335. //mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
  336. }
  337. #endif
  338. int s3c_mdnie_start()
  339. {
  340. g_mdine_enable = 1;
  341. return 0;
  342. }
  343. int s3c_mdnie_off()
  344. {
  345. g_mdine_enable = 0;
  346. return 0;
  347. }
  348. #if 0
  349. void mDNIe_Set_Mode(enum Lcd_mDNIe_UI mode)
  350. {
  351. unsigned int *pLut;
  352. int sharpvalue = 0;
  353. static int isSetDMBMode;
  354. DPRINT("[mdnie set] mDNIe_Set_Mode\n");
  355. if (!g_mdine_enable) {
  356. printk(KERN_ERR
  357. "[mDNIE WARNING] mDNIE engine is OFF. So you cannot set mDnie Mode correctly.\n");
  358. return;
  359. }
  360. play_speed_1_5 = 0;
  361. #if defined(CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_HD_PT)
  362. video_mode = FALSE;
  363. camera_mode = FALSE;
  364. #endif
  365. #if defined(CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_WVGA_PT)
  366. camera_mode = FALSE;
  367. #endif
  368. switch (mode) {
  369. case mDNIe_UI_MODE:
  370. if (isSetDMBMode == 1) {
  371. mdp4_vg_qseed_init_VideoPlay(0);
  372. /*mdp4_vg_qseed_init_VideoPlay(1);*/
  373. isSetDMBMode = 0;
  374. }
  375. pLut = UI_LUT;
  376. sharpvalue = SHARPNESS_BYPASS;
  377. break;
  378. case mDNIe_VIDEO_MODE:
  379. /*case mDNIe_VIDEO_WARM_MODE:*/
  380. /*case mDNIe_VIDEO_COLD_MODE:*/
  381. if (isSetDMBMode == 1) {
  382. mdp4_vg_qseed_init_VideoPlay(0);
  383. /*mdp4_vg_qseed_init_VideoPlay(1);*/
  384. isSetDMBMode = 0;
  385. }
  386. pLut = VIDEO_LUT;
  387. sharpvalue = SHARPNESS_VIDEO;
  388. #if defined(CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_HD_PT)
  389. video_mode = TRUE;
  390. #endif
  391. break;
  392. case mDNIe_CAMERA_MODE:
  393. pLut = BYPASS_LUT;
  394. sharpvalue = SHARPNESS_BYPASS;
  395. #if defined(CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_HD_PT) || \
  396. defined(CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_WVGA_PT)
  397. camera_mode = TRUE;
  398. #endif
  399. break;
  400. case mDNIe_NAVI:
  401. pLut = BYPASS_LUT;
  402. sharpvalue = SHARPNESS_BYPASS;
  403. break;
  404. case mDNIe_GALLERY:
  405. pLut = GALLERY_LUT;
  406. sharpvalue = SHARPNESS_BYPASS;
  407. break;
  408. case mDNIe_BYPASS:
  409. pLut = BYPASS_LUT;
  410. sharpvalue = SHARPNESS_BYPASS;
  411. break;
  412. case mDNIe_DMB_MODE: /*warm, clod not distinguish*/
  413. if (isSetDMBMode == 0) {
  414. mdp4_vg_qseed_init_DMB(0);
  415. /*mdp4_vg_qseed_init_DMB(1);*/
  416. isSetDMBMode = 1;
  417. }
  418. pLut = DMB_LUT;
  419. sharpvalue = SHARPNESS_DMB;
  420. break;
  421. #ifdef BROWSER_COLOR_TONE_SET
  422. case mDNIe_BROWSER_TONE1:
  423. pLut = BROWSER_TONE1_LUT;
  424. sharpvalue = SHARPNESS_BYPASS;
  425. break;
  426. case mDNIe_BROWSER_TONE2:
  427. pLut = BROWSER_TONE2_LUT;
  428. sharpvalue = SHARPNESS_BYPASS;
  429. break;
  430. case mDNIe_BROWSER_TONE3:
  431. pLut = BROWSER_TONE3_LUT;
  432. sharpvalue = SHARPNESS_BYPASS;
  433. break;
  434. #endif
  435. default:
  436. pLut = BYPASS_LUT;
  437. sharpvalue = SHARPNESS_BYPASS;
  438. break;
  439. }
  440. lut_tune(MAX_LUT_SIZE, pLut);
  441. sharpness_tune(sharpvalue);
  442. current_mDNIe_Mode = mode;
  443. #ifdef CONFIG_FB_S3C_MDNIE_TUNINGMODE_FOR_BACKLIGHT
  444. pre_val = -1;
  445. #endif /* CONFIG_FB_S3C_MDNIE_TUNINGMODE_FOR_BACKLIGHT */
  446. DPRINT("[mDNIe] mDNIe_Set_Mode : Current_mDNIe_mode (%d)\n",
  447. current_mDNIe_Mode);
  448. DPRINT("[mDNIe] Sharpness value : (%d)\n", sharpvalue);
  449. }
  450. #endif
  451. void mDNIe_set_negative(enum Lcd_mDNIe_Negative negative)
  452. {
  453. /*unsigned int *pLut;
  454. int sharpvalue = 0;
  455. if (negative == 0) {
  456. DPRINT("[mdnie set] mDNIe_Set_mDNIe_Mode = %d\n",
  457. current_mDNIe_Mode);
  458. //mDNIe_Set_Mode(current_mDNIe_Mode);
  459. return;
  460. } else {
  461. DPRINT("[mdnie set] mDNIe_Set_Negative = %d\n", negative);
  462. pLut = NEGATIVE_LUT;
  463. sharpvalue = SHARPNESS_NEGATIVE;
  464. lut_tune(MAX_LUT_SIZE, pLut);
  465. sharpness_tune(sharpvalue);mdss_negative_color
  466. }*/
  467. mdss_negative_color(negative);
  468. DPRINT("[mdnie set] mDNIe_Set_Negative END\n");
  469. }
  470. //////////////////////////////////////////////////////////////////////
  471. int is_negative_on(void)
  472. {
  473. pr_info("is negative Mode On = %d\n", current_Negative_Mode);
  474. //if (current_Negative_Mode)
  475. mDNIe_set_negative(current_Negative_Mode);//#error
  476. //else
  477. //return 0;
  478. return 1;
  479. }
  480. ///////////////////////////////////////////////////////////////////////
  481. void is_play_speed_1_5(int enable)
  482. {
  483. play_speed_1_5 = enable;
  484. }
  485. #if 0
  486. static ssize_t scenario_show(struct device *dev,
  487. struct device_attribute *attr,
  488. char *buf)
  489. {
  490. int mdnie_ui = 0;
  491. DPRINT("called %s\n", __func__);
  492. switch (current_mDNIe_Mode) {
  493. case mDNIe_UI_MODE:
  494. default:
  495. mdnie_ui = 0;
  496. break;
  497. case mDNIe_VIDEO_MODE:
  498. mdnie_ui = 1;
  499. break;
  500. case mDNIe_CAMERA_MODE:
  501. mdnie_ui = 2;
  502. break;
  503. case mDNIe_NAVI:
  504. mdnie_ui = 3;
  505. break;
  506. case mDNIe_GALLERY:
  507. mdnie_ui = 4;
  508. break;
  509. case mDNIe_BYPASS:
  510. mdnie_ui = 5;
  511. break;
  512. #if defined(CONFIG_TDMB) || defined(CONFIG_TDMB_MODULE)
  513. case mDNIe_DMB_MODE:
  514. mdnie_ui = mDNIe_DMB_MODE;
  515. break;
  516. #endif
  517. #ifdef BROWSER_COLOR_TONE_SET
  518. case mDNIe_BROWSER_TONE1:
  519. mdnie_ui = mDNIe_BROWSER_TONE1;
  520. break;
  521. case mDNIe_BROWSER_TONE2:
  522. mdnie_ui = mDNIe_BROWSER_TONE2;
  523. break;
  524. case mDNIe_BROWSER_TONE3:
  525. mdnie_ui = mDNIe_BROWSER_TONE3;
  526. break;
  527. #endif
  528. }
  529. return sprintf(buf, "%u\n", mdnie_ui);
  530. }
  531. static ssize_t scenario_store(struct device *dev,
  532. struct device_attribute *attr,
  533. const char *buf, size_t size)
  534. {
  535. int value;
  536. sscanf(buf, "%d", &value);
  537. switch (value) {
  538. case SIG_MDNIE_UI_MODE:
  539. current_mDNIe_Mode = mDNIe_UI_MODE;
  540. break;
  541. case SIG_MDNIE_VIDEO_MODE:
  542. current_mDNIe_Mode = mDNIe_VIDEO_MODE;
  543. break;
  544. case SIG_MDNIE_CAMERA_MODE:
  545. current_mDNIe_Mode = mDNIe_CAMERA_MODE;
  546. break;
  547. case SIG_MDNIE_NAVI:
  548. current_mDNIe_Mode = mDNIe_NAVI;
  549. break;
  550. case SIG_MDNIE_GALLERY:
  551. current_mDNIe_Mode = mDNIe_GALLERY;
  552. break;
  553. case SIG_MDNIE_BYPASS:
  554. current_mDNIe_Mode = mDNIe_BYPASS;
  555. break;
  556. case SIG_MDNIE_DMB_MODE:
  557. current_mDNIe_Mode = mDNIe_DMB_MODE;
  558. break;
  559. #ifdef BROWSER_COLOR_TONE_SET
  560. case SIG_MDNIE_BROWSER_TONE1:
  561. current_mDNIe_Mode = mDNIe_BROWSER_TONE1;
  562. break;
  563. case SIG_MDNIE_BROWSER_TONE2:
  564. current_mDNIe_Mode = mDNIe_BROWSER_TONE2;
  565. break;
  566. case SIG_MDNIE_BROWSER_TONE3:
  567. current_mDNIe_Mode = mDNIe_BROWSER_TONE3;
  568. break;
  569. #endif
  570. default:
  571. printk(KERN_ERR
  572. "scenario_store value is wrong : value(%d)\n",
  573. value);
  574. break;
  575. }
  576. if (current_Negative_Mode) {
  577. DPRINT("[mdnie set] already negative mode = %d\n",
  578. current_Negative_Mode);
  579. } else {
  580. DPRINT("[mdnie set] in scenario_store, input value = %d\n",
  581. value);
  582. mDNIe_Set_Mode(current_mDNIe_Mode);
  583. }
  584. return size;
  585. }
  586. static DEVICE_ATTR(scenario, 0664, scenario_show,
  587. scenario_store);
  588. static ssize_t mdnieset_user_select_file_cmd_show(struct device *dev,
  589. struct device_attribute *attr,
  590. char *buf)
  591. {
  592. int mdnie_ui = 0;
  593. DPRINT("called %s\n", __func__);
  594. return sprintf(buf, "%u\n", mdnie_ui);
  595. }
  596. static ssize_t mdnieset_user_select_file_cmd_store(struct device *dev,
  597. struct device_attribute
  598. *attr, const char *buf,
  599. size_t size)
  600. {
  601. int value;
  602. sscanf(buf, "%d", &value);
  603. DPRINT
  604. ("[mdnie set]inmdnieset_user_select_file_cmd_store, input value = %d\n",
  605. value);
  606. return size;
  607. }
  608. static DEVICE_ATTR(mdnieset_user_select_file_cmd, 0664,
  609. mdnieset_user_select_file_cmd_show,
  610. mdnieset_user_select_file_cmd_store);
  611. #endif
  612. #if 0
  613. static ssize_t mdnieset_init_file_cmd_show(struct device *dev,
  614. struct device_attribute *attr,
  615. char *buf)
  616. {
  617. char temp[]="mdnieset_init_file_cmd_show\n\0";
  618. DPRINT("called %s\n", __func__);
  619. strcat(buf, temp);
  620. return strlen(buf);
  621. }
  622. static ssize_t mdnieset_init_file_cmd_store(struct device *dev,
  623. struct device_attribute *attr,
  624. const char *buf, size_t size)
  625. {
  626. int value;
  627. sscanf(buf, "%d", &value);
  628. DPRINT("mdnieset_init_file_cmd_store : value(%d)\n", value);
  629. switch (value) {
  630. case 0:
  631. current_mDNIe_Mode = mDNIe_UI_MODE;
  632. break;
  633. default:
  634. printk(KERN_ERR
  635. "mdnieset_init_file_cmd_store value is wrong : value(%d)\n",
  636. value);
  637. break;
  638. }
  639. mDNIe_Set_Mode(current_mDNIe_Mode);
  640. return size;
  641. }
  642. static DEVICE_ATTR(mdnieset_init_file_cmd, 0664, mdnieset_init_file_cmd_show,
  643. mdnieset_init_file_cmd_store);
  644. static ssize_t outdoor_show(struct device *dev,
  645. struct device_attribute *attr,
  646. char *buf)
  647. {
  648. DPRINT("called %s\n", __func__);
  649. return sprintf(buf, "0\n");
  650. }
  651. static ssize_t outdoor_store(struct device *dev,
  652. struct device_attribute *attr,
  653. const char *buf, size_t size)
  654. {
  655. int value;
  656. sscanf(buf, "%d", &value);
  657. DPRINT
  658. ("[mdnie set]inmdnieset_outdoor_file_cmd_store, input value = %d\n",
  659. value);
  660. return size;
  661. }
  662. static DEVICE_ATTR(outdoor, 0664,
  663. outdoor_show,
  664. outdoor_store);
  665. #endif
  666. //////////////////aaaaa//////////////////////
  667. static ssize_t negative_show(struct device *dev,
  668. struct device_attribute *attr,
  669. char *buf)
  670. {
  671. DPRINT("called %s\n", __func__);
  672. return sprintf(buf, "0\n");
  673. }
  674. int negative_mode;
  675. static ssize_t negative_store(struct device *dev,
  676. struct device_attribute *attr,
  677. const char *buf, size_t size)
  678. {
  679. sscanf(buf, "%d", &negative_mode);
  680. DPRINT
  681. ("[mdnie set]negative_store, input value = %d\n",
  682. negative_mode);
  683. pr_info("[negative] value = %d\n", negative_mode);
  684. if (negative_mode == 0)
  685. current_Negative_Mode = mDNIe_NEGATIVE_OFF;
  686. else
  687. current_Negative_Mode = mDNIe_NEGATIVE_ON;
  688. mDNIe_set_negative(current_Negative_Mode);
  689. return size;
  690. }
  691. static DEVICE_ATTR(negative, 0664,
  692. negative_show,
  693. negative_store);
  694. //////////////////////bbbbbb////////////////////////////
  695. #if 0
  696. static ssize_t playspeed_show(struct device *dev,
  697. struct device_attribute *attr,
  698. char *buf)
  699. {
  700. DPRINT("called %s\n", __func__);
  701. return sprintf(buf, "%d\n", play_speed_1_5);
  702. }
  703. static ssize_t playspeed_store(struct device *dev,
  704. struct device_attribute *attr,
  705. const char *buf, size_t size)
  706. {
  707. int value;
  708. sscanf(buf, "%d", &value);
  709. DPRINT("[Play Speed Set]play speed value = %d\n", value);
  710. is_play_speed_1_5(value);
  711. return size;
  712. }
  713. static DEVICE_ATTR(playspeed, 0664,
  714. playspeed_show,
  715. playspeed_store);
  716. #endif
  717. static ssize_t accessibility_show(struct device *dev,
  718. struct device_attribute *attr,
  719. char *buf)
  720. {
  721. DPRINT("called %s\n", __func__);
  722. return snprintf(buf, 256, "%d\n", play_speed_1_5);
  723. }
  724. static ssize_t accessibility_store(struct device *dev,
  725. struct device_attribute *attr,
  726. const char *buf, size_t size)
  727. {
  728. #if defined (CONFIG_FB_MSM_MDSS_HIMAX_QHD_PANEL)
  729. int cmd_value;
  730. char buffer[MDNIE_COLOR_BLINDE_CMD_LENGTH] = {0,};
  731. int buffer2[MDNIE_COLOR_BLINDE_CMD_LENGTH/2] = {0,};
  732. int loop;
  733. sscanf(buf, "%d %x %x %x %x %x %x %x %x %x", &cmd_value,
  734. &buffer2[8], &buffer2[7], &buffer2[6], &buffer2[5], &buffer2[4],
  735. &buffer2[3], &buffer2[2], &buffer2[1], &buffer2[0]);
  736. for(loop = 0; loop < MDNIE_COLOR_BLINDE_CMD_LENGTH/2; loop++) {
  737. buffer2[loop] = buffer2[loop] & 0xFFFF;
  738. buffer[loop * 2] = (buffer2[loop] & 0xFF00) >> 8;
  739. buffer[loop * 2 + 1] = buffer2[loop] & 0xFF;
  740. }
  741. #else
  742. int cmd_value;
  743. char buffer[MDNIE_COLOR_BLINDE_CMD] = {0,};
  744. int buffer2[MDNIE_COLOR_BLINDE_CMD/2] = {0,};
  745. int loop;
  746. char temp;
  747. sscanf(buf, "%d %x %x %x %x %x %x %x %x %x", &cmd_value,
  748. &buffer2[0], &buffer2[1], &buffer2[2], &buffer2[3], &buffer2[4],
  749. &buffer2[5], &buffer2[6], &buffer2[7], &buffer2[8]);
  750. for(loop = 0; loop < MDNIE_COLOR_BLINDE_CMD/2; loop++) {
  751. buffer2[loop] = buffer2[loop] & 0xFFFF;
  752. buffer[loop * 2] = (buffer2[loop] & 0xFF00) >> 8;
  753. buffer[loop * 2 + 1] = buffer2[loop] & 0xFF;
  754. }
  755. for(loop = 0; loop < MDNIE_COLOR_BLINDE_CMD; loop+=2) {
  756. temp = buffer[loop];
  757. buffer[loop] = buffer[loop + 1];
  758. buffer[loop + 1] = temp;
  759. }
  760. #endif
  761. if (cmd_value == NEGATIVE) {
  762. current_Negative_Mode = mDNIe_NEGATIVE_ON;
  763. //mdnie_tun_state.blind = ACCESSIBILITY_OFF;
  764. } else if (cmd_value == COLOR_BLIND) {
  765. current_Negative_Mode = mDNIe_NEGATIVE_OFF;
  766. //mdnie_tun_state.blind = COLOR_BLIND;
  767. // #if defined (CONFIG_FB_MSM_MDSS_SHARP_HD_PANEL)
  768. // memcpy(&COLOR_BLIND_2[MDNIE_COLOR_BLINDE_CMD],
  769. // buffer, MDNIE_COLOR_BLINDE_CMD);
  770. // #elif defined (CONFIG_FB_MSM_MDSS_HIMAX_QHD_PANEL)
  771. // memcpy(&COLOR_BLIND_MDNIE[MDNIE_COLOR_BLINDE_CMD_INDEX],
  772. // buffer, MDNIE_COLOR_BLINDE_CMD_LENGTH);
  773. // #endif
  774. } else if (cmd_value == ACCESSIBILITY_OFF) {
  775. //mdnie_tun_state.blind = ACCESSIBILITY_OFF;
  776. current_Negative_Mode = mDNIe_NEGATIVE_OFF;
  777. } else
  778. pr_info("%s ACCESSIBILITY_MAX", __func__);
  779. is_negative_on();
  780. pr_info("%s cmd_value : %d", __func__, cmd_value);
  781. return size;
  782. }
  783. static DEVICE_ATTR(accessibility, 0664,
  784. accessibility_show,
  785. accessibility_store);
  786. void init_mdnie_class(void)
  787. {
  788. mdnie_class = class_create(THIS_MODULE, "mdnie");
  789. if (IS_ERR(mdnie_class))
  790. pr_err("Failed to create class(mdnie)!\n");
  791. tune_mdnie_dev =
  792. device_create(mdnie_class, NULL, 0, NULL,
  793. "mdnie");
  794. if (IS_ERR(tune_mdnie_dev))
  795. pr_err("Failed to create device(mdnie)!\n");
  796. #if 0
  797. if (device_create_file
  798. (tune_mdnie_dev, &dev_attr_scenario) < 0)
  799. pr_err("Failed to create device file(%s)!\n",
  800. dev_attr_scenario.attr.name);
  801. if (device_create_file
  802. (tune_mdnie_dev,
  803. &dev_attr_mdnieset_user_select_file_cmd) < 0)
  804. pr_err("Failed to create device file(%s)!\n",
  805. dev_attr_mdnieset_user_select_file_cmd.attr.name);
  806. if (device_create_file
  807. (tune_mdnie_dev, &dev_attr_mdnieset_init_file_cmd) < 0)
  808. pr_err("Failed to create device file(%s)!\n",
  809. dev_attr_mdnieset_init_file_cmd.attr.name);
  810. /* mdnieset_outdoor_class = class_create(THIS_MODULE, "mdnieset_outdoor");
  811. if (IS_ERR(mdnieset_outdoor_class))
  812. pr_err("Failed to create class(
  813. mdnieset_outdoor_class)!\n");
  814. switch_mdnieset_outdoor_dev =
  815. device_create(mdnieset_outdoor_class, NULL, 0, NULL,
  816. "outdoor");
  817. if (IS_ERR(switch_mdnieset_outdoor_dev))
  818. pr_err
  819. ("Failed to create device(
  820. switch_mdnieset_outdoor_dev)!\n"); */
  821. if (device_create_file
  822. (tune_mdnie_dev, &dev_attr_outdoor) < 0)
  823. pr_err("Failed to create device file(%s)!\n",
  824. dev_attr_outdoor.attr.name);
  825. #endif
  826. if (device_create_file
  827. (tune_mdnie_dev, &dev_attr_negative) < 0)
  828. pr_err("Failed to create device file(%s)!\n",
  829. dev_attr_negative.attr.name);
  830. if (device_create_file
  831. (tune_mdnie_dev, &dev_attr_accessibility) < 0)
  832. pr_err("Failed to create device file(%s)!\n",
  833. dev_attr_accessibility.attr.name);
  834. #if 0
  835. if (device_create_file
  836. (tune_mdnie_dev, &dev_attr_playspeed) < 0)
  837. pr_err("Failed to create device file(%s)!=n",
  838. dev_attr_playspeed.attr.name);
  839. #ifdef MDP4_VIDEO_ENHANCE_TUNING
  840. if (device_create_file(tune_mdnie_dev, &dev_attr_tuning) < 0) {
  841. pr_err("Failed to create device file(%s)!\n",
  842. dev_attr_tuning.attr.name);
  843. }
  844. #endif
  845. #endif
  846. s3c_mdnie_start();
  847. //sharpness_tune(0);
  848. }