AW2015_LED_M.c 66 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769
  1. /*************************************************************************************************
  2. * AW2015_LED.c
  3. *
  4. * Create Date :
  5. *
  6. * Modify Date :
  7. *
  8. * Create by : AWINIC Technology CO., LTD
  9. *
  10. * Version : 0.9, 2016/02/15
  11. *************************************************************************************************/
  12. #include <linux/i2c.h>
  13. #include <linux/gpio.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/delay.h>
  16. #include <linux/irq.h>
  17. #include <linux/firmware.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/slab.h>
  20. #include <linux/fs.h>
  21. #include <linux/proc_fs.h>
  22. #include <asm/uaccess.h>
  23. #include <asm/io.h>
  24. #include <linux/init.h>
  25. #include <linux/pci.h>
  26. #include <linux/dma-mapping.h>
  27. #include <linux/gameport.h>
  28. #include <linux/moduleparam.h>
  29. #include <linux/mutex.h>
  30. #include <linux/wakelock.h>
  31. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  32. #define AW2015_I2C_NAME "pressure"
  33. #define AW2015_I2C_BUS 0
  34. #define AW2015_I2C_ADDR 0x64
  35. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. static ssize_t AW2015_get_reg(struct device* cd,struct device_attribute *attr, char* buf);
  37. static ssize_t AW2015_set_reg(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  38. static ssize_t AW2015_set_debug(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  39. static ssize_t AW2015_get_debug(struct device* cd, struct device_attribute *attr, char* buf);
  40. static ssize_t AW2015_Set_Red(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  41. static ssize_t AW2015_Set_Green(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  42. static ssize_t AW2015_Set_Blue(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  43. static ssize_t AW2015_Set_Red_delay_off(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  44. static ssize_t AW2015_Set_Red_delay_on(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  45. static ssize_t AW2015_Set_Green_delay_off(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  46. static ssize_t AW2015_Set_Green_delay_on(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  47. static ssize_t AW2015_Set_Blue_delay_off(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  48. static ssize_t AW2015_Set_Blue_delay_on(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  49. static ssize_t AW2015_Set_White(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  50. static ssize_t AW2015_Set_White_delay_off(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  51. static ssize_t AW2015_Set_White_delay_on(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  52. static ssize_t AW2015_Set_Gray(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  53. static ssize_t AW2015_Set_Gray_delay_off(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  54. static ssize_t AW2015_Set_Gray_delay_on(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  55. static ssize_t AW2015_Set_Yellow(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  56. static ssize_t AW2015_Set_Yellow_delay_off(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  57. static ssize_t AW2015_Set_Yellow_delay_on(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  58. static ssize_t AW2015_Set_Pink(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  59. static ssize_t AW2015_Set_Pink_delay_off(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  60. static ssize_t AW2015_Set_Pink_delay_on(struct device* cd, struct device_attribute *attr,const char* buf, size_t len);
  61. static DEVICE_ATTR(reg, 0660, AW2015_get_reg, AW2015_set_reg);
  62. static DEVICE_ATTR(debug, 0660, AW2015_get_debug, AW2015_set_debug);
  63. static DEVICE_ATTR(Red, 0660, NULL, AW2015_Set_Red);
  64. static DEVICE_ATTR(Green, 0660, NULL, AW2015_Set_Green);
  65. static DEVICE_ATTR(Blue, 0660, NULL, AW2015_Set_Blue);
  66. static DEVICE_ATTR(White, 0660, NULL, AW2015_Set_White);
  67. static DEVICE_ATTR(Gray, 0660, NULL, AW2015_Set_Gray);
  68. static DEVICE_ATTR(Yellow, 0660, NULL, AW2015_Set_Yellow);
  69. static DEVICE_ATTR(Pink, 0660, NULL, AW2015_Set_Pink);
  70. static int RED_DELAY_OFF = 0,RED_DELAY_ON = 0;
  71. static DEVICE_ATTR(Red_delay_off, 0660, NULL, AW2015_Set_Red_delay_off);
  72. static DEVICE_ATTR(Red_delay_on, 0660, NULL, AW2015_Set_Red_delay_on);
  73. static int GREEN_DELAY_OFF = 0,GREEN_DELAY_ON = 0;
  74. static DEVICE_ATTR(Green_delay_off, 0660, NULL, AW2015_Set_Green_delay_off);
  75. static DEVICE_ATTR(Green_delay_on, 0660, NULL, AW2015_Set_Green_delay_on);
  76. static int BLUE_DELAY_OFF = 0,BLUE_DELAY_ON = 0;
  77. static DEVICE_ATTR(Blue_delay_off, 0660, NULL, AW2015_Set_Blue_delay_off);
  78. static DEVICE_ATTR(Blue_delay_on, 0660, NULL, AW2015_Set_Blue_delay_on);
  79. static int WHITE_DELAY_OFF = 0,WHITE_DELAY_ON = 0;
  80. static DEVICE_ATTR(White_delay_off, 0660, NULL, AW2015_Set_White_delay_off);
  81. static DEVICE_ATTR(White_delay_on, 0660, NULL, AW2015_Set_White_delay_on);
  82. static int GRAY_DELAY_OFF = 0,GRAY_DELAY_ON = 0;
  83. static DEVICE_ATTR(Gray_delay_off, 0660, NULL, AW2015_Set_Gray_delay_off);
  84. static DEVICE_ATTR(Gray_delay_on, 0660, NULL, AW2015_Set_Gray_delay_on);
  85. static int YELLOW_DELAY_OFF = 0,YELLOW_DELAY_ON = 0;
  86. static DEVICE_ATTR(Yellow_delay_off, 0660, NULL, AW2015_Set_Yellow_delay_off);
  87. static DEVICE_ATTR(Yellow_delay_on, 0660, NULL, AW2015_Set_Yellow_delay_on);
  88. static int PINK_DELAY_OFF = 0,PINK_DELAY_ON = 0;
  89. static DEVICE_ATTR(Pink_delay_off, 0660, NULL, AW2015_Set_Pink_delay_off);
  90. static DEVICE_ATTR(Pink_delay_on, 0660, NULL, AW2015_Set_Pink_delay_on);
  91. struct i2c_client *AW2015_i2c_client;
  92. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. // i2c write and read
  94. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  95. unsigned char I2C_write_reg(unsigned char addr, unsigned char reg_data)
  96. {
  97. char ret;
  98. u8 wdbuf[512] = {0};
  99. struct i2c_msg msg[] = {
  100. {
  101. .addr = AW2015_i2c_client->addr,
  102. .flags = 0,
  103. .len = 2,
  104. .buf = wdbuf,
  105. },
  106. };
  107. wdbuf[0] = addr;
  108. wdbuf[1] = reg_data;
  109. ret = i2c_transfer(AW2015_i2c_client->adapter, msg, 1);
  110. if (ret < 0)
  111. pr_err("msg %s i2c read error: %d\n", __func__, ret);
  112. return ret;
  113. }
  114. unsigned char I2C_read_reg(unsigned char addr)
  115. {
  116. int ret = 0;
  117. u8 rdbuf[512] = {0};
  118. struct i2c_msg msg[2] = {
  119. {
  120. .addr = AW2015_i2c_client->addr,
  121. .flags = 0,
  122. .len = 1,
  123. .buf = rdbuf,
  124. },
  125. {
  126. .addr = AW2015_i2c_client->addr,
  127. .flags = I2C_M_RD,
  128. .len = 1,
  129. .buf = rdbuf,
  130. },
  131. };
  132. rdbuf[0] = addr;
  133. ret = i2c_transfer(AW2015_i2c_client->adapter, msg, 2);
  134. if (ret < 0)
  135. pr_err("msg %s i2c read error: %d\n", __func__, ret);
  136. return rdbuf[0];
  137. }
  138. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  139. // AW2015 LED
  140. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  141. unsigned int ms2timer(unsigned int time)
  142. {
  143. int i;
  144. unsigned int ref[16] = {4, 128, 256, 384, 512, 762, 1024, 1524, 2048, 2560, 3072, 4096, 5120, 6144, 7168, 8192};
  145. for(i=0; i<15; i++)
  146. {
  147. if(time <= ref[0])
  148. {
  149. return 0;
  150. }
  151. else if(time > ref[15])
  152. {
  153. return 15;
  154. }
  155. else if((time>ref[i]) && (time<=ref[i+1]))
  156. {
  157. if((time-ref[i]) <= (ref[i+1]-time))
  158. {
  159. return i;
  160. }
  161. else
  162. {
  163. return (i+1);
  164. }
  165. }
  166. }
  167. return 0;
  168. }
  169. unsigned char AW2015_LED_ON(unsigned char r, unsigned char g, unsigned char b)
  170. {
  171. I2C_write_reg(0x00, 0x55); // software reset
  172. I2C_write_reg(0x01, 0x03); // GCR
  173. I2C_write_reg(0x03, 0x01); // IMAX
  174. I2C_write_reg(0x04, 0x00); // LCFG1
  175. I2C_write_reg(0x05, 0x00); // LCFG2
  176. I2C_write_reg(0x06, 0x00); // LCFG3
  177. I2C_write_reg(0x07, 0x07); // LEDEN
  178. I2C_write_reg(0x10, r ); // ILED1
  179. I2C_write_reg(0x11, g ); // ILED2
  180. I2C_write_reg(0x12, b ); // ILED3
  181. I2C_write_reg(0x1C, 0xFF); // PWM1
  182. I2C_write_reg(0x1D, 0xFF); // PWM2
  183. I2C_write_reg(0x1E, 0xFF); // PWM3
  184. return 0;
  185. }
  186. unsigned char AW2015_LED_OFF(void)
  187. {
  188. I2C_write_reg(0x00, 0x55); // software reset
  189. return 0;
  190. }
  191. unsigned char AW2015_LED_Blink(unsigned char r, unsigned char g, unsigned char b, unsigned int trise_ms, unsigned int ton_ms, unsigned int tfall_ms, unsigned int toff_ms)
  192. {
  193. unsigned char trise, ton, tfall, toff;
  194. trise = ms2timer(trise_ms);
  195. ton = ms2timer(ton_ms);
  196. tfall = ms2timer(tfall_ms);
  197. toff = ms2timer(toff_ms);
  198. I2C_write_reg(0x00, 0x55); // software reset
  199. I2C_write_reg(0x01, 0x03); // GCR
  200. I2C_write_reg(0x03, 0x01); // IMAX
  201. I2C_write_reg(0x04, 0x01); // LCFG1
  202. I2C_write_reg(0x05, 0x01); // LCFG2
  203. I2C_write_reg(0x06, 0x01); // LCFG3
  204. I2C_write_reg(0x07, 0x07); // LEDEN
  205. I2C_write_reg(0x08, 0x08); // LEDCTR
  206. I2C_write_reg(0x10, r ); // ILED1
  207. I2C_write_reg(0x11, g ); // ILED2
  208. I2C_write_reg(0x12, b ); // ILED3
  209. I2C_write_reg(0x1C, 0xFF); // PWM1
  210. I2C_write_reg(0x1D, 0xFF); // PWM2
  211. I2C_write_reg(0x1E, 0xFF); // PWM3
  212. I2C_write_reg(0x30, (trise<<4)|ton); // PAT_T1 Trise & Ton
  213. I2C_write_reg(0x31, (tfall<<4)|toff); // PAT_T2 Tfall & Toff
  214. I2C_write_reg(0x32, 0x00); // PAT_T3 Tdelay
  215. I2C_write_reg(0x33, 0x00); // PAT_T4 PAT_CTR & Color
  216. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  217. I2C_write_reg(0x09, 0x07); // PAT_RIN
  218. return 0;
  219. }
  220. static ssize_t AW2015_Set_Red_delay_off(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  221. {
  222. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  223. RED_DELAY_OFF = iNewPsSensorState;
  224. return len;
  225. }
  226. static ssize_t AW2015_Set_Red_delay_on(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  227. {
  228. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  229. RED_DELAY_ON = iNewPsSensorState;
  230. return len;
  231. }
  232. static ssize_t AW2015_Set_Green_delay_off(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  233. {
  234. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  235. GREEN_DELAY_OFF = iNewPsSensorState;
  236. return len;
  237. }
  238. static ssize_t AW2015_Set_Green_delay_on(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  239. {
  240. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  241. GREEN_DELAY_ON = iNewPsSensorState;
  242. return len;
  243. }
  244. static ssize_t AW2015_Set_Blue_delay_off(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  245. {
  246. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  247. BLUE_DELAY_OFF = iNewPsSensorState;
  248. return len;
  249. }
  250. static ssize_t AW2015_Set_Blue_delay_on(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  251. {
  252. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  253. BLUE_DELAY_ON = iNewPsSensorState;
  254. return len;
  255. }
  256. static ssize_t AW2015_Set_White_delay_off(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  257. {
  258. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  259. WHITE_DELAY_OFF = iNewPsSensorState;
  260. return len;
  261. }
  262. static ssize_t AW2015_Set_White_delay_on(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  263. {
  264. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  265. WHITE_DELAY_ON = iNewPsSensorState;
  266. return len;
  267. }
  268. static ssize_t AW2015_Set_Gray_delay_off(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  269. {
  270. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  271. GRAY_DELAY_OFF = iNewPsSensorState;
  272. return len;
  273. }
  274. static ssize_t AW2015_Set_Gray_delay_on(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  275. {
  276. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  277. GRAY_DELAY_ON = iNewPsSensorState;
  278. return len;
  279. }
  280. static ssize_t AW2015_Set_Yellow_delay_off(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  281. {
  282. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  283. YELLOW_DELAY_OFF = iNewPsSensorState;
  284. return len;
  285. }
  286. static ssize_t AW2015_Set_Yellow_delay_on(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  287. {
  288. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  289. YELLOW_DELAY_ON = iNewPsSensorState;
  290. return len;
  291. }
  292. static ssize_t AW2015_Set_Pink_delay_off(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  293. {
  294. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  295. PINK_DELAY_OFF = iNewPsSensorState;
  296. return len;
  297. }
  298. static ssize_t AW2015_Set_Pink_delay_on(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  299. {
  300. unsigned long iNewPsSensorState = simple_strtoul(buf, NULL, 10);
  301. PINK_DELAY_ON = iNewPsSensorState;
  302. return len;
  303. }
  304. static ssize_t AW2015_Set_White(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  305. {
  306. unsigned int databuf[16];
  307. sscanf(buf,"%d",&databuf[0]);
  308. I2C_write_reg(0x00, 0x55); // software reset
  309. I2C_write_reg(0x01, 0x03); // GCR
  310. I2C_write_reg(0x03, 0x01); // IMAX
  311. I2C_write_reg(0x04, 0x00); // LCFG1
  312. I2C_write_reg(0x05, 0x00); // LCFG2
  313. I2C_write_reg(0x06, 0x00); // LCFG3
  314. I2C_write_reg(0x07, 0x07); // LEDEN
  315. if(databuf[0]!=0)
  316. {
  317. if(WHITE_DELAY_OFF == 500)
  318. {
  319. if(WHITE_DELAY_ON == 500)
  320. {
  321. I2C_write_reg(0x00, 0x55); // software reset
  322. I2C_write_reg(0x01, 0x03); // GCR
  323. I2C_write_reg(0x03, 0x01); // IMAX
  324. I2C_write_reg(0x04, 0x01); // LCFG1
  325. I2C_write_reg(0x05, 0x01); // LCFG2
  326. I2C_write_reg(0x06, 0x01); // LCFG3
  327. I2C_write_reg(0x07, 0x07); // LEDEN
  328. I2C_write_reg(0x08, 0x08); // LEDCTR
  329. I2C_write_reg(0x10, 0xFF); // Color1_R
  330. I2C_write_reg(0x11, 0xFF); // Color1_G
  331. I2C_write_reg(0x12, 0xFF); // Color1_B
  332. I2C_write_reg(0x1C, 0xFF); // PWM1
  333. I2C_write_reg(0x1D, 0xFF); // PWM2
  334. I2C_write_reg(0x1E, 0xFF); // PWM3
  335. I2C_write_reg(0x09, 0x07); // PAT_RIN
  336. I2C_write_reg(0x30, 0x00); // PAT_T1 Trise & Ton
  337. I2C_write_reg(0x31, 0x00); // PAT_T2 Tfall & Toff
  338. I2C_write_reg(0x32, 0x00); // PAT_T3 Tslot & Tdelay
  339. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  340. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  341. I2C_write_reg(0x09, 0x07); // PAT_RIN
  342. }
  343. else if(WHITE_DELAY_ON == 1000)
  344. {
  345. I2C_write_reg(0x00, 0x55); // software reset
  346. I2C_write_reg(0x01, 0x03); // GCR
  347. I2C_write_reg(0x03, 0x01); // IMAX
  348. I2C_write_reg(0x04, 0x01); // LCFG1
  349. I2C_write_reg(0x05, 0x01); // LCFG2
  350. I2C_write_reg(0x06, 0x01); // LCFG3
  351. I2C_write_reg(0x07, 0x07); // LEDEN
  352. I2C_write_reg(0x08, 0x08); // LEDCTR
  353. I2C_write_reg(0x10, 0xFF); // Color1_R
  354. I2C_write_reg(0x11, 0xFF); // Color1_G
  355. I2C_write_reg(0x12, 0xFF); // Color1_B
  356. I2C_write_reg(0x1C, 0xFF); // PWM1
  357. I2C_write_reg(0x1D, 0xFF); // PWM2
  358. I2C_write_reg(0x1E, 0xFF); // PWM3
  359. I2C_write_reg(0x09, 0x07); // PAT_RIN
  360. I2C_write_reg(0x30, 0x13); // PAT_T1 Trise & Ton
  361. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  362. I2C_write_reg(0x32, 0x20); // PAT_T3 Tslot & Tdelay
  363. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  364. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  365. I2C_write_reg(0x09, 0x07); // PAT_RIN
  366. }
  367. else if(WHITE_DELAY_ON == 1499)
  368. {
  369. I2C_write_reg(0x00, 0x55); // software reset
  370. I2C_write_reg(0x01, 0x03); // GCR
  371. I2C_write_reg(0x03, 0x01); // IMAX
  372. I2C_write_reg(0x04, 0x01); // LCFG1
  373. I2C_write_reg(0x05, 0x01); // LCFG2
  374. I2C_write_reg(0x06, 0x01); // LCFG3
  375. I2C_write_reg(0x07, 0x07); // LEDEN
  376. I2C_write_reg(0x08, 0x08); // LEDCTR
  377. I2C_write_reg(0x10, 0xFF); // Color1_R
  378. I2C_write_reg(0x11, 0xFF); // Color1_G
  379. I2C_write_reg(0x12, 0xFF); // Color1_B
  380. I2C_write_reg(0x1C, 0xFF); // PWM1
  381. I2C_write_reg(0x1D, 0xFF); // PWM2
  382. I2C_write_reg(0x1E, 0xFF); // PWM3
  383. I2C_write_reg(0x09, 0x07); // PAT_RIN
  384. I2C_write_reg(0x30, 0x14); // PAT_T1 Trise & Ton
  385. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  386. I2C_write_reg(0x32, 0x31); // PAT_T3 Tslot & Tdelay
  387. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  388. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  389. I2C_write_reg(0x09, 0x07); // PAT_RIN
  390. }
  391. }else
  392. {
  393. I2C_write_reg(0x00, 0x55); // software reset
  394. I2C_write_reg(0x01, 0x03); // GCR
  395. I2C_write_reg(0x03, 0x01); // IMAX
  396. I2C_write_reg(0x04, 0x00); // LCFG1
  397. I2C_write_reg(0x05, 0x00); // LCFG2
  398. I2C_write_reg(0x06, 0x00); // LCFG3
  399. I2C_write_reg(0x07, 0x07); // LEDEN
  400. I2C_write_reg(0x10, 0xFF); // Color1_R
  401. I2C_write_reg(0x11, 0xFF); // Color1_G
  402. I2C_write_reg(0x12, 0xFF); // Color1_B
  403. I2C_write_reg(0x1C, 0xFF); // PWM1
  404. I2C_write_reg(0x1D, 0xFF); // PWM2
  405. I2C_write_reg(0x1E, 0xFF); // PWM3
  406. I2C_write_reg(0x09, 0x07); // PAT_RIN
  407. }
  408. }
  409. else
  410. {
  411. I2C_write_reg(0x10, 0x00); // Color1_R
  412. I2C_write_reg(0x11, 0x00); // Color1_G
  413. I2C_write_reg(0x12, 0x00); // Color1_B
  414. I2C_write_reg(0x1C, 0x00); // PWM1
  415. I2C_write_reg(0x1D, 0x00); // PWM2
  416. I2C_write_reg(0x1E, 0x00); // PWM3
  417. I2C_write_reg(0x09, 0x07); // PAT_RIN
  418. WHITE_DELAY_ON = 0;
  419. WHITE_DELAY_OFF = 0;
  420. }
  421. return len;
  422. }
  423. static ssize_t AW2015_Set_Gray(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  424. {
  425. unsigned int databuf[16];
  426. sscanf(buf,"%d",&databuf[0]);
  427. I2C_write_reg(0x00, 0x55); // software reset
  428. I2C_write_reg(0x01, 0x03); // GCR
  429. I2C_write_reg(0x03, 0x01); // IMAX
  430. I2C_write_reg(0x04, 0x00); // LCFG1
  431. I2C_write_reg(0x05, 0x00); // LCFG2
  432. I2C_write_reg(0x06, 0x00); // LCFG3
  433. I2C_write_reg(0x07, 0x07); // LEDEN
  434. if(databuf[0]!=0)
  435. {
  436. if(GRAY_DELAY_OFF == 500)
  437. {
  438. if(GRAY_DELAY_ON == 500)
  439. {
  440. I2C_write_reg(0x00, 0x55); // software reset
  441. I2C_write_reg(0x01, 0x03); // GCR
  442. I2C_write_reg(0x03, 0x01); // IMAX
  443. I2C_write_reg(0x04, 0x01); // LCFG1
  444. I2C_write_reg(0x05, 0x01); // LCFG2
  445. I2C_write_reg(0x06, 0x01); // LCFG3
  446. I2C_write_reg(0x07, 0x07); // LEDEN
  447. I2C_write_reg(0x08, 0x08); // LEDCTR
  448. I2C_write_reg(0x10, 0x00); // Color1_R
  449. I2C_write_reg(0x11, 0xFF); // Color1_G
  450. I2C_write_reg(0x12, 0x80); // Color1_B
  451. I2C_write_reg(0x1C, 0xFF); // PWM1
  452. I2C_write_reg(0x1D, 0xFF); // PWM2
  453. I2C_write_reg(0x1E, 0xFF); // PWM3
  454. I2C_write_reg(0x09, 0x07); // PAT_RIN
  455. I2C_write_reg(0x30, 0x00); // PAT_T1 Trise & Ton
  456. I2C_write_reg(0x31, 0x00); // PAT_T2 Tfall & Toff
  457. I2C_write_reg(0x32, 0x00); // PAT_T3 Tslot & Tdelay
  458. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  459. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  460. I2C_write_reg(0x09, 0x07); // PAT_RIN
  461. }
  462. else if(GRAY_DELAY_ON == 1000)
  463. {
  464. I2C_write_reg(0x00, 0x55); // software reset
  465. I2C_write_reg(0x01, 0x03); // GCR
  466. I2C_write_reg(0x03, 0x01); // IMAX
  467. I2C_write_reg(0x04, 0x01); // LCFG1
  468. I2C_write_reg(0x05, 0x01); // LCFG2
  469. I2C_write_reg(0x06, 0x01); // LCFG3
  470. I2C_write_reg(0x07, 0x07); // LEDEN
  471. I2C_write_reg(0x08, 0x08); // LEDCTR
  472. I2C_write_reg(0x10, 0x00); // Color1_R
  473. I2C_write_reg(0x11, 0xFF); // Color1_G
  474. I2C_write_reg(0x12, 0x80); // Color1_B
  475. I2C_write_reg(0x1C, 0xFF); // PWM1
  476. I2C_write_reg(0x1D, 0xFF); // PWM2
  477. I2C_write_reg(0x1E, 0xFF); // PWM3
  478. I2C_write_reg(0x09, 0x07); // PAT_RIN
  479. I2C_write_reg(0x30, 0x13); // PAT_T1 Trise & Ton
  480. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  481. I2C_write_reg(0x32, 0x20); // PAT_T3 Tslot & Tdelay
  482. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  483. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  484. I2C_write_reg(0x09, 0x07); // PAT_RIN
  485. }
  486. else if(GRAY_DELAY_ON == 1499)
  487. {
  488. I2C_write_reg(0x00, 0x55); // software reset
  489. I2C_write_reg(0x01, 0x03); // GCR
  490. I2C_write_reg(0x03, 0x01); // IMAX
  491. I2C_write_reg(0x04, 0x01); // LCFG1
  492. I2C_write_reg(0x05, 0x01); // LCFG2
  493. I2C_write_reg(0x06, 0x01); // LCFG3
  494. I2C_write_reg(0x07, 0x07); // LEDEN
  495. I2C_write_reg(0x08, 0x08); // LEDCTR
  496. I2C_write_reg(0x10, 0x00); // Color1_R
  497. I2C_write_reg(0x11, 0xFF); // Color1_G
  498. I2C_write_reg(0x12, 0x80); // Color1_B
  499. I2C_write_reg(0x1C, 0xFF); // PWM1
  500. I2C_write_reg(0x1D, 0xFF); // PWM2
  501. I2C_write_reg(0x1E, 0xFF); // PWM3
  502. I2C_write_reg(0x09, 0x07); // PAT_RIN
  503. I2C_write_reg(0x30, 0x14); // PAT_T1 Trise & Ton
  504. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  505. I2C_write_reg(0x32, 0x31); // PAT_T3 Tslot & Tdelay
  506. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  507. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  508. I2C_write_reg(0x09, 0x07); // PAT_RIN
  509. }
  510. }else
  511. {
  512. I2C_write_reg(0x00, 0x55); // software reset
  513. I2C_write_reg(0x01, 0x03); // GCR
  514. I2C_write_reg(0x03, 0x01); // IMAX
  515. I2C_write_reg(0x04, 0x00); // LCFG1
  516. I2C_write_reg(0x05, 0x00); // LCFG2
  517. I2C_write_reg(0x06, 0x00); // LCFG3
  518. I2C_write_reg(0x07, 0x07); // LEDEN
  519. I2C_write_reg(0x10, 0x00); // Color1_R
  520. I2C_write_reg(0x11, 0xFF); // Color1_G
  521. I2C_write_reg(0x12, 0x80); // Color1_B
  522. I2C_write_reg(0x1C, 0xFF); // PWM1
  523. I2C_write_reg(0x1D, 0xFF); // PWM2
  524. I2C_write_reg(0x1E, 0xFF); // PWM3
  525. I2C_write_reg(0x09, 0x07); // PAT_RIN
  526. }
  527. }
  528. else
  529. {
  530. I2C_write_reg(0x10, 0x00); // Color1_R
  531. I2C_write_reg(0x11, 0x00); // Color1_G
  532. I2C_write_reg(0x12, 0x00); // Color1_B
  533. I2C_write_reg(0x1C, 0x00); // PWM1
  534. I2C_write_reg(0x1D, 0x00); // PWM2
  535. I2C_write_reg(0x1E, 0x00); // PWM3
  536. I2C_write_reg(0x09, 0x07); // PAT_RIN
  537. GRAY_DELAY_ON = 0;
  538. GRAY_DELAY_OFF = 0;
  539. }
  540. return len;
  541. }
  542. static ssize_t AW2015_Set_Yellow(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  543. {
  544. unsigned int databuf[16];
  545. sscanf(buf,"%d",&databuf[0]);
  546. I2C_write_reg(0x00, 0x55); // software reset
  547. I2C_write_reg(0x01, 0x03); // GCR
  548. I2C_write_reg(0x03, 0x01); // IMAX
  549. I2C_write_reg(0x04, 0x00); // LCFG1
  550. I2C_write_reg(0x05, 0x00); // LCFG2
  551. I2C_write_reg(0x06, 0x00); // LCFG3
  552. I2C_write_reg(0x07, 0x07); // LEDEN
  553. if(databuf[0]!=0)
  554. {
  555. if(YELLOW_DELAY_OFF == 500)
  556. {
  557. if(YELLOW_DELAY_ON == 500)
  558. {
  559. I2C_write_reg(0x00, 0x55); // software reset
  560. I2C_write_reg(0x01, 0x03); // GCR
  561. I2C_write_reg(0x03, 0x01); // IMAX
  562. I2C_write_reg(0x04, 0x01); // LCFG1
  563. I2C_write_reg(0x05, 0x01); // LCFG2
  564. I2C_write_reg(0x06, 0x01); // LCFG3
  565. I2C_write_reg(0x07, 0x07); // LEDEN
  566. I2C_write_reg(0x08, 0x08); // LEDCTR
  567. I2C_write_reg(0x10, 0xFF); // Color1_R
  568. I2C_write_reg(0x11, 0xFF); // Color1_G
  569. I2C_write_reg(0x12, 0x00); // Color1_B
  570. I2C_write_reg(0x1C, 0xFF); // PWM1
  571. I2C_write_reg(0x1D, 0xFF); // PWM2
  572. I2C_write_reg(0x1E, 0xFF); // PWM3
  573. I2C_write_reg(0x09, 0x07); // PAT_RIN
  574. I2C_write_reg(0x30, 0x00); // PAT_T1 Trise & Ton
  575. I2C_write_reg(0x31, 0x00); // PAT_T2 Tfall & Toff
  576. I2C_write_reg(0x32, 0x00); // PAT_T3 Tslot & Tdelay
  577. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  578. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  579. I2C_write_reg(0x09, 0x07); // PAT_RIN
  580. }
  581. else if(YELLOW_DELAY_ON == 1000)
  582. {
  583. I2C_write_reg(0x00, 0x55); // software reset
  584. I2C_write_reg(0x01, 0x03); // GCR
  585. I2C_write_reg(0x03, 0x01); // IMAX
  586. I2C_write_reg(0x04, 0x01); // LCFG1
  587. I2C_write_reg(0x05, 0x01); // LCFG2
  588. I2C_write_reg(0x06, 0x01); // LCFG3
  589. I2C_write_reg(0x07, 0x07); // LEDEN
  590. I2C_write_reg(0x08, 0x08); // LEDCTR
  591. I2C_write_reg(0x10, 0xFF); // Color1_R
  592. I2C_write_reg(0x11, 0xFF); // Color1_G
  593. I2C_write_reg(0x12, 0x00); // Color1_B
  594. I2C_write_reg(0x1C, 0xFF); // PWM1
  595. I2C_write_reg(0x1D, 0xFF); // PWM2
  596. I2C_write_reg(0x1E, 0xFF); // PWM3
  597. I2C_write_reg(0x09, 0x07); // PAT_RIN
  598. I2C_write_reg(0x30, 0x13); // PAT_T1 Trise & Ton
  599. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  600. I2C_write_reg(0x32, 0x20); // PAT_T3 Tslot & Tdelay
  601. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  602. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  603. I2C_write_reg(0x09, 0x07); // PAT_RIN
  604. }
  605. else if(YELLOW_DELAY_ON == 1499)
  606. {
  607. I2C_write_reg(0x00, 0x55); // software reset
  608. I2C_write_reg(0x01, 0x03); // GCR
  609. I2C_write_reg(0x03, 0x01); // IMAX
  610. I2C_write_reg(0x04, 0x01); // LCFG1
  611. I2C_write_reg(0x05, 0x01); // LCFG2
  612. I2C_write_reg(0x06, 0x01); // LCFG3
  613. I2C_write_reg(0x07, 0x07); // LEDEN
  614. I2C_write_reg(0x08, 0x08); // LEDCTR
  615. I2C_write_reg(0x10, 0xFF); // Color1_R
  616. I2C_write_reg(0x11, 0xFF); // Color1_G
  617. I2C_write_reg(0x12, 0x00); // Color1_B
  618. I2C_write_reg(0x1C, 0xFF); // PWM1
  619. I2C_write_reg(0x1D, 0xFF); // PWM2
  620. I2C_write_reg(0x1E, 0xFF); // PWM3
  621. I2C_write_reg(0x09, 0x07); // PAT_RIN
  622. I2C_write_reg(0x30, 0x14); // PAT_T1 Trise & Ton
  623. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  624. I2C_write_reg(0x32, 0x31); // PAT_T3 Tslot & Tdelay
  625. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  626. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  627. I2C_write_reg(0x09, 0x07); // PAT_RIN
  628. }
  629. }else
  630. {
  631. I2C_write_reg(0x00, 0x55); // software reset
  632. I2C_write_reg(0x01, 0x03); // GCR
  633. I2C_write_reg(0x03, 0x01); // IMAX
  634. I2C_write_reg(0x04, 0x00); // LCFG1
  635. I2C_write_reg(0x05, 0x00); // LCFG2
  636. I2C_write_reg(0x06, 0x00); // LCFG3
  637. I2C_write_reg(0x07, 0x07); // LEDEN
  638. I2C_write_reg(0x10, 0xFF); // Color1_R
  639. I2C_write_reg(0x11, 0xFF); // Color1_G
  640. I2C_write_reg(0x12, 0x00); // Color1_B
  641. I2C_write_reg(0x1C, 0xFF); // PWM1
  642. I2C_write_reg(0x1D, 0xFF); // PWM2
  643. I2C_write_reg(0x1E, 0xFF); // PWM3
  644. I2C_write_reg(0x09, 0x07); // PAT_RIN
  645. }
  646. }
  647. else
  648. {
  649. I2C_write_reg(0x10, 0x00); // Color1_R
  650. I2C_write_reg(0x11, 0x00); // Color1_G
  651. I2C_write_reg(0x12, 0x00); // Color1_B
  652. I2C_write_reg(0x1C, 0x00); // PWM1
  653. I2C_write_reg(0x1D, 0x00); // PWM2
  654. I2C_write_reg(0x1E, 0x00); // PWM3
  655. I2C_write_reg(0x09, 0x07); // PAT_RIN
  656. YELLOW_DELAY_ON = 0;
  657. YELLOW_DELAY_OFF = 0;
  658. }
  659. return len;
  660. }
  661. static ssize_t AW2015_Set_Pink(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  662. {
  663. unsigned int databuf[16];
  664. sscanf(buf,"%d",&databuf[0]);
  665. I2C_write_reg(0x00, 0x55); // software reset
  666. I2C_write_reg(0x01, 0x03); // GCR
  667. I2C_write_reg(0x03, 0x01); // IMAX
  668. I2C_write_reg(0x04, 0x00); // LCFG1
  669. I2C_write_reg(0x05, 0x00); // LCFG2
  670. I2C_write_reg(0x06, 0x00); // LCFG3
  671. I2C_write_reg(0x07, 0x07); // LEDEN
  672. if(databuf[0]!=0)
  673. {
  674. if(PINK_DELAY_OFF == 500)
  675. {
  676. if(PINK_DELAY_ON == 500)
  677. {
  678. I2C_write_reg(0x00, 0x55); // software reset
  679. I2C_write_reg(0x01, 0x03); // GCR
  680. I2C_write_reg(0x03, 0x01); // IMAX
  681. I2C_write_reg(0x04, 0x01); // LCFG1
  682. I2C_write_reg(0x05, 0x01); // LCFG2
  683. I2C_write_reg(0x06, 0x01); // LCFG3
  684. I2C_write_reg(0x07, 0x07); // LEDEN
  685. I2C_write_reg(0x08, 0x08); // LEDCTR
  686. I2C_write_reg(0x10, 0xFF); // Color1_R
  687. I2C_write_reg(0x11, 0x00); // Color1_G
  688. I2C_write_reg(0x12, 0xFF); // Color1_B
  689. I2C_write_reg(0x1C, 0xFF); // PWM1
  690. I2C_write_reg(0x1D, 0xFF); // PWM2
  691. I2C_write_reg(0x1E, 0xFF); // PWM3
  692. I2C_write_reg(0x09, 0x07); // PAT_RIN
  693. I2C_write_reg(0x30, 0x00); // PAT_T1 Trise & Ton
  694. I2C_write_reg(0x31, 0x00); // PAT_T2 Tfall & Toff
  695. I2C_write_reg(0x32, 0x00); // PAT_T3 Tslot & Tdelay
  696. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  697. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  698. I2C_write_reg(0x09, 0x07); // PAT_RIN
  699. }
  700. else if(PINK_DELAY_ON == 1000)
  701. {
  702. I2C_write_reg(0x00, 0x55); // software reset
  703. I2C_write_reg(0x01, 0x03); // GCR
  704. I2C_write_reg(0x03, 0x01); // IMAX
  705. I2C_write_reg(0x04, 0x01); // LCFG1
  706. I2C_write_reg(0x05, 0x01); // LCFG2
  707. I2C_write_reg(0x06, 0x01); // LCFG3
  708. I2C_write_reg(0x07, 0x07); // LEDEN
  709. I2C_write_reg(0x08, 0x08); // LEDCTR
  710. I2C_write_reg(0x10, 0xFF); // Color1_R
  711. I2C_write_reg(0x11, 0x00); // Color1_G
  712. I2C_write_reg(0x12, 0xFF); // Color1_B
  713. I2C_write_reg(0x1C, 0xFF); // PWM1
  714. I2C_write_reg(0x1D, 0xFF); // PWM2
  715. I2C_write_reg(0x1E, 0xFF); // PWM3
  716. I2C_write_reg(0x09, 0x07); // PAT_RIN
  717. I2C_write_reg(0x30, 0x13); // PAT_T1 Trise & Ton
  718. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  719. I2C_write_reg(0x32, 0x20); // PAT_T3 Tslot & Tdelay
  720. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  721. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  722. I2C_write_reg(0x09, 0x07); // PAT_RIN
  723. }
  724. else if(PINK_DELAY_ON == 1499)
  725. {
  726. I2C_write_reg(0x00, 0x55); // software reset
  727. I2C_write_reg(0x01, 0x03); // GCR
  728. I2C_write_reg(0x03, 0x01); // IMAX
  729. I2C_write_reg(0x04, 0x01); // LCFG1
  730. I2C_write_reg(0x05, 0x01); // LCFG2
  731. I2C_write_reg(0x06, 0x01); // LCFG3
  732. I2C_write_reg(0x07, 0x07); // LEDEN
  733. I2C_write_reg(0x08, 0x08); // LEDCTR
  734. I2C_write_reg(0x10, 0xFF); // Color1_R
  735. I2C_write_reg(0x11, 0x00); // Color1_G
  736. I2C_write_reg(0x12, 0xFF); // Color1_B
  737. I2C_write_reg(0x1C, 0xFF); // PWM1
  738. I2C_write_reg(0x1D, 0xFF); // PWM2
  739. I2C_write_reg(0x1E, 0xFF); // PWM3
  740. I2C_write_reg(0x09, 0x07); // PAT_RIN
  741. I2C_write_reg(0x30, 0x14); // PAT_T1 Trise & Ton
  742. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  743. I2C_write_reg(0x32, 0x31); // PAT_T3 Tslot & Tdelay
  744. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  745. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  746. I2C_write_reg(0x09, 0x07); // PAT_RIN
  747. }
  748. }else
  749. {
  750. I2C_write_reg(0x00, 0x55); // software reset
  751. I2C_write_reg(0x01, 0x03); // GCR
  752. I2C_write_reg(0x03, 0x01); // IMAX
  753. I2C_write_reg(0x04, 0x00); // LCFG1
  754. I2C_write_reg(0x05, 0x00); // LCFG2
  755. I2C_write_reg(0x06, 0x00); // LCFG3
  756. I2C_write_reg(0x07, 0x07); // LEDEN
  757. I2C_write_reg(0x10, 0xFF); // Color1_R
  758. I2C_write_reg(0x11, 0x00); // Color1_G
  759. I2C_write_reg(0x12, 0xFF); // Color1_B
  760. I2C_write_reg(0x1C, 0xFF); // PWM1
  761. I2C_write_reg(0x1D, 0xFF); // PWM2
  762. I2C_write_reg(0x1E, 0xFF); // PWM3
  763. I2C_write_reg(0x09, 0x07); // PAT_RIN
  764. }
  765. }
  766. else
  767. {
  768. I2C_write_reg(0x10, 0x00); // Color1_R
  769. I2C_write_reg(0x11, 0x00); // Color1_G
  770. I2C_write_reg(0x12, 0x00); // Color1_B
  771. I2C_write_reg(0x1C, 0x00); // PWM1
  772. I2C_write_reg(0x1D, 0x00); // PWM2
  773. I2C_write_reg(0x1E, 0x00); // PWM3
  774. I2C_write_reg(0x09, 0x07); // PAT_RIN
  775. PINK_DELAY_ON = 0;
  776. PINK_DELAY_OFF = 0;
  777. }
  778. return len;
  779. }
  780. static ssize_t AW2015_Set_Red(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  781. {
  782. unsigned int databuf[16];
  783. sscanf(buf,"%d",&databuf[0]);
  784. I2C_write_reg(0x00, 0x55); // software reset
  785. I2C_write_reg(0x01, 0x03); // GCR
  786. I2C_write_reg(0x03, 0x01); // IMAX
  787. I2C_write_reg(0x04, 0x00); // LCFG1
  788. I2C_write_reg(0x05, 0x00); // LCFG2
  789. I2C_write_reg(0x06, 0x00); // LCFG3
  790. I2C_write_reg(0x07, 0x07); // LEDEN
  791. if(databuf[0]!=0)
  792. {
  793. if(RED_DELAY_OFF == 500)
  794. {
  795. if(RED_DELAY_ON == 500)
  796. {
  797. I2C_write_reg(0x00, 0x55); // software reset
  798. I2C_write_reg(0x01, 0x03); // GCR
  799. I2C_write_reg(0x03, 0x01); // IMAX
  800. I2C_write_reg(0x04, 0x01); // LCFG1
  801. I2C_write_reg(0x05, 0x01); // LCFG2
  802. I2C_write_reg(0x06, 0x01); // LCFG3
  803. I2C_write_reg(0x07, 0x07); // LEDEN
  804. I2C_write_reg(0x08, 0x08); // LEDCTR
  805. I2C_write_reg(0x10, 0xFF); // Color1_R
  806. I2C_write_reg(0x11, 0x00); // Color1_G
  807. I2C_write_reg(0x12, 0x00); // Color1_B
  808. I2C_write_reg(0x1C, 0xFF); // PWM1
  809. I2C_write_reg(0x1D, 0x00); // PWM2
  810. I2C_write_reg(0x1E, 0x00); // PWM3
  811. I2C_write_reg(0x09, 0x07); // PAT_RIN
  812. I2C_write_reg(0x30, 0x00); // PAT_T1 Trise & Ton
  813. I2C_write_reg(0x31, 0x00); // PAT_T2 Tfall & Toff
  814. I2C_write_reg(0x32, 0x00); // PAT_T3 Tslot & Tdelay
  815. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  816. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  817. I2C_write_reg(0x09, 0x07); // PAT_RIN
  818. }
  819. else if(RED_DELAY_ON == 1000)
  820. {
  821. I2C_write_reg(0x00, 0x55); // software reset
  822. I2C_write_reg(0x01, 0x03); // GCR
  823. I2C_write_reg(0x03, 0x01); // IMAX
  824. I2C_write_reg(0x04, 0x01); // LCFG1
  825. I2C_write_reg(0x05, 0x01); // LCFG2
  826. I2C_write_reg(0x06, 0x01); // LCFG3
  827. I2C_write_reg(0x07, 0x07); // LEDEN
  828. I2C_write_reg(0x08, 0x08); // LEDCTR
  829. I2C_write_reg(0x10, 0xFF); // Color1_R
  830. I2C_write_reg(0x11, 0x00); // Color1_G
  831. I2C_write_reg(0x12, 0x00); // Color1_B
  832. I2C_write_reg(0x1C, 0xFF); // PWM1
  833. I2C_write_reg(0x1D, 0x00); // PWM2
  834. I2C_write_reg(0x1E, 0x00); // PWM3
  835. I2C_write_reg(0x09, 0x07); // PAT_RIN
  836. I2C_write_reg(0x30, 0x13); // PAT_T1 Trise & Ton
  837. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  838. I2C_write_reg(0x32, 0x20); // PAT_T3 Tslot & Tdelay
  839. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  840. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  841. I2C_write_reg(0x09, 0x07); // PAT_RIN
  842. }
  843. else if(RED_DELAY_ON == 1499)
  844. {
  845. I2C_write_reg(0x00, 0x55); // software reset
  846. I2C_write_reg(0x01, 0x03); // GCR
  847. I2C_write_reg(0x03, 0x01); // IMAX
  848. I2C_write_reg(0x04, 0x01); // LCFG1
  849. I2C_write_reg(0x05, 0x01); // LCFG2
  850. I2C_write_reg(0x06, 0x01); // LCFG3
  851. I2C_write_reg(0x07, 0x07); // LEDEN
  852. I2C_write_reg(0x08, 0x08); // LEDCTR
  853. I2C_write_reg(0x10, 0xFF); // Color1_R
  854. I2C_write_reg(0x11, 0x00); // Color1_G
  855. I2C_write_reg(0x12, 0x00); // Color1_B
  856. I2C_write_reg(0x1C, 0xFF); // PWM1
  857. I2C_write_reg(0x1D, 0x00); // PWM2
  858. I2C_write_reg(0x1E, 0x00); // PWM3
  859. I2C_write_reg(0x09, 0x07); // PAT_RIN
  860. I2C_write_reg(0x30, 0x14); // PAT_T1 Trise & Ton
  861. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  862. I2C_write_reg(0x32, 0x31); // PAT_T3 Tslot & Tdelay
  863. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  864. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  865. I2C_write_reg(0x09, 0x07); // PAT_RIN
  866. }
  867. }else
  868. {
  869. I2C_write_reg(0x00, 0x55); // software reset
  870. I2C_write_reg(0x01, 0x03); // GCR
  871. I2C_write_reg(0x03, 0x01); // IMAX
  872. I2C_write_reg(0x04, 0x00); // LCFG1
  873. I2C_write_reg(0x05, 0x00); // LCFG2
  874. I2C_write_reg(0x06, 0x00); // LCFG3
  875. I2C_write_reg(0x07, 0x07); // LEDEN
  876. I2C_write_reg(0x10, 0xFF); // Color1_R
  877. I2C_write_reg(0x11, 0x00); // Color1_G
  878. I2C_write_reg(0x12, 0x00); // Color1_B
  879. I2C_write_reg(0x1C, 0xFF); // PWM1
  880. I2C_write_reg(0x1D, 0x00); // PWM2
  881. I2C_write_reg(0x1E, 0x00); // PWM3
  882. I2C_write_reg(0x09, 0x07); // PAT_RIN
  883. }
  884. }
  885. else
  886. {
  887. I2C_write_reg(0x10, 0x00); // Color1_R
  888. I2C_write_reg(0x11, 0x00); // Color1_G
  889. I2C_write_reg(0x12, 0x00); // Color1_B
  890. I2C_write_reg(0x1C, 0x00); // PWM1
  891. I2C_write_reg(0x1D, 0x00); // PWM2
  892. I2C_write_reg(0x1E, 0x00); // PWM3
  893. I2C_write_reg(0x09, 0x07); // PAT_RIN
  894. RED_DELAY_ON = 0;
  895. RED_DELAY_OFF = 0;
  896. }
  897. return len;
  898. }
  899. static ssize_t AW2015_Set_Green(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  900. {
  901. unsigned int databuf[16];
  902. sscanf(buf,"%d",&databuf[0]);
  903. I2C_write_reg(0x00, 0x55); // software reset
  904. I2C_write_reg(0x01, 0x03); // GCR
  905. I2C_write_reg(0x03, 0x01); // IMAX
  906. I2C_write_reg(0x04, 0x00); // LCFG1
  907. I2C_write_reg(0x05, 0x00); // LCFG2
  908. I2C_write_reg(0x06, 0x00); // LCFG3
  909. I2C_write_reg(0x07, 0x07); // LEDEN
  910. if(databuf[0]!=0)
  911. {
  912. if(GREEN_DELAY_OFF == 500)
  913. {
  914. if(GREEN_DELAY_ON == 500)
  915. {
  916. I2C_write_reg(0x00, 0x55); // software reset
  917. I2C_write_reg(0x01, 0x03); // GCR
  918. I2C_write_reg(0x03, 0x01); // IMAX
  919. I2C_write_reg(0x04, 0x01); // LCFG1
  920. I2C_write_reg(0x05, 0x01); // LCFG2
  921. I2C_write_reg(0x06, 0x01); // LCFG3
  922. I2C_write_reg(0x07, 0x07); // LEDEN
  923. I2C_write_reg(0x08, 0x08); // LEDCTR
  924. I2C_write_reg(0x10, 0x00); // Color1_R
  925. I2C_write_reg(0x11, 0xFF); // Color1_G
  926. I2C_write_reg(0x12, 0x00); // Color1_B
  927. I2C_write_reg(0x1C, 0xFF); // PWM1
  928. I2C_write_reg(0x1D, 0xFF); // PWM2
  929. I2C_write_reg(0x1E, 0xFF); // PWM3
  930. I2C_write_reg(0x30, 0x00); // PAT_T1 Trise & Ton
  931. I2C_write_reg(0x31, 0x00); // PAT_T2 Tfall & Toff
  932. I2C_write_reg(0x32, 0x00); // PAT_T3 Tslot & Tdelay
  933. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  934. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  935. I2C_write_reg(0x09, 0x07); // PAT_RIN
  936. }
  937. else if(GREEN_DELAY_ON == 1000)
  938. {
  939. I2C_write_reg(0x00, 0x55); // software reset
  940. I2C_write_reg(0x01, 0x03); // GCR
  941. I2C_write_reg(0x03, 0x01); // IMAX
  942. I2C_write_reg(0x04, 0x01); // LCFG1
  943. I2C_write_reg(0x05, 0x01); // LCFG2
  944. I2C_write_reg(0x06, 0x01); // LCFG3
  945. I2C_write_reg(0x07, 0x07); // LEDEN
  946. I2C_write_reg(0x08, 0x08); // LEDCTR
  947. I2C_write_reg(0x10, 0x00); // Color1_R
  948. I2C_write_reg(0x11, 0xFF); // Color1_G
  949. I2C_write_reg(0x12, 0x00); // Color1_B
  950. I2C_write_reg(0x1C, 0xFF); // PWM1
  951. I2C_write_reg(0x1D, 0xFF); // PWM2
  952. I2C_write_reg(0x1E, 0xFF); // PWM3
  953. I2C_write_reg(0x30, 0x13); // PAT_T1 Trise & Ton
  954. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  955. I2C_write_reg(0x32, 0x20); // PAT_T3 Tslot & Tdelay
  956. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  957. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  958. I2C_write_reg(0x09, 0x07); // PAT_RIN
  959. }
  960. else if(GREEN_DELAY_ON == 1499)
  961. {
  962. I2C_write_reg(0x00, 0x55); // software reset
  963. I2C_write_reg(0x01, 0x03); // GCR
  964. I2C_write_reg(0x03, 0x01); // IMAX
  965. I2C_write_reg(0x04, 0x01); // LCFG1
  966. I2C_write_reg(0x05, 0x01); // LCFG2
  967. I2C_write_reg(0x06, 0x01); // LCFG3
  968. I2C_write_reg(0x07, 0x07); // LEDEN
  969. I2C_write_reg(0x08, 0x08); // LEDCTR
  970. I2C_write_reg(0x10, 0x00); // Color1_R
  971. I2C_write_reg(0x11, 0xFF); // Color1_G
  972. I2C_write_reg(0x12, 0x00); // Color1_B
  973. I2C_write_reg(0x1C, 0xFF); // PWM1
  974. I2C_write_reg(0x1D, 0xFF); // PWM2
  975. I2C_write_reg(0x1E, 0xFF); // PWM3
  976. I2C_write_reg(0x30, 0x14); // PAT_T1 Trise & Ton
  977. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  978. I2C_write_reg(0x32, 0x31); // PAT_T3 Tslot & Tdelay
  979. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  980. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  981. I2C_write_reg(0x09, 0x07); // PAT_RIN
  982. }
  983. }else
  984. {
  985. I2C_write_reg(0x00, 0x55); // software reset
  986. I2C_write_reg(0x01, 0x03); // GCR
  987. I2C_write_reg(0x03, 0x01); // IMAX
  988. I2C_write_reg(0x04, 0x00); // LCFG1
  989. I2C_write_reg(0x05, 0x00); // LCFG2
  990. I2C_write_reg(0x06, 0x00); // LCFG3
  991. I2C_write_reg(0x07, 0x07); // LEDEN
  992. I2C_write_reg(0x08, 0x08); // LEDCTR
  993. I2C_write_reg(0x10, 0x00); // Color1_R
  994. I2C_write_reg(0x11, 0xFF); // Color1_G
  995. I2C_write_reg(0x12, 0x00); // Color1_B
  996. I2C_write_reg(0x1C, 0xFF); // PWM1
  997. I2C_write_reg(0x1D, 0xFF); // PWM2
  998. I2C_write_reg(0x1E, 0xFF); // PWM3
  999. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1000. }
  1001. }
  1002. else
  1003. {
  1004. I2C_write_reg(0x10, 0x00); // Color1_R
  1005. I2C_write_reg(0x11, 0x00); // Color1_G
  1006. I2C_write_reg(0x12, 0x00); // Color1_B
  1007. I2C_write_reg(0x1C, 0x00); // PWM1
  1008. I2C_write_reg(0x1D, 0x00); // PWM2
  1009. I2C_write_reg(0x1E, 0x00); // PWM3
  1010. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1011. GREEN_DELAY_ON = 0;
  1012. GREEN_DELAY_OFF = 0;
  1013. }
  1014. return len;
  1015. }
  1016. unsigned char AW2015_Set_Green_on_off(int status)
  1017. {
  1018. I2C_write_reg(0x00, 0x55); // software reset
  1019. I2C_write_reg(0x01, 0x03); // GCR
  1020. I2C_write_reg(0x03, 0x01); // IMAX
  1021. I2C_write_reg(0x04, 0x00); // LCFG1
  1022. I2C_write_reg(0x05, 0x00); // LCFG2
  1023. I2C_write_reg(0x06, 0x00); // LCFG3
  1024. I2C_write_reg(0x07, 0x07); // LEDEN
  1025. if(status!=0)
  1026. {
  1027. I2C_write_reg(0x10, 0x00); // Color1_R
  1028. I2C_write_reg(0x11, 0xFF); // Color1_G
  1029. I2C_write_reg(0x12, 0x00); // Color1_B
  1030. I2C_write_reg(0x1C, 0x00); // PWM1
  1031. I2C_write_reg(0x1D, 0xFF); // PWM2
  1032. I2C_write_reg(0x1E, 0x00); // PWM3
  1033. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1034. }
  1035. else
  1036. {
  1037. I2C_write_reg(0x10, 0x00); // Color1_R
  1038. I2C_write_reg(0x11, 0x00); // Color1_G
  1039. I2C_write_reg(0x12, 0x00); // Color1_B
  1040. I2C_write_reg(0x1C, 0x00); // PWM1
  1041. I2C_write_reg(0x1D, 0x00); // PWM2
  1042. I2C_write_reg(0x1E, 0x00); // PWM3
  1043. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1044. }
  1045. return 0;
  1046. }
  1047. EXPORT_SYMBOL(AW2015_Set_Green_on_off);
  1048. static ssize_t AW2015_Set_Blue(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  1049. {
  1050. unsigned int databuf[16];
  1051. sscanf(buf,"%d",&databuf[0]);
  1052. I2C_write_reg(0x00, 0x55); // software reset
  1053. I2C_write_reg(0x01, 0x03); // GCR
  1054. I2C_write_reg(0x03, 0x01); // IMAX
  1055. I2C_write_reg(0x04, 0x00); // LCFG1
  1056. I2C_write_reg(0x05, 0x00); // LCFG2
  1057. I2C_write_reg(0x06, 0x00); // LCFG3
  1058. I2C_write_reg(0x07, 0x07); // LEDEN
  1059. if(databuf[0]!=0)
  1060. {
  1061. if(BLUE_DELAY_OFF == 500)
  1062. {
  1063. if(BLUE_DELAY_ON == 500)
  1064. {
  1065. I2C_write_reg(0x00, 0x55); // software reset
  1066. I2C_write_reg(0x01, 0x03); // GCR
  1067. I2C_write_reg(0x03, 0x01); // IMAX
  1068. I2C_write_reg(0x04, 0x01); // LCFG1
  1069. I2C_write_reg(0x05, 0x01); // LCFG2
  1070. I2C_write_reg(0x06, 0x01); // LCFG3
  1071. I2C_write_reg(0x07, 0x07); // LEDEN
  1072. I2C_write_reg(0x08, 0x08); // LEDCTR
  1073. I2C_write_reg(0x10, 0x00); // Color1_R
  1074. I2C_write_reg(0x11, 0x00); // Color1_G
  1075. I2C_write_reg(0x12, 0xFF); // Color1_B
  1076. I2C_write_reg(0x1C, 0xFF); // PWM1
  1077. I2C_write_reg(0x1D, 0xFF); // PWM2
  1078. I2C_write_reg(0x1E, 0xFF); // PWM3
  1079. I2C_write_reg(0x30, 0x00); // PAT_T1 Trise & Ton
  1080. I2C_write_reg(0x31, 0x00); // PAT_T2 Tfall & Toff
  1081. I2C_write_reg(0x32, 0x00); // PAT_T3 Tslot & Tdelay
  1082. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  1083. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  1084. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1085. }
  1086. else if(BLUE_DELAY_ON == 1000)
  1087. {
  1088. I2C_write_reg(0x00, 0x55); // software reset
  1089. I2C_write_reg(0x01, 0x03); // GCR
  1090. I2C_write_reg(0x03, 0x01); // IMAX
  1091. I2C_write_reg(0x04, 0x01); // LCFG1
  1092. I2C_write_reg(0x05, 0x01); // LCFG2
  1093. I2C_write_reg(0x06, 0x01); // LCFG3
  1094. I2C_write_reg(0x07, 0x07); // LEDEN
  1095. I2C_write_reg(0x08, 0x08); // LEDCTR
  1096. I2C_write_reg(0x10, 0x00); // Color1_R
  1097. I2C_write_reg(0x11, 0x00); // Color1_G
  1098. I2C_write_reg(0x12, 0xFF); // Color1_B
  1099. I2C_write_reg(0x1C, 0xFF); // PWM1
  1100. I2C_write_reg(0x1D, 0xFF); // PWM2
  1101. I2C_write_reg(0x1E, 0xFF); // PWM3
  1102. I2C_write_reg(0x30, 0x13); // PAT_T1 Trise & Ton
  1103. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  1104. I2C_write_reg(0x32, 0x20); // PAT_T3 Tslot & Tdelay
  1105. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  1106. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  1107. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1108. }
  1109. else if(BLUE_DELAY_ON == 1499)
  1110. {
  1111. I2C_write_reg(0x00, 0x55); // software reset
  1112. I2C_write_reg(0x01, 0x03); // GCR
  1113. I2C_write_reg(0x03, 0x01); // IMAX
  1114. I2C_write_reg(0x04, 0x01); // LCFG1
  1115. I2C_write_reg(0x05, 0x01); // LCFG2
  1116. I2C_write_reg(0x06, 0x01); // LCFG3
  1117. I2C_write_reg(0x07, 0x07); // LEDEN
  1118. I2C_write_reg(0x08, 0x08); // LEDCTR
  1119. I2C_write_reg(0x10, 0x00); // Color1_R
  1120. I2C_write_reg(0x11, 0x00); // Color1_G
  1121. I2C_write_reg(0x12, 0xFF); // Color1_B
  1122. I2C_write_reg(0x1C, 0xFF); // PWM1
  1123. I2C_write_reg(0x1D, 0xFF); // PWM2
  1124. I2C_write_reg(0x1E, 0xFF); // PWM3
  1125. I2C_write_reg(0x30, 0x14); // PAT_T1 Trise & Ton
  1126. I2C_write_reg(0x31, 0x01); // PAT_T2 Tfall & Toff
  1127. I2C_write_reg(0x32, 0x31); // PAT_T3 Tslot & Tdelay
  1128. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  1129. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  1130. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1131. }
  1132. }else
  1133. {
  1134. I2C_write_reg(0x00, 0x55); // software reset
  1135. I2C_write_reg(0x01, 0x03); // GCR
  1136. I2C_write_reg(0x03, 0x01); // IMAX
  1137. I2C_write_reg(0x04, 0x00); // LCFG1
  1138. I2C_write_reg(0x05, 0x00); // LCFG2
  1139. I2C_write_reg(0x06, 0x00); // LCFG3
  1140. I2C_write_reg(0x07, 0x07); // LEDEN
  1141. I2C_write_reg(0x08, 0x08); // LEDCTR
  1142. I2C_write_reg(0x10, 0x00); // Color1_R
  1143. I2C_write_reg(0x11, 0x00); // Color1_G
  1144. I2C_write_reg(0x12, 0xFF); // Color1_B
  1145. I2C_write_reg(0x1C, 0xFF); // PWM1
  1146. I2C_write_reg(0x1D, 0xFF); // PWM2
  1147. I2C_write_reg(0x1E, 0xFF); // PWM3
  1148. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1149. }
  1150. }
  1151. else
  1152. {
  1153. I2C_write_reg(0x10, 0x00); // Color1_R
  1154. I2C_write_reg(0x11, 0x00); // Color1_G
  1155. I2C_write_reg(0x12, 0x00); // Color1_B
  1156. I2C_write_reg(0x1C, 0x00); // PWM1
  1157. I2C_write_reg(0x1D, 0x00); // PWM2
  1158. I2C_write_reg(0x1E, 0x00); // PWM3
  1159. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1160. BLUE_DELAY_ON = 0;
  1161. BLUE_DELAY_OFF = 0;
  1162. }
  1163. return len;
  1164. }
  1165. ///////////////////////////////////////////////////////////////////////////////////////////
  1166. // |-|_|-|______|-|_|-|______|-|_|-|______
  1167. ///////////////////////////////////////////////////////////////////////////////////////////
  1168. unsigned char AW2015_Multi_Pulse(void)
  1169. {
  1170. I2C_write_reg(0x00, 0x55); // software reset
  1171. I2C_write_reg(0x01, 0x03); // GCR
  1172. I2C_write_reg(0x03, 0x01); // IMAX
  1173. I2C_write_reg(0x04, 0x01); // LCFG1
  1174. I2C_write_reg(0x05, 0x01); // LCFG2
  1175. I2C_write_reg(0x06, 0x01); // LCFG3
  1176. I2C_write_reg(0x07, 0x07); // LEDEN
  1177. I2C_write_reg(0x08, 0x08); // LEDCTR
  1178. I2C_write_reg(0x10, 0xFF); // Color1_R
  1179. I2C_write_reg(0x11, 0x00); // Color1_G
  1180. I2C_write_reg(0x12, 0x00); // Color1_B
  1181. I2C_write_reg(0x1C, 0xFF); // PWM1
  1182. I2C_write_reg(0x1D, 0xFF); // PWM2
  1183. I2C_write_reg(0x1E, 0xFF); // PWM3
  1184. I2C_write_reg(0x30, 0x03); // PAT_T1 Trise & Ton
  1185. I2C_write_reg(0x31, 0x08); // PAT_T2 Tfall & Toff
  1186. I2C_write_reg(0x32, 0x30); // PAT_T3 Tslot & Tdelay
  1187. I2C_write_reg(0x33, 0x10); // PAT_T4 PAT_CTR & Color
  1188. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  1189. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1190. return 0;
  1191. }
  1192. //////////////////////////////////////////////////////////////////////////////////////////
  1193. // R -> G -> B -> W -> R ...
  1194. //////////////////////////////////////////////////////////////////////////////////////////
  1195. unsigned char AW2015_Multi_Color(void)
  1196. {
  1197. I2C_write_reg(0x00, 0x55); // software reset
  1198. I2C_write_reg(0x01, 0x03); // GCR
  1199. I2C_write_reg(0x03, 0x01); // IMAX
  1200. I2C_write_reg(0x04, 0x01); // LCFG1
  1201. I2C_write_reg(0x05, 0x01); // LCFG2
  1202. I2C_write_reg(0x06, 0x01); // LCFG3
  1203. I2C_write_reg(0x07, 0x07); // LEDEN
  1204. I2C_write_reg(0x08, 0x08); // LEDCTR
  1205. I2C_write_reg(0x10, 0xFF); // Color1_R
  1206. I2C_write_reg(0x11, 0x00); // Color1_G
  1207. I2C_write_reg(0x12, 0x00); // Color1_B
  1208. I2C_write_reg(0x13, 0x00); // Color2_R
  1209. I2C_write_reg(0x14, 0xFF); // Color2_G
  1210. I2C_write_reg(0x15, 0x00); // Color2_B
  1211. I2C_write_reg(0x16, 0x00); // Color3_R
  1212. I2C_write_reg(0x17, 0x00); // Color3_G
  1213. I2C_write_reg(0x18, 0xFF); // Color3_B
  1214. I2C_write_reg(0x19, 0xFF); // Color4_R
  1215. I2C_write_reg(0x1A, 0xFF); // Color4_G
  1216. I2C_write_reg(0x1B, 0xFF); // Color4_B
  1217. I2C_write_reg(0x1C, 0xFF); // PWM1
  1218. I2C_write_reg(0x1D, 0xFF); // PWM2
  1219. I2C_write_reg(0x1E, 0xFF); // PWM3
  1220. I2C_write_reg(0x30, 0x60); // PAT_T1 Trise & Ton
  1221. I2C_write_reg(0x31, 0x64); // PAT_T2 Tfall & Toff
  1222. I2C_write_reg(0x32, 0x00); // PAT_T3 Tdelay
  1223. I2C_write_reg(0x33, 0x0F); // PAT_T4 PAT_CTR & Color
  1224. I2C_write_reg(0x34, 0x00); // PAT_T5 Timer
  1225. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1226. return 0;
  1227. }
  1228. //////////////////////////////////////////////////////////////////////////////////////////
  1229. // S O S
  1230. // . . . - - - . . .
  1231. // |-|__|-|__|-|_______ |---|__|---|__|---|_______ |-|__|-|__|-|_______
  1232. //////////////////////////////////////////////////////////////////////////////////////////
  1233. unsigned char AW2015_SOS(void)
  1234. {
  1235. I2C_write_reg(0x00, 0x55); // software reset
  1236. I2C_write_reg(0x01, 0x03); // GCR
  1237. I2C_write_reg(0x03, 0x01); // IMAX
  1238. I2C_write_reg(0x04, 0x01); // LCFG1
  1239. I2C_write_reg(0x05, 0x01); // LCFG2
  1240. I2C_write_reg(0x06, 0x01); // LCFG3
  1241. I2C_write_reg(0x07, 0x07); // LEDEN
  1242. I2C_write_reg(0x08, 0x08); // LEDCTR
  1243. I2C_write_reg(0x10, 0xFF); // Color1_R
  1244. I2C_write_reg(0x11, 0x00); // Color1_G
  1245. I2C_write_reg(0x12, 0x00); // Color1_B
  1246. I2C_write_reg(0x1C, 0xFF); // PWM1
  1247. I2C_write_reg(0x1D, 0xFF); // PWM2
  1248. I2C_write_reg(0x1E, 0xFF); // PWM3
  1249. I2C_write_reg(0x30, 0x04); // PAT1_T1 Trise & Ton
  1250. I2C_write_reg(0x31, 0x0B); // PAT1_T2 Tfall & Toff
  1251. I2C_write_reg(0x32, 0x70); // PAT1_T3 Tslot & Tdelay
  1252. I2C_write_reg(0x33, 0xE0); // PAT1_T4 PAT_CTR & Color
  1253. I2C_write_reg(0x34, 0x00); // PAT1_T5 Timer
  1254. I2C_write_reg(0x35, 0x07); // PAT2_T1 Trise & Ton
  1255. I2C_write_reg(0x36, 0x0B); // PAT2_T2 Tfall & Toff
  1256. I2C_write_reg(0x37, 0x70); // PAT2_T3 Tslot & Tdelay
  1257. I2C_write_reg(0x38, 0xE0); // PAT2_T4 PAT_CTR & Color
  1258. I2C_write_reg(0x39, 0x00); // PAT2_T5 Timer
  1259. I2C_write_reg(0x3A, 0x04); // PAT3_T1 Trise & Ton
  1260. I2C_write_reg(0x3B, 0x0B); // PAT3_T2 Tfall & Toff
  1261. I2C_write_reg(0x3C, 0x70); // PAT3_T3 Tslot & Tdelay
  1262. I2C_write_reg(0x3D, 0xE0); // PAT3_T4 PAT_CTR & Color
  1263. I2C_write_reg(0x3E, 0x00); // PAT3_T5 Timer
  1264. I2C_write_reg(0x09, 0x07); // PAT_RIN
  1265. return 0;
  1266. }
  1267. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1268. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1269. static ssize_t AW2015_get_reg(struct device* cd,struct device_attribute *attr, char* buf)
  1270. {
  1271. unsigned char reg_val;
  1272. unsigned char i;
  1273. ssize_t len = 0;
  1274. for(i=0;i<0x3A;i++)
  1275. {
  1276. reg_val = I2C_read_reg(i);
  1277. len += snprintf(buf+len, PAGE_SIZE-len, "reg%2X = 0x%2X, ", i,reg_val);
  1278. }
  1279. return len;
  1280. }
  1281. static ssize_t AW2015_set_reg(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  1282. {
  1283. unsigned int databuf[2];
  1284. if(2 == sscanf(buf,"%x %x",&databuf[0], &databuf[1]))
  1285. {
  1286. I2C_write_reg(databuf[0],databuf[1]);
  1287. }
  1288. return len;
  1289. }
  1290. static ssize_t AW2015_get_debug(struct device* cd,struct device_attribute *attr, char* buf)
  1291. {
  1292. ssize_t len = 0;
  1293. len += snprintf(buf+len, PAGE_SIZE-len, "AW2015_LED_OFF(void)\n");
  1294. len += snprintf(buf+len, PAGE_SIZE-len, "echo 0 > debug\n");
  1295. len += snprintf(buf+len, PAGE_SIZE-len, "\n");
  1296. len += snprintf(buf+len, PAGE_SIZE-len, "AW2015_LED_ON(r, g, b)\n");
  1297. len += snprintf(buf+len, PAGE_SIZE-len, "echo 1 r g b > debug\n");
  1298. len += snprintf(buf+len, PAGE_SIZE-len, "echo 1 255 255 255 > debug\n");
  1299. len += snprintf(buf+len, PAGE_SIZE-len, "\n");
  1300. len += snprintf(buf+len, PAGE_SIZE-len, "AW2015_LED_Blink(r, g, b, trise, ton, tfall, tfall)\n");
  1301. len += snprintf(buf+len, PAGE_SIZE-len, "echo 2 r g b trise ton tfall toff > debug\n");
  1302. len += snprintf(buf+len, PAGE_SIZE-len, "echo 2 255 255 255 1000 0 1000 1000 > debug\n");
  1303. len += snprintf(buf+len, PAGE_SIZE-len, "\n");
  1304. len += snprintf(buf+len, PAGE_SIZE-len, "AW2015_Multi_Pulse(void)\n");
  1305. len += snprintf(buf+len, PAGE_SIZE-len, "echo 3 > debug\n");
  1306. len += snprintf(buf+len, PAGE_SIZE-len, "\n");
  1307. len += snprintf(buf+len, PAGE_SIZE-len, "AW2015_Multi_Color(void)\n");
  1308. len += snprintf(buf+len, PAGE_SIZE-len, "echo 4 > debug\n");
  1309. len += snprintf(buf+len, PAGE_SIZE-len, "\n");
  1310. len += snprintf(buf+len, PAGE_SIZE-len, "AW2015_SOS(void)\n");
  1311. len += snprintf(buf+len, PAGE_SIZE-len, "echo 5 > debug\n");
  1312. len += snprintf(buf+len, PAGE_SIZE-len, "\n");
  1313. return len;
  1314. }
  1315. static ssize_t AW2015_set_debug(struct device* cd, struct device_attribute *attr, const char* buf, size_t len)
  1316. {
  1317. unsigned int databuf[16];
  1318. sscanf(buf,"%d",&databuf[0]);
  1319. if(databuf[0] == 0) { // OFF
  1320. AW2015_LED_OFF();
  1321. } else if(databuf[0] == 1) { //ON
  1322. sscanf(&buf[1], "%d %d %d", &databuf[1], &databuf[2], &databuf[3]);
  1323. AW2015_LED_ON(databuf[1], databuf[2], databuf[3]);
  1324. } else if(databuf[0] == 2) { //Blink
  1325. sscanf(&buf[1], "%d %d %d %d %d %d %d", &databuf[1], &databuf[2], &databuf[3], &databuf[4], &databuf[5], &databuf[6], &databuf[7]);
  1326. AW2015_LED_Blink(databuf[1], databuf[2], databuf[3], databuf[4], databuf[5], databuf[6], databuf[7]);
  1327. } else if(databuf[0] == 3) { //Multi Pulse
  1328. AW2015_Multi_Pulse();
  1329. } else if(databuf[0] == 4) { //Multi Color
  1330. AW2015_Multi_Color();
  1331. } else if(databuf[0] == 5) { //SOS
  1332. AW2015_SOS();
  1333. }
  1334. return len;
  1335. }
  1336. static int AW2015_create_sysfs(struct i2c_client *client)
  1337. {
  1338. int err;
  1339. struct device *dev = &(client->dev);
  1340. err = device_create_file(dev, &dev_attr_reg);
  1341. err = device_create_file(dev, &dev_attr_debug);
  1342. err = device_create_file(dev, &dev_attr_Red);
  1343. err = device_create_file(dev, &dev_attr_Green);
  1344. err = device_create_file(dev, &dev_attr_Blue);
  1345. err = device_create_file(dev, &dev_attr_Red_delay_off);
  1346. err = device_create_file(dev, &dev_attr_Red_delay_on);
  1347. err = device_create_file(dev, &dev_attr_Green_delay_off);
  1348. err = device_create_file(dev, &dev_attr_Green_delay_on);
  1349. err = device_create_file(dev, &dev_attr_Blue_delay_off);
  1350. err = device_create_file(dev, &dev_attr_Blue_delay_on);
  1351. err = device_create_file(dev, &dev_attr_White);
  1352. err = device_create_file(dev, &dev_attr_White_delay_off);
  1353. err = device_create_file(dev, &dev_attr_White_delay_on);
  1354. err = device_create_file(dev, &dev_attr_Gray);
  1355. err = device_create_file(dev, &dev_attr_Gray_delay_off);
  1356. err = device_create_file(dev, &dev_attr_Gray_delay_on);
  1357. err = device_create_file(dev, &dev_attr_Yellow);
  1358. err = device_create_file(dev, &dev_attr_Yellow_delay_off);
  1359. err = device_create_file(dev, &dev_attr_Yellow_delay_on);
  1360. err = device_create_file(dev, &dev_attr_Pink);
  1361. err = device_create_file(dev, &dev_attr_Pink_delay_off);
  1362. err = device_create_file(dev, &dev_attr_Pink_delay_on);
  1363. return err;
  1364. }
  1365. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1366. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1367. static int AW2015_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
  1368. {
  1369. unsigned char reg_value;
  1370. unsigned char cnt = 5;
  1371. int err = 0;
  1372. //pr_err("AW2015_i2c_probe xmwuwh start\n");
  1373. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
  1374. err = -ENODEV;
  1375. goto exit_check_functionality_failed;
  1376. }
  1377. //client->addr = 0x64;
  1378. AW2015_i2c_client = client;
  1379. while(cnt>0)
  1380. {
  1381. reg_value = I2C_read_reg(0x00);
  1382. printk("AW2015 CHIPID=0x%2x\n", reg_value);
  1383. if(reg_value == 0x31)
  1384. {
  1385. break;
  1386. }
  1387. cnt --;
  1388. msleep(10);
  1389. }
  1390. if(!cnt)
  1391. {
  1392. err = -ENODEV;
  1393. goto exit_create_singlethread;
  1394. }
  1395. AW2015_create_sysfs(client);
  1396. I2C_write_reg(0x00, 0x55); // software reset
  1397. return 0;
  1398. exit_create_singlethread:
  1399. AW2015_i2c_client = NULL;
  1400. exit_check_functionality_failed:
  1401. return err;
  1402. }
  1403. static int AW2015_i2c_remove(struct i2c_client *client)
  1404. {
  1405. AW2015_i2c_client = NULL;
  1406. return 0;
  1407. }
  1408. static const struct i2c_device_id AW2015_i2c_id[] = {
  1409. { AW2015_I2C_NAME, 0 },
  1410. { }
  1411. };
  1412. #ifdef CONFIG_OF
  1413. static const struct of_device_id aw2015_i2c_of_match[] = {
  1414. {.compatible = "awinic,pressure"},
  1415. {},
  1416. };
  1417. #endif
  1418. static struct i2c_driver AW2015_i2c_driver = {
  1419. .driver = {
  1420. .name = AW2015_I2C_NAME,
  1421. #ifdef CONFIG_OF
  1422. .of_match_table = aw2015_i2c_of_match,
  1423. #endif
  1424. },
  1425. .probe = AW2015_i2c_probe,
  1426. .remove = AW2015_i2c_remove,
  1427. .id_table = AW2015_i2c_id,
  1428. };
  1429. static int AW2015_led_remove(struct platform_device *pdev)
  1430. {
  1431. printk("AW2015 remove\n");
  1432. i2c_del_driver(&AW2015_i2c_driver);
  1433. return 0;
  1434. }
  1435. static int AW2015_led_probe(struct platform_device *pdev)
  1436. {
  1437. int ret;
  1438. printk("%s 1 start!\n", __func__);
  1439. ret = i2c_add_driver(&AW2015_i2c_driver);
  1440. if (ret != 0) {
  1441. printk("[%s] failed to register AW2015 i2c driver.\n", __func__);
  1442. return ret;
  1443. } else {
  1444. printk("[%s] Success to register AW2015 i2c driver.\n", __func__);
  1445. }
  1446. return 0;
  1447. }
  1448. #ifdef CONFIG_OF
  1449. static const struct of_device_id aw2015plt_of_match[] = {
  1450. {.compatible = "awinic,aw2015_led"},
  1451. {},
  1452. };
  1453. #endif
  1454. //static void aw2015_led_shutdown(struct platform_device *dev)
  1455. //{
  1456. // AW2015_LED_OFF();
  1457. // pr_err("******** xmwuwh aw2015_led_shutdown!! ********\n");
  1458. //}
  1459. static struct platform_driver AW2015_led_driver = {
  1460. .probe = AW2015_led_probe,
  1461. .remove = AW2015_led_remove,
  1462. //.shutdown = aw2015_led_shutdown,
  1463. .driver = {
  1464. .name = "aw2015_led",
  1465. #ifdef CONFIG_OF
  1466. .of_match_table = aw2015plt_of_match,
  1467. #endif
  1468. }
  1469. };
  1470. static int __init AW2015_led_init(void) {
  1471. int ret;
  1472. //pr_err("%s xmwuwh start\n", __func__);
  1473. ret = platform_driver_register(&AW2015_led_driver);
  1474. if (ret) {
  1475. printk("****[%s] Unable to register driver (%d)\n", __func__, ret);
  1476. return ret;
  1477. }
  1478. return 0;
  1479. }
  1480. static void __exit AW2015_led_exit(void) {
  1481. printk("%s exit\n", __func__);
  1482. platform_driver_unregister(&AW2015_led_driver);
  1483. }
  1484. module_init(AW2015_led_init);
  1485. module_exit(AW2015_led_exit);
  1486. MODULE_AUTHOR("<liweilei@awinic.com.cn>");
  1487. MODULE_DESCRIPTION("AWINIC AW2015 LED Driver");
  1488. MODULE_LICENSE("GPL");