drvmain.c 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. #include <linux/version.h>
  2. #include <linux/init.h>
  3. #include <linux/kernel.h> // printk()
  4. #include <linux/module.h> // THIS_MODULE
  5. #include <linux/kobject.h> // struct kobject
  6. #include <linux/timer.h>
  7. #include <linux/errno.h> // error codes
  8. #include <linux/sysfs.h>
  9. #include <linux/syscalls.h>
  10. #include <linux/workqueue.h>
  11. #include <asm/ioctls.h>
  12. #include <linux/spi/spidev.h>
  13. #include "defines.h"
  14. #include "kfile.h"
  15. #include "kspi.h"
  16. #include "ktiva.h"
  17. #include "sfsattrib.h"
  18. #include "kfirmware.h"
  19. #include "ksync.h"
  20. /////////////////////////////////////////////////////////////////////////////
  21. MODULE_LICENSE("Dual BSD/GPL");
  22. MODULE_AUTHOR("GfA");
  23. #define _SLEEP_DELAY_JIFFIES 5
  24. #define _IS_REVIVE_STATE(ret) ((ret) != -ECOMM)
  25. /////////////////////////////////////////////////////////////////////////////
  26. // sys fs
  27. static struct kobject *g_pKoGfa = NULL, *g_pKoTiva = NULL, *g_pKoBacklight = NULL, *g_pKoADC = NULL, *g_pKoFirmware = NULL, *g_pKoMem = NULL, *g_pKoRtc = NULL;
  28. static bool g_bHasFwVersion = false, g_bHasDeviceCaps = false;
  29. static atomic_t g_flgSysFsRunning;
  30. /////////////////////////////////////////////////////////////////////////////
  31. // worker threads
  32. static void _SysFsWorkProc(struct work_struct *work);
  33. static void _FwUploadWorkProc(struct work_struct *work);
  34. static void _BacklightWorkProc(struct work_struct *work);
  35. static struct workqueue_struct *g_pwq = NULL;
  36. static DECLARE_WORK(g_sysFsWorkObj, _SysFsWorkProc);
  37. static DECLARE_WORK(g_fwUploadWorkObj, _FwUploadWorkProc);
  38. static DECLARE_WORK(g_backLightWorkObj, _BacklightWorkProc);
  39. /////////////////////////////////////////////////////////////////////////////
  40. // timer
  41. static atomic_t g_flgTimerRunning;
  42. static struct timer_list g_timer_list;
  43. /////////////////////////////////////////////////////////////////////////////
  44. typedef enum _WorkerState
  45. {
  46. WS_SysFs,
  47. WS_FwUpload,
  48. WS_Backlight,
  49. WS_Idle
  50. }WorkerState;
  51. /////////////////////////////////////////////////////////////////////////////
  52. static bool _GetSysFsRunning(void)
  53. {
  54. return !!atomic_read(&g_flgSysFsRunning);
  55. }
  56. /////////////////////////////////////////////////////////////////////////////
  57. static void _SetSysFsRunning(bool bRunning)
  58. {
  59. atomic_set(&g_flgSysFsRunning, bRunning ? 1 : 0);
  60. }
  61. /////////////////////////////////////////////////////////////////////////////
  62. static bool _GetTimerRunning(void)
  63. {
  64. return !!atomic_read(&g_flgTimerRunning);
  65. }
  66. /////////////////////////////////////////////////////////////////////////////
  67. static void _SetTimerRunning(bool bRunning)
  68. {
  69. atomic_set(&g_flgTimerRunning, bRunning ? 1 : 0);
  70. }
  71. /////////////////////////////////////////////////////////////////////////////
  72. static void _WorkScheduler(unsigned long ptr)
  73. {
  74. static unsigned int nPass = 0;
  75. static WorkerState ws = WS_SysFs;
  76. // KALERT("%s: %d, %p\n", __FUNCTION__, _GetTimerRunning() ? 1 : 0, g_pwq);
  77. if(_GetTimerRunning())
  78. {
  79. if(KfwUploadInfoReady())
  80. ws = WS_FwUpload;
  81. else if(SfAttBacklightChanged())
  82. ws = WS_Backlight;
  83. else if(!_GetSysFsRunning())
  84. ws = WS_Idle;
  85. switch(ws)
  86. {
  87. case WS_SysFs:
  88. if(++nPass == 3)
  89. {
  90. if(!queue_work(g_pwq, &g_sysFsWorkObj))
  91. {
  92. KALERT("%s: queue_work failed\n", __FUNCTION__);
  93. }
  94. nPass = 0;
  95. }
  96. else
  97. {
  98. mod_timer(&g_timer_list, _TIMER_INTERVAL);
  99. }
  100. break;
  101. case WS_FwUpload:
  102. if(!queue_work(g_pwq, &g_fwUploadWorkObj))
  103. {
  104. KALERT("%s: queue_work failed\n", __FUNCTION__);
  105. }
  106. ws = WS_SysFs;
  107. nPass = 2;
  108. break;
  109. case WS_Backlight:
  110. if(!queue_work(g_pwq, &g_backLightWorkObj))
  111. {
  112. KALERT("%s: queue_work failed\n", __FUNCTION__);
  113. }
  114. ws = WS_SysFs;
  115. nPass = 2;
  116. break;
  117. case WS_Idle:
  118. mod_timer(&g_timer_list, _TIMER_INTERVAL);
  119. break;
  120. }
  121. }
  122. }
  123. /////////////////////////////////////////////////////////////////////////////
  124. // work queue
  125. // sysfs_notify
  126. // https://stackoverflow.com/questions/16367623/using-the-linux-sysfs-notify-call
  127. //
  128. static void _BacklightWorkProc(struct work_struct *work)
  129. {
  130. struct file *pfSpiDev = NULL;
  131. int ret;
  132. if((pfSpiDev = kf_open_locked(_SPI_DEVICE, O_RDWR, 0)))
  133. {
  134. do
  135. {
  136. unsigned int nPeriod = SfAttGetBacklightPeriod();
  137. unsigned int nDutyCyclePerc = SfAttGetBacklightDutyCyclePercent();
  138. /////////////////////////////////////////////////////////////////
  139. if(!KSpiInit(pfSpiDev))
  140. {
  141. break;
  142. }
  143. /////////////////////////////////////////////////////////////////
  144. KALERT("%s: Set backlight period to %u, duty cycle to %u %%\n", __FUNCTION__, nPeriod, nDutyCyclePerc);
  145. if((ret = TivaCmdSetBacklight(pfSpiDev, nPeriod, nDutyCyclePerc)) != 0)
  146. {
  147. KALERT("%s: TivaCmdSetBacklight failed: %d!\n", __FUNCTION__, ret);
  148. break;
  149. }
  150. }
  151. while(0);
  152. kf_close(pfSpiDev);
  153. }
  154. else
  155. {
  156. KALERT("%s: kf_open_locked failed\n", __FUNCTION__);
  157. }
  158. if(_GetTimerRunning())
  159. {
  160. ksync_lock();
  161. mod_timer(&g_timer_list, _TIMER_INTERVAL);
  162. ksync_unlock();
  163. }
  164. }
  165. /////////////////////////////////////////////////////////////////////////////
  166. static void _FwUploadWorkProc(struct work_struct *work)
  167. {
  168. int nRet, i;
  169. bool bSuccess = false, bReset = true;
  170. unsigned long start = jiffies;
  171. struct file *pfSpiDev = NULL;
  172. TIVA_UPLOAD_INFO tui;
  173. if(!KfwQueryUploadInfo(&tui))
  174. {
  175. KALERT("%s: Upload info not ready!!\n", __FUNCTION__);
  176. return;
  177. }
  178. if((pfSpiDev = kf_open_locked(_SPI_DEVICE, O_RDWR, 0)))
  179. {
  180. do
  181. {
  182. unsigned char stat = 0xFF;
  183. size_t nCntBlocks, nCbToSend, nCbBlock, nCntFlashPages;
  184. const unsigned char *pbToSend;
  185. if(!KSpiInit(pfSpiDev))
  186. {
  187. break;
  188. }
  189. /////////////////////////////////////////////////////////////////
  190. if(g_sw >= KFW_MIN_HAS_MATERIAL_NR_VERSION)
  191. {
  192. }
  193. if((nRet = TivaCmdStartBootloader(pfSpiDev)) < 0)
  194. {
  195. KALERT("%s: TivaCmdStartBootloader failed!\n", __FUNCTION__);
  196. break;
  197. }
  198. ksync_lock();
  199. g_hw = -1;
  200. g_sw = -1;
  201. g_bHasFwVersion = false;
  202. ksync_unlock();
  203. sysfs_notify(g_pKoFirmware, NULL, "version");
  204. KALERT("%s: Started bootloader!\n", __FUNCTION__);
  205. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  206. if((nRet = TivaCmdGetBootloaderStatus(pfSpiDev, &stat)) < 0)
  207. {
  208. KALERT("%s: TivaCmdGetBootloaderStatus failed!\n", __FUNCTION__);
  209. break;
  210. }
  211. KALERT("%s: Bootloader Status: 0x%02hhX\n", __FUNCTION__, stat);
  212. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  213. if((nRet = TivaCmdPing(pfSpiDev)) < 0)
  214. {
  215. KALERT("%s: TivaCmdPing failed!\n", __FUNCTION__);
  216. break;
  217. }
  218. KALERT("%s: Bootloader Ping success!\n", __FUNCTION__);
  219. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  220. if((nRet = TivaCmdGetBootloaderStatus(pfSpiDev, &stat)) < 0)
  221. {
  222. KALERT("%s: TivaCmdGetBootloaderStatus failed!\n", __FUNCTION__);
  223. break;
  224. }
  225. KALERT("%s: Bootloader Status: 0x%02hhX\n", __FUNCTION__, stat);
  226. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  227. /////////////////////////////////////////////////////////////////
  228. nCbToSend = (tui.nCbData + (KFW_MIN_UPLOAD_BLOCKSIZE - 1) / KFW_MIN_UPLOAD_BLOCKSIZE * KFW_MIN_UPLOAD_BLOCKSIZE);
  229. pbToSend = (const unsigned char*)tui.pData;
  230. nCntBlocks = (nCbToSend + KFW_DEFAULT_UPLOAD_BLOCKSIZE - 1) / KFW_DEFAULT_UPLOAD_BLOCKSIZE;
  231. nCntFlashPages = (nCntBlocks * KFW_DEFAULT_UPLOAD_BLOCKSIZE + KFW_FLASH_PAGE_SIZE - 1) / KFW_FLASH_PAGE_SIZE;
  232. KALERT("%s: Start Download of %zu Bytes (%zu Blocks) at Address 0x%08X\n", __FUNCTION__, nCbToSend, nCntBlocks, KFW_DEFAULT_BASE_ADDRESS);
  233. if((nRet = TivaCmdStartDownload(pfSpiDev, KFW_DEFAULT_BASE_ADDRESS, nCbToSend)) != 0)
  234. {
  235. KALERT("%s: TivaCmdStartDownload failed: %d!\n", __FUNCTION__, nRet);
  236. break;
  237. }
  238. ksync_sleep_jiffies((long)(nCntFlashPages * KFW_DEFAULT_PAGE_ERASE_TIME));
  239. if((nRet = TivaCmdGetBootloaderStatus(pfSpiDev, &stat)) < 0)
  240. {
  241. KALERT("%s: TivaCmdGetBootloaderStatus failed!\n", __FUNCTION__);
  242. break;
  243. }
  244. if(stat != COMMAND_RET_SUCCESS)
  245. {
  246. KALERT("%s: TivaCmdGetBootloaderStatus returned 0x%02hhX!\n", __FUNCTION__, stat);
  247. break;
  248. }
  249. KALERT("%s: Bootloader Status: 0x%02hhX\n", __FUNCTION__, stat);
  250. KALERT("%s: Sending data ...\n", __FUNCTION__);
  251. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  252. for(i = 0; i < nCntBlocks; ++i)
  253. {
  254. nCbBlock = _min(KFW_DEFAULT_UPLOAD_BLOCKSIZE, nCbToSend);
  255. if((nRet = TivaCmdSendDataBlock(pfSpiDev, pbToSend, nCbBlock)) != 0)
  256. {
  257. bReset = false;
  258. KALERT("%s: TivaCmdSendDataBlock failed!\n", __FUNCTION__);
  259. break;
  260. }
  261. pbToSend += nCbBlock;
  262. nCbToSend -= nCbBlock;
  263. if(i && !(i % 64))
  264. {
  265. KALERT("%s: %zu Blocks sent.\n", __FUNCTION__, i);
  266. }
  267. // ksync_sleep_jiffies(1);
  268. if((nRet = TivaCmdGetBootloaderStatus(pfSpiDev, &stat)) < 0)
  269. {
  270. bReset = false;
  271. KALERT("%s: TivaCmdGetBootloaderStatus failed!\n", __FUNCTION__);
  272. break;
  273. }
  274. if(stat != COMMAND_RET_SUCCESS)
  275. {
  276. bReset = false;
  277. KALERT("%s: TivaCmdGetBootloaderStatus returned 0x%02hhX!\n", __FUNCTION__, stat);
  278. break;
  279. }
  280. // ksync_sleep_jiffies(1);
  281. }
  282. KALERT("%s: %zu Blocks sent.\n", __FUNCTION__, i);
  283. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  284. /////////////////////////////////////////////////////////////////
  285. if(bReset)
  286. {
  287. if((nRet = TivaCmdReset(pfSpiDev)) < 0)
  288. {
  289. KALERT("%s: TivaCmdReset failed!\n", __FUNCTION__);
  290. break;
  291. }
  292. KALERT("%s: Started firmware!\n", __FUNCTION__);
  293. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  294. if((nRet = TivaCmdGetStatus(pfSpiDev, &stat)) < 0)
  295. {
  296. KALERT("%s: TivaCmdGetStatus failed!\n", __FUNCTION__);
  297. break;
  298. }
  299. KALERT("%s: FW Status: 0x%02hhX\n", __FUNCTION__, stat);
  300. bSuccess = true;
  301. }
  302. // KALERT("%s: data: 0x%p, cb: %zu, mat: %s, bld: %s\n", __FUNCTION__, tui.pData, tui.nCbData, tui.pszMat, tui.pszBld);
  303. }
  304. while(0);
  305. kf_close(pfSpiDev);
  306. SfAttLockFirmware(false);
  307. }
  308. else
  309. {
  310. KALERT("%s: kf_open_locked failed\n", __FUNCTION__);
  311. }
  312. if(!bSuccess)
  313. {
  314. KALERT("%s: Firmware-Upload failed! Stopping all activities!\n", __FUNCTION__);
  315. }
  316. _SetSysFsRunning(bSuccess);
  317. if(_GetTimerRunning())
  318. {
  319. ksync_lock();
  320. mod_timer(&g_timer_list, _TIMER_INTERVAL);
  321. ksync_unlock();
  322. }
  323. KALERT("%s: jiffies: %lu\n", __FUNCTION__, _JIFFY_DIFF(jiffies, start));
  324. }
  325. /////////////////////////////////////////////////////////////////////////////
  326. static void _SysFsWorkProc(struct work_struct *work)
  327. {
  328. TIVA_ADC tadc;
  329. unsigned char stat;
  330. int hw, sw, ret;
  331. unsigned long long nUpTime;
  332. struct file *pfSpiDev = NULL;
  333. if((pfSpiDev = kf_open_locked(_SPI_DEVICE, O_RDWR, 0)))
  334. {
  335. do
  336. {
  337. if(!KSpiInit(pfSpiDev))
  338. {
  339. break;
  340. }
  341. /////////////////////////////////////////////////////////////////
  342. #if !_SITARA_EGGELSBERG
  343. if( (ret = TivaCmdPing(pfSpiDev)) < 0 &&
  344. _IS_REVIVE_STATE(ret))
  345. {
  346. KALERT("%s: TivaCmdPing failed: %d - call TivaRevive\n", __FUNCTION__, ret);
  347. TivaRevive(pfSpiDev);
  348. }
  349. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  350. /////////////////////////////////////////////////////////////////
  351. // device capabilities
  352. if(!g_bHasDeviceCaps)
  353. {
  354. TIVA_DCAP dcap;
  355. if((ret = TivaCmdGetDeviceCaps(pfSpiDev, &dcap)) == 0)
  356. {
  357. ksync_lock();
  358. g_dcaps = dcap;
  359. g_tiMM[0].size = KTIVA_FLASH_SIZE(dcap.fsize); // Flash
  360. g_tiMM[1].size = KTIVA_SRAM_SIZE(dcap.ssize); // SRAM
  361. g_tiMM[2].size = g_tiMM[1].size * 32; // Bit banded SRAM
  362. ksync_unlock();
  363. g_bHasDeviceCaps = true;
  364. }
  365. else
  366. {
  367. if(_IS_REVIVE_STATE(ret))
  368. {
  369. KALERT("%s: TivaCmdGetFirmwareVersion failed: %d - call TivaRevive\n", __FUNCTION__, ret);
  370. TivaRevive(pfSpiDev);
  371. }
  372. break;
  373. }
  374. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  375. }
  376. /////////////////////////////////////////////////////////////////
  377. // firmware
  378. if(!g_bHasFwVersion)
  379. {
  380. if((ret = TivaCmdGetFirmwareVersion(pfSpiDev, &hw, &sw)) == 0)
  381. {
  382. ksync_lock();
  383. g_hw = hw;
  384. g_sw = sw;
  385. ksync_unlock();
  386. sysfs_notify(g_pKoFirmware, NULL, "version");
  387. // KALERT("%s: TivaCmdGetFirmwareVersion: HW %d, SW: %d\n", __FUNCTION__, g_hw, g_sw);
  388. g_bHasFwVersion = true;
  389. }
  390. else
  391. {
  392. if(_IS_REVIVE_STATE(ret))
  393. {
  394. KALERT("%s: TivaCmdGetFirmwareVersion failed: %d - call TivaRevive\n", __FUNCTION__, ret);
  395. TivaRevive(pfSpiDev);
  396. }
  397. break;
  398. }
  399. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  400. }
  401. /////////////////////////////////////////////////////////////////
  402. // ADC
  403. if((ret = TivaCmdGetADC(pfSpiDev, &tadc)) == 0)
  404. {
  405. bool bModified = false;
  406. if(g_tadc.UVers != tadc.UVers)
  407. {
  408. ksync_lock();
  409. g_tadc.UVers = tadc.UVers;
  410. ksync_unlock();
  411. bModified = true;
  412. sysfs_notify(g_pKoADC, NULL, "UVers");
  413. }
  414. if(g_tadc.UBatV3 != tadc.UBatV3)
  415. {
  416. ksync_lock();
  417. g_tadc.UBatV3 = tadc.UBatV3;
  418. ksync_unlock();
  419. bModified = true;
  420. sysfs_notify(g_pKoADC, NULL, "UBatV3");
  421. }
  422. if(g_tadc.Temp != tadc.Temp)
  423. {
  424. ksync_lock();
  425. g_tadc.Temp = tadc.Temp;
  426. ksync_unlock();
  427. bModified = true;
  428. sysfs_notify(g_pKoADC, NULL, "TempBoard");
  429. }
  430. if(g_tadc.UV5Vsys != tadc.UV5Vsys)
  431. {
  432. ksync_lock();
  433. g_tadc.UV5Vsys = tadc.UV5Vsys;
  434. ksync_unlock();
  435. bModified = true;
  436. sysfs_notify(g_pKoADC, NULL, "UV5Vsys");
  437. }
  438. if(g_tadc.UV3V6Bat != tadc.UV3V6Bat)
  439. {
  440. ksync_lock();
  441. g_tadc.UV3V6Bat = tadc.UV3V6Bat;
  442. ksync_unlock();
  443. bModified = true;
  444. sysfs_notify(g_pKoADC, NULL, "UV3V6Bat");
  445. }
  446. if(g_tadc.TempTIVA != tadc.TempTIVA)
  447. {
  448. ksync_lock();
  449. g_tadc.TempTIVA = tadc.TempTIVA;
  450. ksync_unlock();
  451. bModified = true;
  452. sysfs_notify(g_pKoADC, NULL, "TempTIVA");
  453. }
  454. if(bModified) // if any of the ADC values have changed, signal the binary file
  455. {
  456. sysfs_notify(g_pKoADC, NULL, "AdcBin");
  457. }
  458. }
  459. else if(_IS_REVIVE_STATE(ret))
  460. {
  461. KALERT("%s: TivaCmdGetADC failed: %d - call TivaRevive\n", __FUNCTION__, ret);
  462. TivaRevive(pfSpiDev);
  463. }
  464. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  465. /////////////////////////////////////////////////////////////////
  466. if((ret = TivaCmdGetUptime(pfSpiDev, &nUpTime)) == 0)
  467. {
  468. if(g_nUpTime != nUpTime)
  469. {
  470. ksync_lock();
  471. g_nUpTime = nUpTime;
  472. ksync_unlock();
  473. sysfs_notify(g_pKoTiva, NULL, "uptime");
  474. }
  475. }
  476. else if(_IS_REVIVE_STATE(ret))
  477. {
  478. KALERT("%s: TivaCmdGetUptime failed: %d - call TivaRevive\n", __FUNCTION__, ret);
  479. TivaRevive(pfSpiDev);
  480. }
  481. ksync_sleep_jiffies(_SLEEP_DELAY_JIFFIES);
  482. /////////////////////////////////////////////////////////////////
  483. #endif // _SITARA_EGGELSBERG
  484. if((ret = TivaCmdGetStatus(pfSpiDev, &stat)) == 0)
  485. {
  486. }
  487. else if(_IS_REVIVE_STATE(ret))
  488. {
  489. #if !_SITARA_EGGELSBERG
  490. KALERT("%s: TivaCmdGetStatus failed: %d - call TivaRevive\n", __FUNCTION__, ret);
  491. TivaRevive(pfSpiDev);
  492. #endif // _SITARA_EGGELSBERG
  493. }
  494. /////////////////////////////////////////////////////////////////
  495. // KALERT("Worker pass - jiffies: %ld - status: 0x%02hhX\n", _JIFFY_DIFF(jiffies, start), stat);
  496. }
  497. while(0);
  498. kf_close(pfSpiDev);
  499. }
  500. else
  501. {
  502. KALERT("%s: kf_open_locked failed\n", __FUNCTION__);
  503. }
  504. if(_GetTimerRunning())
  505. {
  506. ksync_lock();
  507. mod_timer(&g_timer_list, _TIMER_INTERVAL);
  508. ksync_unlock();
  509. }
  510. }
  511. /////////////////////////////////////////////////////////////////////////////
  512. static int drv_init(void)
  513. {
  514. /////////////////////////////////////////////////////////////////////////
  515. do
  516. {
  517. if(!(g_pKoGfa = kobject_create_and_add("gfa", NULL)))
  518. {
  519. KALERT("kobject_create_and_add failed\n");
  520. break;
  521. }
  522. if(!(g_pKoTiva = kobject_create_and_add("tiva", g_pKoGfa)))
  523. {
  524. KALERT("kobject_create_and_add failed\n");
  525. break;
  526. }
  527. if(!(g_pKoBacklight = kobject_create_and_add("backlight", g_pKoTiva)))
  528. {
  529. KALERT("kobject_create_and_add failed\n");
  530. break;
  531. }
  532. if(!(g_pKoADC = kobject_create_and_add("adc", g_pKoTiva)))
  533. {
  534. KALERT("kobject_create_and_add failed\n");
  535. break;
  536. }
  537. if(!(g_pKoFirmware = kobject_create_and_add("firmware", g_pKoTiva)))
  538. {
  539. KALERT("kobject_create_and_add failed\n");
  540. break;
  541. }
  542. if(!(g_pKoMem = kobject_create_and_add("mem", g_pKoTiva)))
  543. {
  544. KALERT("kobject_create_and_add failed\n");
  545. break;
  546. }
  547. if(!(g_pKoRtc = kobject_create_and_add("rtc", g_pKoTiva)))
  548. {
  549. KALERT("kobject_create_and_add failed\n");
  550. break;
  551. }
  552. /////////////////////////////////////////////////////////////////////
  553. // generic
  554. if(sysfs_create_file(g_pKoTiva, &g_tivaDevIdAtt.attr))
  555. {
  556. KALERT("sysfs_create_file failed\n");
  557. break;
  558. }
  559. if(sysfs_create_file(g_pKoTiva, &g_tivaUptimeAtt.attr))
  560. {
  561. KALERT("sysfs_create_file failed\n");
  562. break;
  563. }
  564. /////////////////////////////////////////////////////////////////////
  565. // firmware
  566. if(sysfs_create_file(g_pKoFirmware, &g_tivaVersionAtt.attr))
  567. {
  568. KALERT("sysfs_create_file failed\n");
  569. break;
  570. }
  571. if(SfAttInit())
  572. {
  573. if(sysfs_create_bin_file(g_pKoFirmware, &g_tivaFwImageAtt))
  574. {
  575. KALERT("sysfs_create_file failed\n");
  576. break;
  577. }
  578. }
  579. /////////////////////////////////////////////////////////////////////
  580. // backlight
  581. if(sysfs_create_file(g_pKoBacklight, &g_tivaDutyCycleAtt.attr))
  582. {
  583. KALERT("sysfs_create_file failed\n");
  584. break;
  585. }
  586. if(sysfs_create_file(g_pKoBacklight, &g_tivaPeriodAtt.attr))
  587. {
  588. KALERT("sysfs_create_file failed\n");
  589. break;
  590. }
  591. /////////////////////////////////////////////////////////////////////
  592. // ADC
  593. if(sysfs_create_file(g_pKoADC, &g_tivaUVersAtt.attr))
  594. {
  595. KALERT("sysfs_create_file failed\n");
  596. break;
  597. }
  598. if(sysfs_create_file(g_pKoADC, &g_tivaUBatV3Att.attr))
  599. {
  600. KALERT("sysfs_create_file failed\n");
  601. break;
  602. }
  603. if(sysfs_create_file(g_pKoADC, &g_tivaTempAtt.attr))
  604. {
  605. KALERT("sysfs_create_file failed\n");
  606. break;
  607. }
  608. if(sysfs_create_file(g_pKoADC, &g_tivaUV5VsysAtt.attr))
  609. {
  610. KALERT("sysfs_create_file failed\n");
  611. break;
  612. }
  613. if(sysfs_create_file(g_pKoADC, &g_tivaUV3V6BatAtt.attr))
  614. {
  615. KALERT("sysfs_create_file failed\n");
  616. break;
  617. }
  618. if(sysfs_create_file(g_pKoADC, &g_tivaTempTIVAAtt.attr))
  619. {
  620. KALERT("sysfs_create_file failed\n");
  621. break;
  622. }
  623. if(sysfs_create_bin_file(g_pKoADC, &g_tivaAdcBinAtt))
  624. {
  625. KALERT("sysfs_create_file failed\n");
  626. break;
  627. }
  628. /////////////////////////////////////////////////////////////////////
  629. // Memory
  630. if(sysfs_create_bin_file(g_pKoMem, &g_tivaMemory))
  631. {
  632. KALERT("sysfs_create_file failed\n");
  633. break;
  634. }
  635. if(sysfs_create_file(g_pKoMem, &g_tivaMemMap.attr))
  636. {
  637. KALERT("sysfs_create_file failed\n");
  638. break;
  639. }
  640. /////////////////////////////////////////////////////////////////////
  641. // RTC
  642. if(sysfs_create_file(g_pKoRtc, &g_tivaRtcIso8601.attr))
  643. {
  644. KALERT("sysfs_create_file failed\n");
  645. break;
  646. }
  647. if(sysfs_create_bin_file(g_pKoRtc, &g_tivaRtcUnTsBin64))
  648. {
  649. KALERT("sysfs_create_file failed\n");
  650. break;
  651. }
  652. if(sysfs_create_file(g_pKoRtc, &g_tivaRtcCtrl.attr))
  653. {
  654. KALERT("sysfs_create_file failed\n");
  655. break;
  656. }
  657. if(sysfs_create_file(g_pKoRtc, &g_tivaRtcType.attr))
  658. {
  659. KALERT("sysfs_create_file failed\n");
  660. break;
  661. }
  662. /////////////////////////////////////////////////////////////////////
  663. if(!(g_pwq = create_workqueue("GfaWrk")))
  664. {
  665. KALERT("create_workqueue failed!\n");
  666. break;
  667. }
  668. /////////////////////////////////////////////////////////////////////
  669. init_timer(&g_timer_list);
  670. g_timer_list.function = _WorkScheduler;
  671. g_timer_list.data = 0;
  672. g_timer_list.expires = _TIMER_INTERVAL;
  673. add_timer(&g_timer_list);
  674. _SetTimerRunning(true);
  675. /////////////////////////////////////////////////////////////////////
  676. _SetSysFsRunning(true);
  677. if(!queue_work(g_pwq, &g_sysFsWorkObj))
  678. {
  679. KALERT("%s: queue_work failed\n", __FUNCTION__);
  680. break;
  681. }
  682. /////////////////////////////////////////////////////////////////////
  683. KALERT("%s, Ctx: \"%s\"-(%d), HZ: %d\n", __FUNCTION__, current->comm, current->pid, HZ);
  684. return 0;
  685. }
  686. while(0);
  687. /////////////////////////////////////////////////////////////////////////
  688. _SetSysFsRunning(false);
  689. if(_GetTimerRunning())
  690. {
  691. _SetTimerRunning(false);
  692. del_timer_sync(&g_timer_list);
  693. }
  694. if(g_pwq)
  695. {
  696. destroy_workqueue(g_pwq);
  697. g_pwq = NULL;
  698. }
  699. SfAttExit();
  700. if(g_pKoRtc)
  701. {
  702. sysfs_remove_file(g_pKoRtc, &g_tivaRtcType.attr);
  703. sysfs_remove_file(g_pKoRtc, &g_tivaRtcCtrl.attr);
  704. sysfs_remove_bin_file(g_pKoRtc, &g_tivaRtcUnTsBin64);
  705. sysfs_remove_file(g_pKoRtc, &g_tivaRtcIso8601.attr);
  706. kobject_put(g_pKoRtc);
  707. g_pKoRtc = NULL;
  708. }
  709. if(g_pKoMem)
  710. {
  711. sysfs_remove_file(g_pKoMem, &g_tivaMemMap.attr);
  712. sysfs_remove_bin_file(g_pKoMem, &g_tivaMemory);
  713. kobject_put(g_pKoMem);
  714. g_pKoMem = NULL;
  715. }
  716. if(g_pKoFirmware)
  717. {
  718. sysfs_remove_bin_file(g_pKoFirmware, &g_tivaFwImageAtt);
  719. sysfs_remove_file(g_pKoFirmware, &g_tivaVersionAtt.attr);
  720. kobject_put(g_pKoFirmware);
  721. g_pKoFirmware = NULL;
  722. }
  723. if(g_pKoADC)
  724. {
  725. sysfs_remove_file(g_pKoADC, &g_tivaUVersAtt.attr);
  726. sysfs_remove_file(g_pKoADC, &g_tivaUBatV3Att.attr);
  727. sysfs_remove_file(g_pKoADC, &g_tivaTempAtt.attr);
  728. sysfs_remove_file(g_pKoADC, &g_tivaUV5VsysAtt.attr);
  729. sysfs_remove_file(g_pKoADC, &g_tivaUV3V6BatAtt.attr);
  730. sysfs_remove_file(g_pKoADC, &g_tivaTempTIVAAtt.attr);
  731. sysfs_remove_bin_file(g_pKoADC, &g_tivaAdcBinAtt);
  732. kobject_put(g_pKoADC);
  733. g_pKoADC = NULL;
  734. }
  735. if(g_pKoBacklight)
  736. {
  737. sysfs_remove_file(g_pKoBacklight, &g_tivaDutyCycleAtt.attr);
  738. sysfs_remove_file(g_pKoBacklight, &g_tivaPeriodAtt.attr);
  739. kobject_put(g_pKoBacklight);
  740. g_pKoBacklight = NULL;
  741. }
  742. if(g_pKoTiva)
  743. {
  744. sysfs_remove_file(g_pKoTiva, &g_tivaUptimeAtt.attr);
  745. sysfs_remove_file(g_pKoTiva, &g_tivaDevIdAtt.attr);
  746. kobject_put(g_pKoTiva);
  747. g_pKoTiva = NULL;
  748. }
  749. if(g_pKoGfa)
  750. {
  751. kobject_put(g_pKoGfa);
  752. g_pKoGfa = NULL;
  753. }
  754. return -ENOMEM;
  755. }
  756. /////////////////////////////////////////////////////////////////////////////
  757. static void drv_exit(void)
  758. {
  759. _SetSysFsRunning(false);
  760. if(_GetTimerRunning())
  761. {
  762. _SetTimerRunning(false);
  763. del_timer_sync(&g_timer_list);
  764. }
  765. if(g_pwq)
  766. {
  767. destroy_workqueue(g_pwq);
  768. g_pwq = NULL;
  769. }
  770. SfAttExit();
  771. if(g_pKoRtc)
  772. {
  773. sysfs_remove_file(g_pKoRtc, &g_tivaRtcType.attr);
  774. sysfs_remove_file(g_pKoRtc, &g_tivaRtcCtrl.attr);
  775. sysfs_remove_bin_file(g_pKoRtc, &g_tivaRtcUnTsBin64);
  776. sysfs_remove_file(g_pKoRtc, &g_tivaRtcIso8601.attr);
  777. kobject_put(g_pKoRtc);
  778. g_pKoRtc = NULL;
  779. }
  780. if(g_pKoMem)
  781. {
  782. sysfs_remove_file(g_pKoMem, &g_tivaMemMap.attr);
  783. sysfs_remove_bin_file(g_pKoMem, &g_tivaMemory);
  784. kobject_put(g_pKoMem);
  785. g_pKoMem = NULL;
  786. }
  787. if(g_pKoFirmware)
  788. {
  789. sysfs_remove_bin_file(g_pKoFirmware, &g_tivaFwImageAtt);
  790. sysfs_remove_file(g_pKoFirmware, &g_tivaVersionAtt.attr);
  791. kobject_put(g_pKoFirmware);
  792. g_pKoFirmware = NULL;
  793. }
  794. if(g_pKoADC)
  795. {
  796. sysfs_remove_file(g_pKoADC, &g_tivaUVersAtt.attr);
  797. sysfs_remove_file(g_pKoADC, &g_tivaUBatV3Att.attr);
  798. sysfs_remove_file(g_pKoADC, &g_tivaTempAtt.attr);
  799. sysfs_remove_file(g_pKoADC, &g_tivaUV5VsysAtt.attr);
  800. sysfs_remove_file(g_pKoADC, &g_tivaUV3V6BatAtt.attr);
  801. sysfs_remove_file(g_pKoADC, &g_tivaTempTIVAAtt.attr);
  802. sysfs_remove_bin_file(g_pKoADC, &g_tivaAdcBinAtt);
  803. kobject_put(g_pKoADC);
  804. g_pKoADC = NULL;
  805. }
  806. if(g_pKoBacklight)
  807. {
  808. sysfs_remove_file(g_pKoBacklight, &g_tivaDutyCycleAtt.attr);
  809. sysfs_remove_file(g_pKoBacklight, &g_tivaPeriodAtt.attr);
  810. kobject_put(g_pKoBacklight);
  811. g_pKoBacklight = NULL;
  812. }
  813. if(g_pKoTiva)
  814. {
  815. sysfs_remove_file(g_pKoTiva, &g_tivaUptimeAtt.attr);
  816. sysfs_remove_file(g_pKoTiva, &g_tivaDevIdAtt.attr);
  817. kobject_put(g_pKoTiva);
  818. g_pKoTiva = NULL;
  819. }
  820. if(g_pKoGfa)
  821. kobject_put(g_pKoGfa);
  822. KALERT("%s, Ctx: \"%s\"-(%d)\n", __FUNCTION__, current->comm, current->pid);
  823. }
  824. /////////////////////////////////////////////////////////////////////////////
  825. module_init(drv_init);
  826. module_exit(drv_exit);