rtos_lib.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450
  1. #include <sys/time.h>
  2. #include <time.h>
  3. #include "rtos_lib.h"
  4. #include "gd_timer.h"
  5. #include "gm_debug.h"
  6. #include "rtthread.h"
  7. #include "shell.h"
  8. #ifdef RT_USING_FINSH
  9. #include "shell.h"
  10. #endif
  11. //#define CACHE_MEM_MANAGE
  12. #define CACHE_MEM_SIZE 0x200000//1152k
  13. #define CACHE_DSP_SIZE 0x330000//3168k
  14. #define CACHE_LINE_SIZE 32
  15. #define CACHE_LINE_MASK ~(CACHE_LINE_SIZE - 1)
  16. static int cache_check_end = 0;
  17. static int cache_check_start = 1;
  18. //static int cache_check_fail_halt = 0;
  19. void RTOS_MMU_ChangeMapEntry(U32 vaddrStart, U32 vaddrEnd, U32 paddrStart, U32 attr);
  20. static inline void __delay(int loops);
  21. u32 cpu_cpsr;
  22. #define HZ RT_TICK_PER_SECOND
  23. #define LPS_PREC 8
  24. #define jiffies raid6_jiffies()
  25. static inline void __delay(int loops)
  26. {
  27. return;
  28. }
  29. static inline unsigned int raid6_jiffies(void)
  30. {
  31. //struct timeval tv;
  32. //gettimeofday(&tv, NULL);
  33. //return tv.tv_sec*1000 + tv.tv_usec/1000;
  34. return rt_tick_get()*1000;
  35. }
  36. static unsigned long calibrate_delay_converge(void)
  37. {
  38. /* First stage - slowly accelerate to find initial bounds */
  39. unsigned long lpj, lpj_base, ticks, loopadd, loopadd_base, chop_limit;
  40. int trials = 0, band = 0, trial_in_band = 0;
  41. lpj = (1<<12);
  42. /* wait for "start of" clock tick */
  43. ticks = jiffies;
  44. while (ticks == jiffies)
  45. ; /* nothing */
  46. /* Go .. */
  47. ticks = jiffies;
  48. do {
  49. if (++trial_in_band == (1<<band)) {
  50. ++band;
  51. trial_in_band = 0;
  52. }
  53. __delay(lpj * band);
  54. trials += band;
  55. } while (ticks == jiffies);
  56. /*
  57. * We overshot, so retreat to a clear underestimate. Then estimate
  58. * the largest likely undershoot. This defines our chop bounds.
  59. */
  60. trials -= band;
  61. loopadd_base = lpj * band;
  62. lpj_base = lpj * trials;
  63. recalibrate:
  64. lpj = lpj_base;
  65. loopadd = loopadd_base;
  66. /*
  67. * Do a binary approximation to get lpj set to
  68. * equal one clock (up to LPS_PREC bits)
  69. */
  70. chop_limit = lpj >> LPS_PREC;
  71. while (loopadd > chop_limit) {
  72. lpj += loopadd;
  73. ticks = jiffies;
  74. while (ticks == jiffies)
  75. ; /* nothing */
  76. ticks = jiffies;
  77. __delay(lpj);
  78. if (jiffies != ticks) /* longer than 1 tick */
  79. lpj -= loopadd;
  80. loopadd >>= 1;
  81. }
  82. /*
  83. * If we incremented every single time possible, presume we've
  84. * massively underestimated initially, and retry with a higher
  85. * start, and larger range. (Only seen on x86_64, due to SMIs)
  86. */
  87. if (lpj + loopadd * 2 == lpj_base + loopadd_base * 2) {
  88. lpj_base = lpj;
  89. loopadd_base <<= 2;
  90. goto recalibrate;
  91. }
  92. return lpj;
  93. }
  94. void RTOS_Jiffies()
  95. {
  96. unsigned long lpj;
  97. lpj = calibrate_delay_converge();
  98. rt_kprintf("Calibrating delay loop... %lu.%02lu BogoMIPS (lpj=%lu)\n",
  99. lpj/(500000/HZ),
  100. (lpj/(5000/HZ)) % 100, lpj);
  101. }
  102. void gk7101_setting_pll()
  103. {
  104. int i = 0;
  105. *((volatile U32 *)0x70170000) = 0x01202e01;
  106. *((volatile U32 *)0x70170004) = 0x00000000;
  107. *((volatile U32 *)0x7017000C) = 0x0000000c;
  108. *((volatile U32 *)0x70170014) = 0x01202401;
  109. *((volatile U32 *)0x70170018) = 0x00000000;
  110. *((volatile U32 *)0x7017001C) = 0x00000001;
  111. *((volatile U32 *)0x70170024) = 0x02406301;
  112. *((volatile U32 *)0x70170028) = 0x00000000;
  113. *((volatile U32 *)0x70170030) = 0x00000000;
  114. *((volatile U32 *)0x70170034) = 0x00000000;
  115. *((volatile U32 *)0x70170038) = 0x00000001;
  116. *((volatile U32 *)0x7017003C) = 0x00000008;
  117. *((volatile U32 *)0x7017004C) = 0x00000001;
  118. *((volatile U32 *)0x70170050) = 0x00000001;
  119. *((volatile U32 *)0x70170054) = 0x01202001;
  120. *((volatile U32 *)0x70170058) = 0x00c49ba5;
  121. *((volatile U32 *)0x7017005C) = 0x00000008;
  122. *((volatile U32 *)0x70170060) = 0x00000001;
  123. *((volatile U32 *)0x70170068) = 0x00000002;
  124. *((volatile U32 *)0x70170080) = 0x00206978;
  125. *((volatile U32 *)0x70170084) = 0x00000020;
  126. *((volatile U32 *)0x7017008C) = 0x0000000f;
  127. *((volatile U32 *)0x7017009C) = 0x00000002;
  128. *((volatile U32 *)0x701700A0) = 0x00000010;
  129. *((volatile U32 *)0x701700BC) = 0x00000001;
  130. *((volatile U32 *)0x701700E4) = 0x01203201;
  131. *((volatile U32 *)0x701700E8) = 0x00000000;
  132. *((volatile U32 *)0x701700EC) = 0x00000008;
  133. *((volatile U32 *)0x70170100) = 0x00000030;
  134. *((volatile U32 *)0x70170108) = 0x00000030;
  135. *((volatile U32 *)0x70170118) = 0x00000002;
  136. *((volatile U32 *)0x7017011C) = 0x00000030;
  137. *((volatile U32 *)0x70170124) = 0x00000030;
  138. *((volatile U32 *)0x70170130) = 0x00000030;
  139. *((volatile U32 *)0x70170148) = 0x00000001;
  140. *((volatile U32 *)0x70170198) = 0x00000000;
  141. *((volatile U32 *)0x7017019C) = 0x00000000;
  142. *((volatile U32 *)0x701701E0) = 0x00000000;
  143. *((volatile U32 *)0x701701E4) = 0x00000000;
  144. *((volatile U32 *)0x701701F4) = 0x00000002;
  145. *((volatile U32 *)0x701701FC) = 0x00000021;
  146. *((volatile U32 *)0x70170200) = 0x00000022;
  147. *((volatile U32 *)0x70170214) = 0x00000022;
  148. #if 0
  149. *((volatile U32 *)0x7017021C) = 0x00000000;
  150. *((volatile U32 *)0x70170228) = 0x00000000;
  151. *((volatile U32 *)0x7017022C) = 0x00000000;
  152. #endif
  153. for(i=0; i<14; i++)
  154. {
  155. *((volatile U32 *)((U32)0x70170230 + i*4)) = 0x11111111;
  156. }
  157. #if 0
  158. *((volatile U32 *)0x70170270) = 0x00000000;
  159. #endif
  160. *(volatile U32 *)(0x70009100+20*4) = (1<<8);
  161. *(volatile U32 *)(0x70009200+7*4) = 20;
  162. *(volatile U32 *)(0x70009100+22*4) = 9;
  163. }
  164. //-------------------------------------------------------
  165. #if 0
  166. rt_inline unsigned int rt_list_len(const rt_list_t *l)
  167. {
  168. unsigned int len = 0;
  169. const rt_list_t *p = l;
  170. while (p->next != l)
  171. {
  172. p = p->next;
  173. len ++;
  174. }
  175. return len;
  176. }
  177. #endif
  178. static void show_wait_queue(struct rt_list_node *list)
  179. {
  180. struct rt_thread *thread;
  181. struct rt_list_node *node;
  182. for (node = list->next; node != list; node = node->next)
  183. {
  184. thread = rt_list_entry(node, struct rt_thread, tlist);
  185. rt_kprintf("%s", thread->name);
  186. if (node->next != list)
  187. rt_kprintf("/");
  188. }
  189. }
  190. void rtos_cache_inv_range(void *addr, unsigned int size)
  191. {
  192. u32 vstart;
  193. u32 vend;
  194. u32 addr_tmp;
  195. vstart = (u32)addr & CACHE_LINE_MASK;
  196. vend = ((u32)addr + size + CACHE_LINE_SIZE - 1) & CACHE_LINE_MASK;
  197. if (cache_check_start && (vstart != (u32)addr)) {
  198. return;
  199. }
  200. if (cache_check_end && (vend != ((u32)addr + size))) {
  201. return;
  202. }
  203. for (addr_tmp = vstart; addr_tmp < vend; addr_tmp += CACHE_LINE_SIZE) {
  204. __asm__ __volatile__ (
  205. "mcr p15, 0, %0, c7, c6, 1" : : "r" (addr_tmp));
  206. }
  207. dsb();
  208. }
  209. void rtos_cache_clean_range(void *addr, unsigned int size)
  210. {
  211. u32 vstart;
  212. u32 vend;
  213. u32 addr_tmp;
  214. vstart = (u32)addr & CACHE_LINE_MASK;
  215. vend = ((u32)addr + size + CACHE_LINE_SIZE - 1) & CACHE_LINE_MASK;
  216. if (cache_check_start && (vstart != (u32)addr)) {
  217. return;
  218. }
  219. if (cache_check_end && (vend != ((u32)addr + size))) {
  220. return;
  221. }
  222. for (addr_tmp = vstart; addr_tmp < vend; addr_tmp += CACHE_LINE_SIZE) {
  223. __asm__ __volatile__ (
  224. "mcr p15, 0, %0, c7, c10, 1" : : "r" (addr_tmp));
  225. }
  226. dsb();
  227. }
  228. U32 RTOS_EnterCriticalSection( void )
  229. {
  230. #if 0
  231. /*lint -save -e529 */
  232. U32 old_flags = 0;
  233. U32 new_flags = 0;
  234. #if defined(_ARM) && !defined(__GNUC__) && !defined(__polyspace__)
  235. __asm { mrs old_flags,cpsr }
  236. __asm { orr new_flags,old_flags,#0xC0 }
  237. __asm { msr cpsr_c,new_flags }
  238. #endif
  239. #if defined(_ARM) && defined(__GNUC__) && !defined(__polyspace__)
  240. asm volatile( "mrs %0,cpsr" : "=r"(old_flags) : "r"(new_flags) );
  241. asm volatile( "orr %0,%1,#0xC0" : "=r"(new_flags) : "r"(old_flags) );
  242. asm volatile( "msr cpsr_c,%0" : : "r"(new_flags) );
  243. #endif
  244. #if defined(_ARC) && !defined(__polyspace__)
  245. old_flags = _lr(0);
  246. _flag(0);
  247. #endif
  248. return( old_flags );
  249. #else
  250. return (U32)rt_hw_interrupt_disable();
  251. #endif
  252. /*lint -restore */
  253. }
  254. void RTOS_LeaveCriticalSection( U32 cpuStatus )
  255. {
  256. #if 0
  257. /*lint -save -e715 */
  258. #if defined(_ARM) && !defined(__GNUC__) && !defined(__polyspace__)
  259. __asm { msr cpsr_c,cpuStatus }
  260. #endif
  261. #if defined(_ARM) && defined(__GNUC__) && !defined(__polyspace__)
  262. asm volatile ( "msr cpsr_c,%0" : : "r"(cpuStatus) );
  263. #endif
  264. #if defined(_ARC) && !defined(__polyspace__)
  265. cpuStatus &= 0x0C000000;
  266. _flag( cpuStatus >> 25 );
  267. #endif
  268. #else
  269. rt_hw_interrupt_enable(cpuStatus);
  270. #endif
  271. /*lint -restore */
  272. }
  273. void RTOS_Halt( void )
  274. {
  275. RTOS_EnterCriticalSection();
  276. }
  277. //-------------------------------------------------------------
  278. RTOS_Memory RTOS_MemorySet( RTOS_Memory mem, U8 value, RTOS_Size bytes )
  279. {
  280. if( ( mem == (RTOS_Memory)0 ) || ( bytes == 0 ) )
  281. return( (RTOS_Memory)0 );
  282. #if 0
  283. return rt_memset(mem,value,bytes);
  284. #else// use libc 's memset to improve performance.
  285. return memset(mem,value,bytes);
  286. #endif
  287. }
  288. RTOS_Memory RTOS_Malloc( RTOS_Size bytes)
  289. {
  290. return rt_malloc(bytes);
  291. }
  292. RTOS_Memory RTOS_Realloc( RTOS_Memory addr, RTOS_Size bytes )
  293. {
  294. return rt_realloc(addr, bytes);
  295. }
  296. char * RTOS_ThreadGetSelfName(void);
  297. RTOS_Memory RTOS_MemoryAllocate( RTOS_Size bytes, RTOS_Flag shared )
  298. {
  299. //if (bytes >= 0x10000)
  300. // printf("RTOS_MemoryAllocate: %d(%s)\n",bytes, RTOS_ThreadGetSelfName());
  301. return rt_malloc(bytes);
  302. }
  303. RTOS_Status RTOS_MemoryRelease( RTOS_Memory memory )
  304. {
  305. if(memory) rt_free(memory);
  306. return 0;
  307. }
  308. RTOS_Memory RTOS_SysMemoryAllocate( RTOS_Size bytes, RTOS_Flag shared )
  309. {
  310. #ifndef CACHE_MEM_MANAGE
  311. return (RTOS_Memory)rt_malloc(bytes);
  312. #else
  313. return (RTOS_Memory)rt_dspmem_malloc(bytes);
  314. #endif
  315. }
  316. RTOS_Status RTOS_SysMemoryRelease( RTOS_Memory memory )
  317. {
  318. if(memory)
  319. #ifndef CACHE_MEM_MANAGE
  320. rt_free(memory);
  321. #else
  322. rt_dspmem_free(memory);
  323. #endif
  324. return 0;
  325. }
  326. RTOS_Memory RTOS_KernelMemoryAllocate( RTOS_Size bytes)
  327. {
  328. return (RTOS_Memory)RT_KERNEL_MALLOC(bytes);
  329. }
  330. RTOS_Status RTOS_KernelMemoryRelease( RTOS_Memory memory )
  331. {
  332. if(memory)
  333. RT_KERNEL_FREE(memory);
  334. return 0;
  335. }
  336. void RTOS_GetMemInfo( RTOS_Size *Cache_memory, RTOS_Size *Uncache_memory)
  337. {
  338. rt_uint32_t total,used,max_used;
  339. rt_memory_info(&total,&used,&max_used);
  340. *Cache_memory = total;
  341. *Uncache_memory = 0;
  342. #ifdef CACHE_MEM_MANAGE
  343. rt_cache_memory_info(&total,&used,&max_used);
  344. *Uncache_memory = total;
  345. #endif
  346. }
  347. void RTOS_HeapMemoryReport( void )
  348. {
  349. rt_uint32_t total,used,max_used;
  350. rt_memory_info(&total,&used,&max_used);
  351. rt_kprintf("Heap Memory Info [cache memory]\n");
  352. rt_kprintf("total memory: %d KBytes,%d Btyes\n", total/1024,total);
  353. rt_kprintf("used memory : %d KBytes,%d Btyes\n", used/1024,used);
  354. rt_kprintf("maximum allocated memory: %d KBytes,%d Btyes\n", max_used/1024,max_used);
  355. }
  356. void RTOS_SysMemoryReport( void )
  357. {
  358. #ifdef CACHE_MEM_MANAGE
  359. rt_uint32_t total,used,max_used;
  360. rt_cache_memory_info(&total,&used,&max_used);
  361. rt_kprintf("Sys Memory Info [cache memory]\n");
  362. rt_kprintf("total memory: %d KBytes\n", total/1024);
  363. rt_kprintf("used memory : %d KBytes\n", used/1024);
  364. rt_kprintf("maximum allocated memory: %d KBytes\n", max_used/1024);
  365. rt_dspmem_memory_info(&total,&used,&max_used);
  366. rt_kprintf("Drv Memory Info [uncache memory]\n");
  367. rt_kprintf("total memory: %d KBytes\n", total/1024);
  368. rt_kprintf("used memory : %d KBytes\n", used/1024);
  369. rt_kprintf("maximum allocated memory: %d KBytes\n", max_used/1024);
  370. #endif
  371. }
  372. RTOS_Memory RTOS_MemoryCopy( RTOS_Memory dst, RTOS_Memory src, RTOS_Size bytes )
  373. {
  374. #if 0
  375. U8* dstArray = (U8*)dst;
  376. U8* srcArray = (U8*)src;
  377. RTOS_Size index;
  378. if( ( dst == (RTOS_Memory)0 ) || ( bytes == 0 ) )
  379. return( (RTOS_Memory)0 );
  380. for( index=0; index < bytes; index++ )
  381. dstArray[index] = srcArray[index];
  382. return( dst );
  383. #else// use libc 's memcpy to improve performance.
  384. if( ( dst == (RTOS_Memory)0 ) || ( bytes == 0 ) )
  385. return( (RTOS_Memory)0 );
  386. memcpy(dst, src, bytes);
  387. return( dst );
  388. #endif
  389. }
  390. //-------------------------------------------------------------
  391. U32 RTOS_SetThreadName( RTOS_ThreadT threadHandle, const char* optName)
  392. {
  393. rt_base_t level;
  394. level = rt_hw_interrupt_disable();
  395. if(threadHandle)
  396. {
  397. rt_strncpy(((rt_thread_t)threadHandle)->name, optName, RT_NAME_MAX);
  398. }
  399. rt_hw_interrupt_enable(level);
  400. return 0;
  401. }
  402. U32 RTOS_ThreadSetName( RTOS_ThreadT threadHandle, const char* optName)
  403. {
  404. rt_base_t level;
  405. level = rt_hw_interrupt_disable();
  406. if(threadHandle)
  407. {
  408. rt_strncpy(((rt_thread_t)threadHandle)->name, optName, RT_NAME_MAX);
  409. }
  410. rt_hw_interrupt_enable(level);
  411. return 0;
  412. }
  413. char * RTOS_ThreadGetSelfName(void)
  414. {
  415. return rt_thread_self()->name;
  416. }
  417. // thread-safe errno related api functions.
  418. void RTOS_SetErrno(const int err)
  419. {
  420. #if 0
  421. rt_base_t level;
  422. level = rt_hw_interrupt_disable();
  423. rt_thread_t self = rt_thread_self();
  424. self->thr_internal_errno = err;//FIXME(heyong): error is used to errno.
  425. rt_hw_interrupt_enable(level);
  426. //rt_kprintf("RTOS_SetErrno %d\n", err);
  427. #endif
  428. }
  429. int RTOS_GetErrno()
  430. {
  431. int err = 0;
  432. #if 0
  433. rt_base_t level;
  434. level = rt_hw_interrupt_disable();
  435. rt_thread_t self = rt_thread_self();
  436. err = (int)self->thr_internal_errno;//FIXME(heyong): error is used to errno.
  437. rt_hw_interrupt_enable(level);
  438. //rt_kprintf("RTOS_GetErrno %d\n", err);
  439. #endif
  440. return err;
  441. }
  442. RTOS_ThreadT RTOS_CreateThread(
  443. U32* stackBuffer, U32 stackSize, U32 priority,
  444. RTOS_ThreadFunctionT function, void* optArg, void* optData,
  445. const char* optName )
  446. {
  447. rt_thread_t tid;
  448. if (priority < RTOS_ThreadPriorityHighest)
  449. {
  450. priority = RTOS_ThreadPriorityHighest - priority;
  451. }
  452. else
  453. {
  454. priority = 1;
  455. }
  456. tid = rt_thread_create((optName == NULL)?"thread":optName,
  457. function, optArg,
  458. stackSize, priority, THREAD_TIMESLICE);
  459. if (tid != RT_NULL)
  460. {
  461. rt_thread_startup(tid);
  462. }
  463. return (RTOS_ThreadT)tid;
  464. }
  465. U32 RTOS_DestroyThread( RTOS_ThreadT threadHandle )
  466. {
  467. rt_err_t ret = 0;
  468. rt_enter_critical();
  469. ret = rt_thread_delete((rt_thread_t)threadHandle);
  470. rt_exit_critical();
  471. if (RT_EOK == ret)
  472. {
  473. ret = 1;
  474. }
  475. else
  476. {
  477. ret = 0;
  478. }
  479. return ret;
  480. }
  481. U32 RTOS_ThreadDestroy( RTOS_ThreadT threadHandle )
  482. {
  483. rt_err_t ret = 0;
  484. rt_enter_critical();
  485. ret = rt_thread_delete((rt_thread_t)threadHandle);
  486. rt_exit_critical();
  487. if (RT_EOK == ret)
  488. {
  489. ret = 1;
  490. }
  491. else
  492. {
  493. ret = 0;
  494. }
  495. return ret;
  496. }
  497. U32 RTOS_GetThreadPriority(RTOS_ThreadT threadHandle)
  498. {
  499. rt_thread_t tid = (rt_thread_t)threadHandle;
  500. int priority = tid->current_priority;
  501. if (priority < RTOS_ThreadPriorityHighest)
  502. {
  503. priority = RTOS_ThreadPriorityHighest - priority;
  504. }
  505. else
  506. {
  507. priority = 1;
  508. }
  509. return priority;
  510. }
  511. void gkosFinishThread( void )
  512. {
  513. //rt_thread_t t = rt_thread_self();
  514. //rt_thread_detach(t);
  515. }
  516. void RTOS_LockScheduler( void )
  517. {
  518. rt_enter_critical();
  519. }
  520. void RTOS_UnlockScheduler( void )
  521. {
  522. rt_exit_critical();
  523. }
  524. void RTOS_SchedulerLock( void )
  525. {
  526. rt_enter_critical();
  527. }
  528. void RTOS_SchedulerUnlock( void )
  529. {
  530. rt_exit_critical();
  531. }
  532. U32 RTOS_SleepThread( U32 msecs )
  533. {
  534. return rt_thread_delay( msecs ) ;
  535. }
  536. U32 msleep( U32 msecs )
  537. {
  538. return rt_thread_delay( msecs ) ;
  539. }
  540. U32 RTOS_SuspendThread( RTOS_ThreadT threadHandle )
  541. {
  542. return rt_thread_suspend_witch_flag((rt_thread_t)threadHandle, RT_UNINTERRUPTIBLE);
  543. }
  544. U32 RTOS_WakeupThread( RTOS_ThreadT threadHandle )
  545. {
  546. return rt_thread_resume( (rt_thread_t)threadHandle );
  547. }
  548. void thread_statistics()
  549. {
  550. struct rt_thread *thread;
  551. struct rt_list_node *node;
  552. rt_uint8_t *ptr;
  553. rt_base_t level;
  554. struct rt_object_information *information;
  555. information = rt_object_get_information(RT_Object_Class_Thread);
  556. RT_ASSERT(information != RT_NULL);
  557. struct rt_list_node *list = &(information->object_list);
  558. level = rt_hw_interrupt_disable();
  559. for (node = list->next; node != list; node = node->next)
  560. {
  561. thread = rt_list_entry(node, struct rt_thread, list);
  562. //if(thread) thread->total_tick = 0;
  563. }
  564. rt_hw_interrupt_enable(level);
  565. rt_thread_delay(5000);
  566. //not close interrupt to avoid the venc error because the print time is too long.
  567. //level = rt_hw_interrupt_disable();
  568. rt_kprintf(" thread pri status tick cpu%% sp stack addr stack size max used left tick\n");
  569. rt_kprintf("-------------------------------- --- ------- ------ ------- ---------- ---------- ---------- ---------- ---------- \n");
  570. for (node = list->next; node != list; node = node->next)
  571. {
  572. thread = rt_list_entry(node, struct rt_thread, list);
  573. #if 0
  574. rt_kprintf("%-32.*s 0x%02x", RT_NAME_MAX, thread->name, thread->current_priority);
  575. #else
  576. int priority = thread->current_priority;
  577. if (priority < RTOS_ThreadPriorityHighest)
  578. {
  579. priority = RTOS_ThreadPriorityHighest - priority;
  580. }
  581. else
  582. {
  583. priority = 1;
  584. }
  585. rt_kprintf("%-32.*s %3d", RT_NAME_MAX, thread->name, priority);
  586. #endif
  587. if (thread->stat == RT_THREAD_READY) rt_kprintf(" ready");
  588. else if ((thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK) rt_kprintf(" suspend");
  589. else if (thread->stat == RT_THREAD_INIT) rt_kprintf(" init");
  590. else if (thread->stat == RT_THREAD_CLOSE) rt_kprintf(" close");
  591. ptr = (rt_uint8_t*)thread->stack_addr;
  592. while (*ptr == '#')ptr ++;
  593. #if 0
  594. rt_kprintf(" %5d %5.2f%% 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x \n",
  595. thread->total_tick,
  596. ((double)thread->total_tick/50)>=100.00?99.9:((double)thread->total_tick/50),
  597. thread->stack_size + ((rt_uint32_t)thread->stack_addr - (rt_uint32_t)thread->sp),
  598. thread->stack_addr,
  599. thread->stack_size,
  600. thread->stack_size - ((rt_uint32_t) ptr - (rt_uint32_t)thread->stack_addr),
  601. thread->remaining_tick);
  602. #endif
  603. rt_kprintf(" 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x \n",
  604. thread->stack_size + ((rt_uint32_t)thread->stack_addr - (rt_uint32_t)thread->sp),
  605. thread->stack_addr,
  606. thread->stack_size,
  607. thread->stack_size - ((rt_uint32_t) ptr - (rt_uint32_t)thread->stack_addr),
  608. thread->remaining_tick);
  609. }
  610. //rt_hw_interrupt_enable(level);
  611. }
  612. void RTOS_ThreadDisplayStatistics( void )
  613. {
  614. rt_uint32_t total;
  615. rt_uint32_t used;
  616. rt_uint32_t max_used;
  617. rt_memory_info(&total,&used,&max_used);
  618. rt_kprintf("\n memory info size \n");
  619. rt_kprintf("--------------------------------- -------\n");
  620. rt_kprintf("total heap memory : %d(%dKB)\n", total, total/1024);
  621. rt_kprintf("used heap memory : %d(%dKB)\n", used, used/1024);
  622. rt_kprintf("maximum allocated heap memory: %d(%dKB)\n\n", max_used, max_used/1024);
  623. #ifdef CACHE_MEM_MANAGE
  624. rt_cache_memory_info(&total,&used,&max_used);
  625. rt_kprintf("total sys memory : %d(%dKB)\n", total, total/1024);
  626. rt_kprintf("used sys memory : %d(%dKB)\n", used, used/1024);
  627. rt_kprintf("maximum allocated sys memory: %d(%dKB)\n", max_used, max_used/1024);
  628. rt_dspmem_memory_info(&total,&used,&max_used);
  629. rt_kprintf("total drv memory : %d(%dKB)\n", total, total/1024);
  630. rt_kprintf("used drv memory : %d(%dKB)\n", used, used/1024);
  631. rt_kprintf("maximum allocated drv memory: %d(%dKB)\n", max_used, max_used/1024);
  632. #endif
  633. thread_statistics();
  634. return ;
  635. }
  636. U32 RTOS_GetFreeHeapSize()
  637. {
  638. rt_uint32_t total;
  639. rt_uint32_t used;
  640. rt_uint32_t max_used;
  641. rt_memory_info(&total,&used,&max_used);
  642. return (total-used);
  643. }
  644. RTOS_Time RTOS_KernelTimerGetPeriod(void)
  645. {
  646. return (1000 / RT_TICK_PER_SECOND);
  647. }
  648. //-------------------------sem--------------------------
  649. RTOS_SemaphoreT RTOS_CreateSemaphore( U32 initCount )
  650. {
  651. return (RTOS_SemaphoreT)rt_sem_create("sem", initCount, RT_IPC_FLAG_PRIO);
  652. }
  653. U32 RTOS_WaitSemaphore(RTOS_SemaphoreT semaphoreHandle, U32 suspend)
  654. {
  655. if(suspend)
  656. return RTOS_GetSemaphore((RTOS_Semaphore)semaphoreHandle, RTOS_SUSPEND);
  657. else
  658. return RTOS_GetSemaphore((RTOS_Semaphore)semaphoreHandle, RTOS_NO_SUSPEND);
  659. }
  660. U32 RTOS_GetSemaphore( RTOS_SemaphoreT semaphoreHandle,
  661. U32 msecsTimeout )
  662. {
  663. return rt_sem_take((rt_sem_t)semaphoreHandle, msecsTimeout);
  664. }
  665. U32 RTOS_SetSemaphore( RTOS_SemaphoreT semaphoreHandle,
  666. U32 msecsTimeout )
  667. {
  668. return rt_sem_release((rt_sem_t)semaphoreHandle);
  669. }
  670. RTOS_Status RTOS_SemaphoreDestroy( RTOS_Semaphore semaphoreHandle )
  671. {
  672. return rt_sem_delete((rt_sem_t)semaphoreHandle);
  673. }
  674. RTOS_Status RTOS_DestroySemaphore( RTOS_Semaphore semaphoreHandle )
  675. {
  676. return rt_sem_delete((rt_sem_t)semaphoreHandle);
  677. }
  678. S32 RTOS_SemaphoreQuery( RTOS_Semaphore semaphoreHandle )
  679. {
  680. S32 countPtr = 0;
  681. rt_ubase_t level;
  682. level = rt_hw_interrupt_disable();
  683. countPtr = ((rt_sem_t)semaphoreHandle)->value;
  684. rt_hw_interrupt_enable(level);
  685. return (S32)countPtr;
  686. }
  687. //-------------------------timer-------------------------
  688. void GKOS_KernelTimerSetHook(RTOS_HookFunction function)
  689. {
  690. if(gkosHookData)
  691. {
  692. if(gkosHookData->timerFunctionCount < (GKOS_TIMER_HOOK_TABLE_SIZE - 1))
  693. {
  694. gkosHookData->timerFunctionArray[gkosHookData->timerFunctionCount] = function;
  695. gkosHookData->timerFunctionCount ++;
  696. }
  697. }
  698. }
  699. void RTOS_KernelTimerSetHook(RTOS_HookFunction function)
  700. {
  701. GKOS_KernelTimerSetHook(function);
  702. }
  703. //-------------------------mail queue-------------------------
  704. #if 0
  705. RTOS_MailqueueT RTOS_MailqueueCreate( U32 queueElements)
  706. {
  707. struct rt_mailbox *mq;
  708. mq = rt_mb_create("mqt", queueElements, RT_IPC_FLAG_FIFO);
  709. return (RTOS_MailqueueT)mq;
  710. }
  711. #endif
  712. RTOS_MailqueueT RTOS_CreateMailqueue( U32 queueElements, U32 elementBytes )
  713. {
  714. struct rt_mailbox *mq;
  715. mq = rt_mb_create("mqt", queueElements, RT_IPC_FLAG_FIFO);
  716. return (RTOS_MailqueueT)mq;
  717. }
  718. RTOS_Status RTOS_MailqueueSend(RTOS_Mailqueue mailqueue, RTOS_Message data)
  719. {
  720. //rt_kprintf("mail send...0x%x\n", data);
  721. return rt_mb_send((rt_mailbox_t)mailqueue, (rt_uint32_t)data);
  722. }
  723. RTOS_Status RTOS_MailqueueSendTimeout(RTOS_Mailqueue mailqueue, RTOS_Message data, RTOS_Time timeout)
  724. {
  725. //rt_kprintf("mail send...0x%x\n", data);
  726. return rt_mb_send_wait((rt_mailbox_t)mailqueue, (rt_uint32_t)data, timeout);
  727. }
  728. RTOS_Message RTOS_MailqueueWait(RTOS_Mailqueue mailqueue, RTOS_Flag suspend)
  729. {
  730. int ret;
  731. U32 timeout;
  732. U8* messagePtr;
  733. if( suspend )
  734. timeout = RTOS_SUSPEND;
  735. else
  736. timeout = RTOS_NO_SUSPEND;
  737. ret = rt_mb_recv((rt_mailbox_t)mailqueue, (void*)(&messagePtr), timeout);
  738. //rt_kprintf("mail recv [0x%x]...0x%x\n", (U32)timeout, messagePtr);
  739. if(ret != 0)
  740. return NULL;
  741. return (RTOS_Message)messagePtr;
  742. }
  743. RTOS_Message RTOS_MailqueueWaitTimeout( RTOS_Mailqueue mailqueue, RTOS_Time timeout )
  744. {
  745. U8* messagePtr;
  746. int ret;
  747. ret = rt_mb_recv((rt_mailbox_t)mailqueue, (void*)(&messagePtr), timeout);
  748. //rt_kprintf("mail recv [0x%x]...0x%x\n", (U32)timeout, messagePtr);
  749. if(ret != 0)
  750. return NULL;
  751. return (RTOS_Message)messagePtr;
  752. }
  753. U32 RTOS_MailqueueDestroy( RTOS_MailqueueT mailqueuePtr )
  754. {
  755. rt_mb_delete((rt_mailbox_t)mailqueuePtr);
  756. return 0;
  757. }
  758. U32 RTOS_DestroyMailqueue( RTOS_MailqueueT mailqueuePtr )
  759. {
  760. rt_mb_delete((rt_mailbox_t)mailqueuePtr);
  761. return 0;
  762. }
  763. U32 RTOS_GetTimerStamp()
  764. {
  765. return rt_tick_get();
  766. }
  767. /*
  768. *******************************************************************************
  769. **
  770. ** Create a new mutex and initializes it with the given value.
  771. **
  772. *******************************************************************************
  773. */
  774. RTOS_MutexT RTOS_MutexCreate( void )
  775. {
  776. return( (RTOS_MutexT) rt_mutex_create("mutex", RT_IPC_FLAG_FIFO) );
  777. }
  778. /*
  779. *******************************************************************************
  780. **
  781. ** Destroy a given mutex.
  782. **
  783. *******************************************************************************
  784. */
  785. U32 RTOS_MutexDestroy( RTOS_MutexT mutex )
  786. {
  787. return rt_mutex_delete( (rt_mutex_t) mutex );
  788. }
  789. /*
  790. *******************************************************************************
  791. **
  792. ** Query (read) the current value from a given mutex.
  793. **
  794. *******************************************************************************
  795. */
  796. S32 RTOS_MutexQuery( RTOS_MutexT mutex )
  797. {
  798. S32 countPtr = 0;
  799. rt_ubase_t level;
  800. level = rt_hw_interrupt_disable();
  801. countPtr = ((rt_mutex_t)mutex)->value;
  802. rt_hw_interrupt_enable(level);
  803. return countPtr;
  804. }
  805. /*
  806. *******************************************************************************
  807. **
  808. ** Wait and lock a given mutex
  809. **
  810. *******************************************************************************
  811. */
  812. U32 RTOS_MutexLock( RTOS_MutexT mutex, RTOS_Flag suspend )
  813. {
  814. U32 timeout;
  815. if( suspend )
  816. timeout = RTOS_SUSPEND;
  817. else
  818. timeout = RTOS_NO_SUSPEND;
  819. return rt_mutex_take( (rt_mutex_t) mutex, timeout );
  820. }
  821. U32 RTOS_MutexLockTimeout( RTOS_MutexT mutex, U32 timeout )
  822. {
  823. return rt_mutex_take( (rt_mutex_t) mutex, timeout );
  824. }
  825. /*
  826. *******************************************************************************
  827. **
  828. ** Unlock an occupied mutex
  829. **
  830. *******************************************************************************
  831. */
  832. U32 RTOS_MutexUnlock( RTOS_MutexT mutex )
  833. {
  834. return rt_mutex_release( (rt_mutex_t) mutex );
  835. }
  836. //--------------------------------------------------------
  837. RTOS_ThreadT RTOS_ThreadSelf( void )
  838. {
  839. return( (RTOS_ThreadT)rt_thread_self() );
  840. }
  841. //-------------------------------------------------------
  842. extern unsigned char __heap_end__[];
  843. gkosHookDataT HookData;
  844. void RTOS_HwTickInit(void)
  845. {
  846. GD_HANDLE timerHandle;
  847. GBOOL timerFlag;
  848. GERR result;
  849. GD_INT_DisableAllInterrupts();
  850. // only use the os's timers
  851. // RTOS_TIMERTICK_IRQ must use the GD_INT_LOW_PRIORITY mode
  852. GD_INT_SetVector( GD_INT_TIMER1_IRQ, NULL );
  853. result = GD_TIMER_SoftTimerOpen( &timerHandle );
  854. if( result == GD_OK )
  855. {
  856. // modify the hard timer to Timer Tick
  857. result = GD_TIMER_SoftTimerSet( &timerHandle, 1, &timerFlag, NULL );
  858. GD_INT_SetVector( GD_INT_TIMER1_IRQ, rt_tick_increase );
  859. }
  860. int bytes = sizeof(gkosHookDataT);
  861. gkosHookData = &HookData;
  862. memset( gkosHookData, 0, bytes );
  863. }
  864. extern u32 ARM1176_MMU_ttb0[4096];
  865. U32 RTOS_InitKernel(U32 Heap_size)
  866. {
  867. u32 os_end_address=0;
  868. /* disable interrupt first */
  869. rt_hw_interrupt_disable();
  870. /* enable cpu cache */
  871. //rt_hw_cpu_icache_disable();
  872. //mmu_invalidate_icache();
  873. //rt_hw_cpu_icache_enable();
  874. /* initialize hardware interrupt */
  875. rt_hw_interrupt_init();
  876. /* initialize board */
  877. //rt_hw_board_init();
  878. /* show version */
  879. //rt_show_version();
  880. /* initialize tick */
  881. //rt_system_tick_init();
  882. RTOS_HwTickInit();
  883. //rt_kprintf("set tick\n");
  884. /* initialize kernel object */
  885. rt_system_object_init();
  886. /* initialize timer system */
  887. rt_system_timer_init();
  888. /* initialize heap memory system */
  889. os_end_address= (u32)__heap_end__+Heap_size;
  890. #ifdef CACHE_MEM_MANAGE
  891. rt_system_heap_init((void*)__heap_end__, (void*)(os_end_address-CACHE_MEM_SIZE-CACHE_DSP_SIZE));
  892. rt_system_cache_init((void*)(os_end_address-CACHE_MEM_SIZE-CACHE_DSP_SIZE),
  893. (void*)(os_end_address-CACHE_DSP_SIZE));
  894. //cache-buffer for system
  895. #if 0
  896. RTOS_MMU_ChangeMapEntry((U32)(os_end_address-CACHE_MEM_SIZE-CACHE_DSP_SIZE),(U32)os_end_address-CACHE_DSP_SIZE,
  897. (U32)(os_end_address-CACHE_MEM_SIZE), 0x00000DE2);
  898. #endif
  899. rt_system_dspmem_init((void*)(os_end_address-CACHE_DSP_SIZE), (void*)(os_end_address));
  900. //nocache nobuffer
  901. RTOS_MMU_ChangeMapEntry((U32)(os_end_address-CACHE_DSP_SIZE), (U32)os_end_address,
  902. (U32)(os_end_address-CACHE_DSP_SIZE), 0x00000DE2);
  903. /* print mmu table */
  904. //rt_hw_cpu_dump_page_table((rt_uint32_t*)ARM1176_MMU_ttb0);
  905. #else
  906. rt_system_heap_init((void*)__heap_end__, (void*)os_end_address);
  907. #endif
  908. #ifdef RT_USING_MODULE
  909. /* initialize module system*/
  910. rt_system_module_init();
  911. #endif
  912. /* initialize scheduler system */
  913. rt_system_scheduler_init();
  914. return 0;
  915. }
  916. void RTOS_StartMultitasking( void )
  917. {
  918. #ifdef RT_USING_FINSH
  919. /* initialize finsh */
  920. finsh_system_init();
  921. #ifdef RT_USING_DEVICE
  922. finsh_set_device(RT_CONSOLE_DEVICE_NAME);
  923. #endif
  924. #endif
  925. /* initialize system timer thread */
  926. rt_system_timer_thread_init();
  927. /* initialize idle thread */
  928. rt_thread_idle_init();
  929. rt_kprintf("start scheduler\n");
  930. /* start scheduler */
  931. rt_system_scheduler_start();
  932. /* never reach here */
  933. return ;
  934. }
  935. U32 RTOS_GetMailqueue( RTOS_MailqueueT mailqueueHandle,
  936. void* resultBuffer, U32 msecsTimeout )
  937. {
  938. return rt_mb_recv((rt_mailbox_t)mailqueueHandle,(rt_uint32_t*)resultBuffer,
  939. (rt_uint32_t)msecsTimeout);
  940. }
  941. U32 RTOS_SetMailqueue( RTOS_MailqueueT mailqueueHandle,
  942. void* messagePtr, U32 toFront,
  943. U32 msecsTimeout )
  944. {
  945. return rt_mb_send_wait((rt_mailbox_t)mailqueueHandle,
  946. (rt_uint32_t)messagePtr, (rt_uint32_t)msecsTimeout);
  947. }
  948. /*Dummy func of os*/
  949. //-----------------------------cond------------------------------
  950. RTOS_CondT RTOS_CondCreate( void )
  951. {
  952. rt_event_t evt;
  953. evt = rt_event_create("evt", 0);
  954. /* detach the object from system object container */
  955. rt_object_detach(&(evt->parent.parent));
  956. return (RTOS_CondT) evt;
  957. }
  958. RTOS_Status RTOS_CondDestroy( RTOS_CondT cond )
  959. {
  960. rt_err_t result;
  961. if (cond == RT_NULL)
  962. return -2;
  963. result = rt_event_delete((rt_event_t)cond);
  964. if (result != RT_EOK)
  965. return -3;
  966. return( 0 );
  967. }
  968. int _cond_timedwait(RTOS_CondT cond, RTOS_MutexT mutex, U32 timeout)
  969. {
  970. int result;
  971. rt_uint32_t recved = 0XFF;
  972. if (!cond || !mutex)
  973. return -1;
  974. if(RTOS_MutexUnlock(mutex)!=0) return -2;
  975. result = rt_event_recv((rt_event_t)cond, 0x01,RT_EVENT_FLAG_AND|RT_EVENT_FLAG_CLEAR,timeout,&recved);
  976. if(result == -RT_ERROR && recved == 0XFF) // for boardcase event
  977. {
  978. result = RT_EOK;
  979. }
  980. /* lock mutex again */
  981. RTOS_MutexLock(mutex, 1);
  982. return result;
  983. }
  984. RTOS_Status RTOS_CondWait( RTOS_CondT cond, RTOS_MutexT mutex, RTOS_Flag suspend )
  985. {
  986. S32 value = 0;
  987. U32 timeout;
  988. if( suspend )
  989. timeout = RTOS_SUSPEND;
  990. else
  991. timeout = RTOS_NO_SUSPEND;
  992. value = _cond_timedwait( (RTOS_CondT) cond, (RTOS_MutexT) mutex, timeout );
  993. if( value != RT_EOK )
  994. return( -1 );
  995. return( value );
  996. }
  997. RTOS_Status RTOS_CondWaitTimeout( RTOS_CondT cond, RTOS_MutexT mutex, U32 timeout )
  998. {
  999. S32 value = 0;
  1000. value = _cond_timedwait( (RTOS_CondT) cond, (RTOS_MutexT) mutex, timeout );
  1001. if( value != RT_EOK )
  1002. return( -1 );
  1003. return( value );
  1004. }
  1005. RTOS_Status RTOS_CondSignal( RTOS_CondT cond )
  1006. {
  1007. RTOS_Status result;
  1008. result = rt_event_send((rt_event_t)cond,0x01);
  1009. if (result != RT_EOK)
  1010. return -1;
  1011. return 0;
  1012. }
  1013. RTOS_Status RTOS_CondBroadcast( RTOS_CondT cond )
  1014. {
  1015. rt_event_control((rt_event_t)cond,RT_IPC_CMD_RESET,0);
  1016. return 0;
  1017. }
  1018. U32 RTOS_OsType(void)
  1019. {
  1020. return RTOS_RTTHREAD;
  1021. }
  1022. void RTOS_MMU_ChangeMapEntry(U32 vaddrStart, U32 vaddrEnd, U32 paddrStart, U32 attr)
  1023. {
  1024. volatile U32 *pTT;
  1025. volatile int i,nSec;
  1026. extern U32 ARM1176_MMU_ttb0[];
  1027. extern U32 ARM1176_MMU_ttb1[];
  1028. U32* table_ptr = (U32*)ARM1176_MMU_ttb0;
  1029. //printf("mmu table: 0x%x \n", (U32)ARM1176_MMU_ttb0);
  1030. pTT = (U32 *)table_ptr + (vaddrStart>>20);
  1031. nSec = (vaddrEnd>>20) - (vaddrStart>>20);
  1032. //printf("change table: 0x%x -- %d\n", (U32)pTT, nSec);
  1033. for(i=0;i<=nSec;i++)
  1034. {
  1035. *pTT = attr |(((paddrStart>>20)+i)<<20);
  1036. pTT++;
  1037. }
  1038. table_ptr = (U32*)ARM1176_MMU_ttb1;
  1039. //printf("mmu table: 0x%x \n", (U32)ARM1176_MMU_ttb1);
  1040. pTT = (U32 *)table_ptr + (vaddrStart>>20);
  1041. nSec = (vaddrEnd>>20) - (vaddrStart>>20);
  1042. //printf("change table: 0x%x -- %d\n", (U32)pTT, nSec);
  1043. for(i=0;i<=nSec;i++)
  1044. {
  1045. *pTT = attr |(((paddrStart>>20)+i)<<20);
  1046. pTT++;
  1047. }
  1048. }
  1049. int RTOS_thread_yield(void)
  1050. {
  1051. rt_thread_yield();
  1052. return 0;
  1053. }
  1054. unsigned int RTOS_jiffies(void)
  1055. {
  1056. return jiffies;
  1057. }
  1058. RTOS_TimerT RTOS_CreateTimer(U32 isContinouos, RTOS_SemaphoreT fireSemaphore, RTOS_HookFunctionT callbackFunction)
  1059. {
  1060. //U8 name[32];
  1061. //sprintf(name, "timer %X", (U32)callbackFunction);
  1062. if(isContinouos)
  1063. {
  1064. return (RTOS_TimerT)rt_timer_create("timer", callbackFunction, NULL, 0, RT_TIMER_FLAG_PERIODIC);
  1065. }
  1066. else
  1067. {
  1068. return (RTOS_TimerT)rt_timer_create("timer", callbackFunction, NULL, 0, RT_TIMER_FLAG_ONE_SHOT);
  1069. }
  1070. }
  1071. RTOS_TimerT RTOS_CreateTimerEx(const char *name, U8 flag, void *parameter, RTOS_TimerFunctionT callbackFunction)
  1072. {
  1073. U8 timer_flag = 0;
  1074. if(flag & RTOS_TIMER_FLAG_PERIODIC)
  1075. {
  1076. timer_flag = timer_flag | RT_TIMER_FLAG_PERIODIC;
  1077. }
  1078. else
  1079. {
  1080. timer_flag = timer_flag | RT_TIMER_FLAG_ONE_SHOT;
  1081. }
  1082. if(flag & RTOS_TIMER_FLAG_SOFT_TIMER)
  1083. {
  1084. timer_flag = timer_flag | RT_TIMER_FLAG_SOFT_TIMER;
  1085. }
  1086. else
  1087. {
  1088. timer_flag = timer_flag | RT_TIMER_FLAG_SOFT_TIMER;
  1089. }
  1090. return (RTOS_TimerT)rt_timer_create(name, callbackFunction, parameter, 0, timer_flag);
  1091. }
  1092. U32 RTOS_DestroyTimer(RTOS_TimerT timerHandle)
  1093. {
  1094. return rt_timer_delete((rt_timer_t)timerHandle);
  1095. }
  1096. U32 RTOS_StartTimer(RTOS_TimerT timerHandle, U32 fireInterval)
  1097. {
  1098. rt_timer_t handler = (rt_timer_t)timerHandle;
  1099. handler->init_tick = fireInterval;
  1100. return rt_timer_start((rt_timer_t)timerHandle);
  1101. }
  1102. U32 RTOS_StopTimer(RTOS_TimerT timerHandle)
  1103. {
  1104. return rt_timer_stop((rt_timer_t)timerHandle);
  1105. }
  1106. U32 RTOS_ControlTimer(RTOS_TimerT timerHandle, U32 delay_time)
  1107. {
  1108. return rt_timer_control((rt_timer_t)timerHandle, RT_TIMER_CTRL_SET_TIME, &delay_time);
  1109. }
  1110. U32 RTOS_GetTimerStatus(RTOS_TimerT timerHandle)
  1111. {
  1112. rt_timer_t t;
  1113. t = (rt_timer_t)timerHandle;
  1114. if(t->parent.flag & RT_TIMER_FLAG_ACTIVATED)
  1115. {
  1116. return RTOS_TIMER_FLAG_ACTIVATED;
  1117. }
  1118. else
  1119. {
  1120. return RTOS_TIMER_FLAG_DEACTIVATED;
  1121. }
  1122. }
  1123. void *RTOS_timer_get_context(RTOS_TimerT timerHandle)
  1124. {
  1125. rt_timer_t t;
  1126. t = (rt_timer_t)timerHandle;
  1127. return t->parameter;
  1128. }
  1129. int RTOS_Thead_Switch_Priority(int priority)
  1130. {
  1131. if (priority < RTOS_ThreadPriorityHighest)
  1132. {
  1133. priority = RTOS_ThreadPriorityHighest - priority;
  1134. }
  1135. else
  1136. {
  1137. priority = 1;
  1138. }
  1139. return priority;
  1140. }
  1141. void usleep(int micro_sec)
  1142. {
  1143. int ms = micro_sec/1000;
  1144. rt_thread_delay(ms);
  1145. }
  1146. void sleep(int sec)
  1147. {
  1148. rt_thread_delay(sec*1000);
  1149. }