-
Notifications
You must be signed in to change notification settings - Fork 2
/
log200904vimicro.txt
2324 lines (2061 loc) · 103 KB
/
log200904vimicro.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
10:39 2009-4-1
VC0830, SV, <TODO>合并任务</TODO>
0, zouweiran需求, 132-148频率支持1:1, 1:3. 可以通过修改后的命令实现.
1, 切频.
1), 用户输入bus频率和cpu:bus比例. 今天做完.
<TODO>CLKRST_BUS_RATE</TODO>
(1), 本来想是按bus频率排序, 后来发现cpu:bus=3:1的情况通过bus算cpu不好算. 可能需要改pll. 目前数据内部实际是先确定pll频率后确定cpu, bus, vdec, module频率.
可以先列出所需cpu频率, 根据cpu算出pll频率, 默认结构体是pll:cpu:bus=4:2:1.
<TODO></TODO>发现如果切频到pll2容易一些. pll2的cpu, bus都支持6位divider. 12*64=768. 这样pll的组合可以比pll1少. 可以考虑测试就用pll2. 这样外设在pll1连divider都不用改了. 目前结构体还不支持, 也没有切到pll2的流程.
(2),
<TODO></TODO>加上限制条件: cpu不能超过500MHz, sdram 不能超过200MHz. 当cpu超过400, sdram超过180时提示用户.
2), 切到pll2;
2, 明天: 测试测sd卡, support;
3, 应用场景. 负责切频; 原来在fpga下nucleus有自动切频程序, 一个线程统计cpu负载(软件统计), 一个线程读取sdrc寄存器得到sdrc负载. <TODO>看pxa3xx pm方案;看原有VC0830 FPGA方案</TODO>
4, ap下pmu测试.
5, 整理今天会议记录, 重点是进度计划.
1), aiguo希望lingming, zhicheng和zhangjian研究wince.
bamvor: 其实大家一起看看wince也可以, 学习时可以和linux对比.
6, <TODO>任务, 合并任务</TODO>
pmu: normal -> sleep 会给片外pmu芯片写en_vdd_core=1, 片外pmu芯片会停止输出1.2v电压.
测试VC0830是否确实没有了1.2v供电.
15:45 2009-4-1
<TODO></TODO>
1, yangzuoxing: 低频也需要支持.
bamvor: 直接改为cpu从12->444每8MHz一个频点.
今天给zouweiran之后, 有些函数改为宏.
2, 完成昨晚sd任务后测上面任务6(pmu)
3, get_cpu_bus_div():
zhangjian: 既然用了枚举, 应该不会越界吧. <TODO>确认</TODO>
4, <TODO>总结, 经验</TODO>
1), 发现下午困的时候写的代码不好, 而且有问题, 还不如先睡呢:(
2), 输入了全角&, 造成的编译错误:
clkrst/clkswitch_new/clk_switch.c:606: error: stray '\241' in program
5, 之前为了便于修改, 在"TSystemInfo"内部加const. 现在这样不行了. 所以需要
6, 加入malloc TClockSwitchInfo. 现在为了简单是直接声明的全局变量.
7, get_bus_freq改为了全局
8, 加入cpu divider选项
9, 切到cpu132(4:1)死, 查问题.
Usage:
1), 输入clkrst
2), 切频命令改为clksv.回车会列出支持的cpu频点, 选择cpu频点的index, 然后软件会列出bus频点index, 选择后切频.
这次软件内容有调整, 增加了很多组合, 时间关系只测试了sdram在132,136,140,144,148频率下cpu:bus=1:1或2:1的case.
3), 原有clockswitchsv命令仍然可用, 只是频点不全. .
10, <TODO></TODO>频点尽量合并, 例如396_132,132_132可以合并;同一个pll频率只给出一个默认频点. 合并后需要修改cpu频率显示方式, 软件根据pll频率自动算出cpu的频率, 排序后显示. 用户输入cpu频率. 切频前回显频率是否正确.
11, "print_all_cpu_freq()"需要修改, 目前没有排序. 定义全局的XCLK_FREQ
12,
//TODO
int pll1_xclk_switch_by_index(UINT32 index)
{
return 0;
}
13, 对xclk还是没有与pll1统一的处理方法.
为了便于输出频率, 把xclk配置单独放在"g_ClockSwitchInfo_cpurate_xclk". 只有"get_xclk_info()"需要调用.
14, 调试通过, 明天整理一下几个细节.
11:15 2009-4-2
<TODO></TODO>
1, bug
528 132 132 132切频不对. 528 132 132 66. 没这个问题了?! 还是有问题.
cpu切不到288. print函数问题?
2, 用户选择pll.cpu,bus index
3, (16:47 2009-4-2)
加入"check_clk_switch_succeeful"后发现切频后AASP提示符不正确, 后来发现check_clk_switch_succeeful()中把读CLOCKRST_PLL_SWITCH, 写成了写CLOCKRST_PLL_SWITCH, 等于是又做了一次切频, 切频到xclk.
至于为什么会出错, 暂时没想明白. <TODO>查</TODO>
(17:35 2009-4-2)感觉是堆栈溢出了,
加入"pll1_xclk_switch_by_index()"后, pll1_xclk_switch_by_index调用pll1_xclk_switch, 也出现AASP提示符不正确这个问题.
目前代码: "clkrst_200904021735_stack_maybe_over_flow.rar".
把一些底层函数改为宏:
get_xclk_freq, get_sdrc_refresh, make_cpu_bus_div
仍然不行, 删除"pll1_xclk_switch_by_index", 直接在用户空间得到pll1, cpu, bus频率.
仍然不行, 注释掉"check_clk_switch_succeeful"就没事了.
<TODO>查check_clk_switch_succeeful</TODO>
(20:06 2009-4-2)
"AASP"字符号是在aasp_shell()打出的. 没有使用变量, 那应该是放在在常量区. VC0830的常量区在哪里呢?
另有'#define DBGSTR_PREFIX "AASP: "', 但未使用.
(21:04 2009-4-2)
发现注释了"check_clk_switch_succeeful()"中读cpu,bus,vdec的命令就没事了. 难道使用pll1时不能读pll1的div?
HAL_READ_REG32(CLOCKRST_CKD_CPU_BUS_SDRC_CONFIG, regSystemInfo->cpu_bus_div);
HAL_READ_REG32(CLOCKRST_CKD_VCLK_CONFIG, regSystemInfo->vclk_div);
但是用memread读这两个寄存器却没事, 后来怀疑是延时问题.
当时没有修改timer_base, 用timer delay us延时了1000000. 没有问题. 后来这样延时后又有这个错误了. 目前没时间查这个bug了, 注释"check_clk_switch_succeeful()"和timer的延时. <TODO>解决, 重要</TODO>
"20:06 2009-4-2"end
4, (19:46 2009-4-2)bug:
切到24MHz lliautotest 5000 pass, 选择cpu 36MHz时菜单不正确:
index pll cpu bus
0 144 36 36
1 144 36 18
2 288 36 36
3 144 36 36
4 144 36 18
切频后死. 重启后选择cpu 36MHz时菜单:
index pll cpu bus
0 288 36 36
1 144 36 36
2 144 36 18
bamvor: 看来真是有bug, 必须得查下.
5, <TODO>任务</TODO>: 加入clock_info命令.
能否做一个CLOCK_INFO的命令?
敲完该命令能将830的时钟频率打印出来。
例如:
CLK FREQUENCY
XCLK 12MHZ
PLL1_CLK 672MHZ
PLL2_CLK_DIV2 XXX
PLL2_CLK_DIV5 XXX
PLL3_CLK_DIV2 XXX
CPU_CLK 336MHZ
BUS_CLK 168MHZ
VDEC_CLK 168MHZ
ICLK 80MHZ
LCD_PCLK 40MHZ
.
.
.
PMU_CLK 64KHZ
RTC_CLK 1KHZ
该命令在将来系统调试的时候应该用得比较多。
6, <TODO>任务</TODO>: 周五完成clock switch.
7,TODO: Uart_Init4Clkrst改为只修改波特率
8, bootloader\bootloaderscript.c保存了启动脚本.
9, 今日进展:
代码: clkrst_200904030024.rar
zhangjian clock clkswitch
1, modify clk switch function.
2, add svclkinfo to print clock info. (not finished)
CLK frequency
XCLK 12
PLL1 592
PLL2 DIV2 120
PLL2 DIV5 48
PLL3 DIV2 240
CKD_ICLK 42.3
CKD_VCLK 37.0
CKD_SNR 11.8
CKD_PER 24.7
CKD_NFC 24.7
CKD_SDIO 24.7
CKD_LCDP 29.6
CKD_AUDC 4.0
CKD_AE 14.8
CKD_AUDS 8.0
CKD_SPI 24.7
13:00 2009-4-2
VC0830, <TODO>整理现有任务</TODO>
1, sdio, clk, pmu.
2, 282 pmu最急.
3, sd将来要加入3share, 不share的auto/manual.
没找到哪里设只是nand,sd sahre. 是不是lcd"GPIO_D17 - GPIO_D0"都配成normal funciton后, 就自动是两个share了.
4, pclk使用pll3, 是shuyu自己配置的.
16:11 2009-4-2
公司, 报销
zhangmin提醒我:
财务制度要求报销单击不能用钉书钉, 应该粘贴.
bamvor: 呵呵, 自己本来知道的, 忽略了:(
(14:13 2009-7-1)而且应当是把一侧短边都贴上, 不能只贴一角.
10:22 2009-4-3
<TODO>今天任务</TODO>
1, 修改clkrst结构, 改为用户给出cpu程序自动计算cpu,bus,vdec
2, 1完成后, 完成clock_info命令
10:26 2009-4-3
VC0830, SV, clock, clkswitch
修改clkrst结构, 改为用户给出cpu程序自动计算cpu,bus,vdec
1, 分为basefunc,driver,app,test四个目录, 先不管CVS.
11:15 2009-4-3
VC0830, SV, 封装
zouweiran 282cpu板问题, 换成别人282cpu板没问题.
Clk,Uart init Done
Icache
AP Mode...
Read Info OK
Init cmd
Fail,please try another sdram configure
11:36 2009-4-3
VC0830, SV, clock, clkswitch, bug
1, clkrst_200904030024.rar有bug:
1), 第一次clock switch如果不用rvdebug跟踪会死.
2), 有时pll,cpu,bus列表不正确, 有冗余项.
3), clkrst_200904021140_new_clksv_user_friendly__maybe_include_bug.rar
没有问题1, 问题2有无未知.
4), 进一步验证发现通过rvdebug下载到ram没问题, 做成bin从nand启动就有问题.
<TODO>这个bug暂缓, 下午找人讨论</TODO>
(13:54 2009-4-3)
比较异同:
(1), undef USING_INDEX. 无效;
(2), comment Timer_TimerbaseSet. 无效.
现在发现编译这两个code都不行了, 而且链接脚本这两天没有改过. 但是用"clkrst_200904021140_new_clksv_user_friendly__maybe_include_bug.rar"的timer_sv.pak是没问题的. 经过比较两个vc0830.elf除了编译日期不同没有其它不同.
怀疑是写入nand时bbt有问题?! 用ftl format后问题一样.
(3), 实在是没办法, 暂时放下这个问题. 先整理代码加入自动计算pll算法.
(4), 保险起见保留log和全部代码.
log_20090403143604.log是用bin出错的日志
log_20090403144516.log是用rvdebug正常的日志.
5), 完成"10:26 2009-4-3"
(1), 文件变动:
bclkrst.h -> basefunc\clkrst_basefunc.h
(2), pll_freq2div需要支持其它xclk频率
(3), 基本功能过<TODO></TODO>
module divider也需要自动计算
pll, bus list有时不正确
15:26 2009-4-3
VC0830, SV, pmu
ap: dongliang 上午282 pmu rtc sleep回来打不出vimicro. 后来发现是282封装支持uart2, 目前我们板子的uart0直接是借助uart2的232电平转换芯片输出的. dongliang把uart2引脚设为gpio输入后就没问题.
cp模式仍有问题.
9:50 2009-4-6
VC0830, SV, dmac, bug, 系统繁忙时dmac优先级低引发的bug, <TODO>经验总结</TODO>
关于830 DMAC bug总结:
1. 问题:
在系统比较繁忙的时候(400*240 MPEG4 VDEC解码、LCDC显示、B层显示,DMAC拷贝数据),如果DMAC优先级低,DMAC会一直没有响。
2. IC check:
这的确是dmac的一个bug,当sdrc对dmac响应不及时时,dmac发出的读申请会在某一时间突然收到大量数据,以至于dmac的fifo发生溢出,丢失数据,从而导致dmac进入死循环。虽然我在dmac中加入了防溢出的处理,但这种情况大大超出了32word的限制,所以导致fifo无法判断而出错。
3. 为什么FPGA上没有测试出来:
在FPGA上的确没有测试这种情况。在测试压力时,我们只是使用了DMAC来加压,看看高优先级的vedec, video有没有正常工作。而没有去检测,低优先级的DMAC是否自己会死掉。该项测试计划在SV test plan review时才补上去的。
4. 和软件商量的解决方法:
a) 软件把握,在VIDEO,VDEC不繁忙的时候,才抽空启用DMAC,并将DMAC优先级设置为最高,且长度不要太长(几个ms能完成)
b) 使用DMAC的lli方式来绕过这个问题,但是需要每32个words一次lli,lli表需要4个words,也就是需要多1/8的lli表空间。
c) 使用软件memcpy;使用burst4,8的方式,进行优化。
d) IC 看能不能修这个bug(830,816上)。
10:05 2009-4-6
VC0830, SV, clock, 今天主要是定好module clock
1, 所有时钟源, 所有模块
1), pmu域: pmu_clk,
可用时钟源: rtcclk, xclk
2), rtc域: rtc_1k_clk
可用时钟源: rtcclk, xclk
3), pso域:
名称 可用时钟源 divider范围 ckd_en clk_gt
cpu_clk xclk, pll1, pll2
sdrc_adjx_clk(x=1,2,3) xclk, pll1, pll2
sdrc_clk xclk, pll1, pll2
pclk xclk, pll1, pll2
rtc_pclk xclk, pll1, pll2
pmu_pclk xclk, pll1, pll2
udc_pclk xclk, pll1, pll2
vdec_pclk xclk, pll1, pll2
ipp_hclk xclk, pll1, pll2
lcdc_hclk xclk, pll1, pll2
nfc_hclk xclk, pll1, pll2
sdio_hclk xclk, pll1, pll2
pdma_hclk xclk, pll1, pll2
dmac_hclk xclk, pll1, pll2
stor_hclk xclk, pll1, pll2
biu_hclk xclk, pll1, pll2
marb_hclk xclk, pll1, pll2
cpu_hclken xclk, pll1, pll2
sif_iclk pll1
ipp_iclk pll1
lcdc_iclk pll1
vdec_vclk pll1
...
2, 已实现的clk
CKD_ICLK
CKD_VCLK
CKD_SNR
CKD_PER
CKD_NFC
CKD_SDIO
CKD_LCDP
CKD_AUDC
CKD_AE
CKD_AUDS
CKD_SPI
3, 需求:
1), 在AASP中用命令显示当前各模块时钟, 目前已经有了雏形"print_sys_clock_info()", cpu, bus, video等未加入.
2), 用户需要切频时软件根据pll自动算出模块时钟.
根据每个模块的时钟范围和divider范围计算divider. 如果不能得到模块所需时钟, 模块状态设为DISABLE.
3), pm中suspend和resume需要按顺序开启时钟. clk需要组成树型结构.
比如uart需要按照pll1->per_clk->uart_clk顺序开启. 利用clk->parent找到树根, 并按顺序开关.
4, 定义结构体
结构体用于维护从xclk,pll1开始到模块输入clk的时钟树, 模块内部的时钟暂时不管理. 将来如果必要可以多加一级child.
以0或NULL表示无效或未初始化, 所以结构体使用前一定要memset 0, 保证状态正确.
变量:
//加入新模块要加入g_Clock[], g_ModuleClock[]中!
typedef struct tag_TClock {
//define variable
//name不为0!!!
char name[CLKI_NAME_LEN];//模块名称. 命名规则: 一般以寄存器名称为准. module_clk: 一般情况以m_clk_gt_ctrl寄存器为准.
//pll1-pll3=0-2, xclk=3
//cpu,bus等core clk: offset 0x10;
//module offset: M_CLK_ID_OFFSET
UINT32 id;
//目前无用, 为pmu留作扩展. 区分不同的电源域. 系统不同状态时(idle, sleep等)域的电源可能会开关.
UINT32 reversed1; //domain: enum clk_domain {PMU, RTC, PSO};
// 状态. [7:0]表示enable相关. [15:8]表示是否最新. [31:16] reversed
//目前每8位内部的状态是互斥的. 以后可能不同.
UINT32 status;
//目前divider由表格读出, 暂时不手工计算, 手工计算可能处理不好占空比. 单独列出divider结构体主要是便于用户查看divider设置是否正确.
TDivider div; //pll使用div1表示indiv和maindiv
TClk_enable enable;
TFreq freq;
struct tag_TClock *parent; // parent时钟. 对于xclk, PLL1, PLL2, PLL3是NULL
//define function
//这里的get,set都指get,set到数据结构中对应变量.
//读取diviver寄存器返回divVal. 只是对于pll, 返回divReg.
UINT32 (*get_div)(struct tag_TClock *clock);//, enum get_div_type type);
//根据clk和clk->parent的prefered_freq确定divider.
//用于时钟初始化或切频前根据clock source和prefered_freq确定divider.
//to be removed
//UINT32 (*get_prefered_div)(struct tag_TClock *clock);
//设置div结构体divider到寄存器.
INT32 (*set_div)(struct tag_TClock *clock);
UINT32 (*get_freq)(struct tag_TClock *clock);//, enum get_freq_type type);
//本意是支持模块自己修改clock. 目前xclk,pll在TSystemInfo已有描述, 这个
//函数用于设置xclk,pll频率.
UINT32 (*set_freq)(struct tag_TClock *clock);
//1: enable, 0: disable. 判断时需要判断是否是0或1. 如果将来需要其它编
//号, 便于扩展. 用户调用enable要检查返回值以确定是否成功.
//设置时要注意状态是否有违反, 例如要enable disable的模块, 如果div不合法,
//就不能enable.
INT32 (*set_enable)(struct tag_TClock *clock, UINT32 en);
//reversed:
UINT32 reversed2;//list; 加入到链表中. 要看是否需要遍历所有clock.
//引用计数. pm时可能有用. 如果需要按顺序关闭时钟. 例如关闭uart时钟, 需
//要先按uart->per->pll1顺序, 对于per和pll1, 如果ref_count!=0, 不能disable.
UINT32 reversed3;//ref_count;
//设置parent. 对cpu,phy_src_sel, aud_src_sel, lcdp_src_sel几个来说可以
//选择不同的pll. 暂时不需要.
UINT32 reversed4;//set_parent():
UINT32 reversed5;//锁
//tag_TClock完善后再多保留3个UINT32 reversed, 用于以后扩展. 到时会使用
//传统c语言struct赋值方法. , 因为axd不支持".name=xxx"的赋值方式.
}TClock, *PTClock;
函数:
get_div;//读取diviver寄存器, 并更新div1, div2
set_div;//根据clk和clk->parent prefered_freq确定divider.
get_freq:
if clk及clk->parent都是UPTODATE, 直接返回freq.
else if clk或clk->parent是DISABLE, 返回INVALID_FREQ
else 从不是UPTODATE的clk开始计算clk.
set_freq();//本意是支持模块自己修改clock. 目前xclk,pll在TSystemInfo已有描述, 这个函数用于设置xclk,pll频率.
enable(): 1: enable, 0: disable.
判断时需要判断是否是0或1. 如果将来需要其它编号, 便于扩展.
reversed:
list; 加入到链表中. 要看是否需要遍历所有clock.
ref_count: 引用计数. pm时可能有用.
如果需要按顺序关闭时钟. 例如关闭uart时钟, 需要先按uart->per->pll1顺序, 对于per和pll1, 如果ref_count!=0, 不能disable.
set_parent(): 设置parent.
对cpu,phy_src_sel, aud_src_sel, lcdp_src_sel几个来说可以选择不同的pll. 暂时不需要.
reversed: 3个字节.
(16:43 2009-4-6)
增加的内容太多了. 继续完成"c_clk_pll1"和update_module_divier中涉及到的.
完成后更新log上面的TClock.
(1:14 2009-4-7)
其实目前只需要get_prefered_div和set_div两个函数. 应该还是用最近的方法: 先写顶层函数, 再写底层函数. 今天又是反着写的.
希望明天上午能完成coding和compile, 并且能完成基本通路.
10:13 2009-4-6
软件技巧, 正则表达式, editplus, 提取函数参数, 搜索关键字, project搜索
1, 提取函数参数
查找: "[^(]*\((.*)\);"(不含引号, 下同).
替换: "\1"
可以把
" HALPrint("PLL3 DIV2\t %d\n", get_pll_clk_from_reg(PLL3)/2);"
替换为:
""PLL3 DIV2\t %d\n", get_pll_clk_from_reg(PLL3)/2"
2, editplus中搜索工作日志搜索关键字(每个条目中日期下面的是关键字), 表达式中keyword是要搜索的关键字:
([0-9][0-9]*:[0-9][0-9]* [0-9][0-9][0-9][0-9]-[0-9][0-9]*-[0-9][0-9]*\n.*keyword)|(\([0-9][0-9]*:[0-9][0-9]* [0-9][0-9][0-9][0-9]-[0-9][0-9]*-[0-9][0-9]*\)\n.*keyword)
3, (10:14 2009-12-7)project搜索
菜单Project->Edit project可以新建工程加入目录和文件. 原来是加入文件, 但是如果新增了文件还要手工加入, 现在我直接添加目录. 但是这样必须保证目录中所有文件都是需要搜索的, 原来editplus自动生成的bak文件利用"Tools->Preference->backup options"选择另一个目录"D:\Personnal\editplus_backup", 同时勾选包括目录. 不要勾选包括时间, 否则每次保证都会生成新文件, 反而不方便.
project建立完成后, 就可以在Find in Files中勾选"Current Project"搜索工程中的文件了. 计划将来把搜集的资料也放在某个目录中, 这样将来搜索会更方便.
10:09 2009-4-7
VC0830, clock, clk switch, <TODO>继续</TODO>
1, get_div,get_freq之前功能定义的不清楚, 现在加入一个type变量;
enum get_div_type {G_DIV,G_DIV_REG,G_DIV_SYSINFO,G_DIV_FREQ,G_DIV_PREFERED};
enum get_freq_type {G_FREQ,G_FREQ_REG,G_FREQ_SYSINFO,G_FREQ_FREQ,G_FREQ_PREFERED};
删除get_prefered_div. 用get_div(clk,G_DIV_PREFERED)实现.
在TOSWITCH状态下, 如果type是G_DIV/FREQ_SYSINFO或G_DIV/FREQ_PREFERED, 修改后设为SWITCHING. 这样叶子module就不会重复更新parent的div或freq.
总结来说: get_div,get_freq中只是根据type进行操作.
切频流程:
1, 配合用户输入合法pll,cpu,bus,vdec频率.
2, 更新clock的divider和freq:
1), 更新pll,cpu,bus,vdec频率到systemInfo.
2), 更新g_clock的divider和freq
(1), 设置所有clock status为"TOSWITCH";
(2), 修改clock source divider freq: (xclk,pll1,pll2,pll3)
get_div(clk,G_DIV_SYSINFO),get_freq(clk,G_FREQ_SYSINFO),
(3), 修改core clock divider freq: (cpu,bus,vdec)
get_div(clk,G_DIV_SYSINFO),get_freq(clk,G_FREQ_SYSINFO)
(4), 修改module clock divider freq:
get_div(clk,G_DIV_PREFERED),get_freq(clk,G_FREQ_PREFERED),
(5), 设置所有clock status为SWITCHING;
3, 配置寄存器
1), gating ungating module
2), switch to xclk or pll2
3), pll,cpu,sdram...
4), module divider:
set_div(), 同时更新状态为UPTODATE.
5), switch to pll.
6), ungating module in step 1).
目前1),6)的save_clk_m_gating_status和restore_clk_m_gating_status没有使用clock结构体的enable函数, 这两个步骤还是直接统一修改方便. 如果以后有gating顺序要求, 可能用clk->enable函数就很方便了.
-----<TODO></TODO>:
0, <TODO>整理思路!!</TODO>
1, 代码初步完成后当定义"CLKRST_NEW_CLK_STRUCT"时, "g_ClockSwitchInfo_cpurate"只保留几个最常用的频点.
2, "get_newclockSwitchInfo"用于得到当前正在更新的clockSwitchInfo, 有点别扭, 改
15:55 2009-4-7
VC0830, SV, clock, clkswitch, <TODO>新任务</TODO>
!!!要求明天下班之前完成!!!
做一个自动切频程序, 用户输入start freq, end freq, step, 按指定顺序扫描(目前是低->高, 高->低, 将来可能加入随机测试), 切到每个频率后做一定次数dma测试.
16:12 2009-4-7
VC0830, SV, <TODO>经验,技巧</TODO>
周五提交的代码编译不过去, 可能是因为提交前的编译没有clean.
以后提交代码前:
1, 先clean后compile;
2, 别忘了加入新文件;
3, 提交后更新, 看有无未知文件, 有无冲突文件等.
18:07 2009-4-7
VC0830, SV, EVB板
zouweiran EVB, lingming可能拨错了bootloader strap pin. 发现uart就不好用了. 按复位很多次, 只有一次能在终端看到信息. 用示波器看232芯片rx引脚, 有波形, 说明给232芯片的数据应该没问题.
zouweiran去换232芯片, 如果不行, 就得用逻辑分析仪看输出的数据是否正确了.
18:38 2009-4-7
VC0830, SV, clock, clk switch
写代码晕了, 经liaozhicheng提醒才看出来.
typedef struct tag_TModuleClockInfo
{
PTClock m_clk[NUMBER];
UINT32 m_gt_status;
}TModuleClockInfo, *PTModuleClockInfo;
改为
typedef struct tag_TModuleClockInfo
{
PTClock m_clk;
UINT32 m_gt_status;
}TModuleClockInfo, *PTModuleClockInfo;
否则:
PTClock g_ModuleClock[] =
{
&m_clk_per,
&m_clk_uart0,
&g_DummyClock,
};
TModuleClockInfo g_ModuleClockInfo =
{
.m_clk = g_ModuleClock,
};
有warning.
这样有问题, 目前是
typedef struct tag_TModuleClockInfo
{
PTClock *m_clk;
UINT32 m_gt_status;
}TModuleClockInfo, *PTModuleClockInfo;
在运行时赋值:
newInfo->moduleClockInfo->m_clk = g_ModuleClock;
20:45 2009-4-7
VC0830, SV, Storage, sd/mmc, <TODO></TODO>
1, mmc需要使用8bit数据线时, 如果插在sd插槽高4位无法使用. 所以mmc卡无法正常挂载. 这时如何使用udc挂载mmc到PC, 会有问题, 例如优盘未格式化, 盘符不正确等.
2, zhanglu测试6张mmc卡, 只有1个mmc在VC0830 SV板上能用. 但这六个mmc卡在PC上都没问题. <TODO>周四解决!!!!, Issue: [830 0007541]: 有部分MMC卡及SD卡不识别</TODO>
22:16 2009-4-7
VC0830, SV, clock, clkswitch, <TODO>修改</TODO>
1, 使用XCLK_FREQ宏, 可能终归还是不好, 以后修改.
<TODO></TODO>: xclk还是设成变量, 由strap pin读取好.
2, 进展:
代码: "VC0830_clkrst_200904072324_new_clk_struct_done-simple_test_pass_clkswitch_fail.rar"和"clkrst_200904072324_new_clk_struct_done-simple_test_pass_clkswitch_fail.rar"
测试132_132_132, 240_80_80参数计算正确, 目前只加入了uart, 明天完成测试命令后再加入其它. 明天先加入测试命令, 借用测试命令验证数据产生是否正确. 完成后再查看为什么切频会死, 不行就用"clkrst_200904021140_new_clksv_user_friendly_maybe_include_bug.rar"的切频程序.
3, <TODO>per频率不是整数是不是不好?</TODO>如果是, 需要修改get_module_div函数.
4, <TODO>freq单位?</TODO>: 使用Hz的好处是计算divider时没有小数问题. 但是对于很多本来以MHz单位能除尽的情况, 这样增加的计算量很大. 当前比float还是好些. 暂时没有想到很好的办法, 希望是能在计算量和灵活性之间取得更好的平衡. 目前编程时, 尽量考虑支持不同的频率单位.
13:58 2009-4-8
VC0830, SV, clock, clkswitch, 自动切频命令, 用于筛片子
自"15:55 2009-4-7"
1, 接口:
1), 用户: 输入start freq, end freq, step; 测试次数, 每次切频后dma测试次数(默认10次).
2), 频点的选择, 利用结构体:
typedef struct tag_TOperationPointIterator
{
TFreq user;
TFreq actual;
...
}TOPIterator, *PTOPIterator;
2, tag_TOperationPointIterator用到的pll,cpu,bus,vdec频率, 开始是新增的结构体, 后来发现用tag_TSystemInfo就可以. 目前改为:
typedef struct tag_TOperationPointIterator
{
char name[OP_IT_NAME_LEN];
INT32 status;
//TFreq userCpu;//是否需要?
TFreq pll;
TFreq cpu;
TFreq bus;
TFreq vdec;
PTSystemInfo curSystemInfo;
//设置到初始状态, 准备重新变量. reset后status是OPITOR_INIT
//一定要先setMinMaxStep, 再reset.
INT32 (*reset)(struct tag_TOperationPointIterator* itor_p);
//设置用户输入的cpu最大,最小频率, step
INT32 (*setMinMaxStep)(struct tag_TOperationPointIterator* itor_p,
UINT32 min, UINT32 max, UINT32 step);
//得到下一个Operation point item, 返回NULL表示结束.
//结束时status是OPITOR_END
PTOPItem (*next)(struct tag_TOperationPointIterator* itor_p);
//返回当前operation point. 返回NULL表示结束.
PTOPItem (*get)(struct tag_TOperationPointIterator *itor_p);
UINT32 (*getPllFreq)(struct tag_TOperationPointIterator* itor_p);
UINT32 (*getCpuFreq)(struct tag_TOperationPointIterator* itor_p);
UINT32 (*getBusFreq)(struct tag_TOperationPointIterator* itor_p);
UINT32 (*getVdecFreq)(struct tag_TOperationPointIterator* itor_p);
//指向下一个op itor, 为用户需要多个operation point iterator做准备.
struct tag_TOperationPointIterator *nextIt;
char *help;
}TOPIterator, *PTOPIterator;
14:32 2009-4-8
项目, 编程风格,
"D:\work\Documentation\Dragon code style-final.doc"
1, 函数名称一般是"模块名_函数名", 单词首字母大写.
2, 不要使用UINT32? VC0830里面都用, 这个应该可以用.
3, enum不要typedef? 不理解, 暂时不用.
15:36 2009-4-8
VC0830, SV, 文档, databook
地址: "ftp://10.0.13.13/", 用户名: guest,密码: guest.
另: <TODO></TODO>perl练习: 写脚本自动根据变量名称生成Input xxx, Param arguments等.
16:04 2009-4-8
VC0830, SV, rom bootloader
aiguo实验.
VC0830可以在不重新产生pll情况下, 修改cpu,bus divider. 与目前切频流程的差异只是去掉了gen_pll()函数.
测试的目的是如果bootloader 在240/80启动失败时,可以启动到较低频率.
aiguo是用spi boot实验的.
23:30 2009-4-8
VC0830, SV, clock, clk switch
1, 调试
1), src->xclk设成了13:
是随机值. 原因是xclk没有赋值;
2), pll_freq是0.
改代码改错了, 把cpu_div给了pll_ckd
3), SysInfo_GetOnePllCpuBusFreq的输入参数cpu=0: 原因是getPllFreq时Itor->pll.freq没有*MHZ.
2, 目前完成从低到高每4MHz一个step的遍历, 明天加入从高到底遍历. 顺便测试计算module频率的函数. 需要加入nfc, usb.两个模块. usb主要是考虑频率不合要求是disable.这种情况下gating,ungating函数也需要修改. 对于div不存在造成的disable, 不应该ungating.
11:33 2009-4-9
VC0380, clock, clkswitch, <TODO>总结</TODO>
1, 目前给Uart_Init4Clkrst传入的module clk是0. 查.
发现是get_freq函数实现不正确.
如果"!is_status(clock->status,SWITCHING )"会直接返回INVALID_FERQ(0).
2, #8+#10+蓝sdram=156切频后很快死.
3, #8+#8:
1), 测试环境: #8底板+#8cpu板(176封装)+蓝sdram板子+rvdebug
144 lliautotest 100 pass
148 lliautotest 100 pass
152 lliautotest 100 pass
156 lliautotest 100 pass
160 lliautotest 100 pass
164 切频后很快死(3次相同)
168 lliautotest 100 pass
172 lliautotest 100 pass
176 lliautotest 100 pass
180 lliautotest 100 pass
184 lliautotest 100 pass
188 lliautotest 100 pass
192 lliautotest 100 pass
196 lliautotest 100 pass
200 lliautotest 5000 pass
2), 上传CVS
###################CVS_COMMENT_START#######################
zhangjian: clock, clkswitch
1, add algo for clock switch cmd: "clksv"
calculate pll,bus,vdec from cpu freq and calculate module divider from pll freq. only the following case is test right now:
144 lliautotest 100 pass
148 lliautotest 100 pass
152 lliautotest 100 pass
156 lliautotest 100 pass
160 lliautotest 100 pass
164 fail: 切频后很快死(3次相同)
168 lliautotest 100 pass
172 lliautotest 100 pass
176 lliautotest 100 pass
180 lliautotest 100 pass
184 lliautotest 100 pass
188 lliautotest 100 pass
192 lliautotest 100 pass
196 lliautotest 100 pass
200 lliautotest 5000 pass
2, add auto switch comamnd. support min to max frequency switch.
but there is bug in dma test.
cmd: "autoswitch".
###################CVS_COMMENT_END#######################
4,
1), 选择prefered index时cpu,bus也要考虑. 可以用systemInfo保存prefered system info.
2), 修改sdram最高频率?
3), 使用lliautotest时忘了释放内存, 所以第二次dma测试就失败了.
4), index不明显;
5), caijin 映像切频死. zhangjian实验映像, 会死, 这个问题一直存在, 今天要解决这个问题.
6), TODO: autoswitch 加入maxMin. 允许minMax, Maxmin. 完成后调试5.
5, debug问题4-4):
两次都死在"1a0bc":
HAL_WRITE_REG32(CLOCKRST_PLL_CTRL, reg|0x1); //power down pll1
1a0b0: e3a02206 mov r2, #1610612736 ; 0x60000000
1a0b4: e59d3008 ldr r3, [sp, #8]
1a0b8: e3833001 orr r3, r3, #1 ; 0x1
1a0bc: e5823000 str r3, [r2]
也就是power down pll处.
提示: Stopped on Memory access violation
先改成:
HAL_WRITE_REG32(CLOCKRST_PLL_CTRL, reg|0x421); //power down pll1, pll2, pll3
//HAL_WRITE_REG32(CLOCKRST_PLL_CTRL, reg|0x1); //power down pll1
试试, 不行就找到一版可用的代码再做比较.
15:54 2009-4-9
VC0830, SV, 键盘(kpd)和jtag复用, 测试键盘时需要拔掉jtag
15:55 2009-4-9
VC0830, SV, clock, clkswitch
caijin: 240_120_120->240_120_120, ls死.
17:26 2009-4-9
VC0830, SV, clock, clkswitch, video, snr
1, 找shunyu拿来senor和lcd
1), sensor右对齐
JP13-JH3
1-9,2-7
2), lcd左对齐
JMP2[1,2], JMP1[2,3]
2, 修改代码:
1), INT32移动到common_def.h. 否则boxue在vc下编译v830clkrst模块时出错.
2), <TODO></TODO>
(1), 类型定义尽量定义在xxxtype.h中
(2), sdio: 修改sd代码使其更好支持nucleus: 利用信号量支持多任务.
3, 先保证主要频点切频可用(含240_120_120), 再保证映像中也不会死.
1), (18:57 2009-4-9)
发现vdec频率没有切, 原来是在update_module_divier写的divider, 改update_module_divier函数后, 由于vclk不再g_ModuleClock, g_Clock中, 所以没有切.
暂时临时加入到while前:
//vdec divider在前面已经算过, 暂时直接写入. TODO: vclk加入g_Clock, g_ModuleClock
HAL_WRITE_REG32(CLOCKRST_CKD_VCLK_CONFIG, \
clockSwitchInfo->systemInfo->vclk_div);
while( '\0' != (*clk_pp)->name[0] ) {
4, 测试vdec:
vdec:>rvplay -f xxx.rm -dn 100
5, 现有代码:
更新了代码:
vdec:>rvplay -f run_rv8.rm -dn 100
pass as 144, 168 and 172MHz (1:1:1).
fail at 164(1:1:1): no response.
144,168,172下lcd和snr也可以使用: video,open,preview.
CVS log:
zhangjian: clock clkswitch
modify update_module_divier: set vclk divider in it.
vdec:>rvplay -f run_rv8.rm -dn 100 pass as 144, 168 and 172MHz (1:1:1).
fail at 164(1:1:1): no response.
代码: clkrst_200904091909_vdec_snr_lcd_pass_at_simple_test.rar
9:15 2009-4-10
<TODO></TODO>
打印考核表给aiguo. 打印: 7255,7193
9:25 2009-4-10
VC0830, SV, clock, datebook, Yinong notes及建议, Yangzuoxing回信
自:
1, "Yinong"邮件"答复: a good document to help you understand the clock and reset of 830", 2009年4月10日 6:51
2, "Yangzuoxing"邮件: "答复: a good document to help you understand the clock and reset of 830", 2009年4月10日 16:04
bamvor: 下文把Yinong回信和Yangzuoxing回信编在一起:
Yinong:
我仔细读了一下姜博这篇文档,的确写的非常好,注重细节,格式严谨,图文并茂。看得出来,姜博是花了很多心血认真去写的, 读者读完后,也是能读懂很多东西的。总的来说,830 design team这次的文档工作做得挺好,比以前前进了一大步。
读的过程当中,我也写了一些notes, 提出来让所有这次要写文档的人看一看,不知是否有共性的东西?请 Zuoxing的team在reivew其它文档时也follow 这些原则。
Yangzuoxing:
非常感谢你在如此繁忙的情况下,还仔细看了这个DATABOOK,并提出了如此多的宝贵意见。与JIANGBO, ZIXI讨论后,对你意见的答复如下(请参见蓝色部分):
-
A design goal of clkrst module, in addition to its function, needs to be specified clearly at the beginning, so that people may know overall what goals we want to achieve.
[YANGZUOXING]: 在OVERVIEW的开头,往往会介绍设计的目标.但这块可能没有作为一个重点,强调得还不太足,可以继续改进。
-
For Vimicro’s team in particular, which all have some experience with 820, a brief introduction of difference to 820’s implementation would be very helpful.
[YANGZUOXING]:在下一个项目的MAS里,可以在BACKGOUND这章里,增加一节,介绍原来的模块用于新项目的不足之处。但这部分内容是否要加入到DATABOOK,我们还可以再讨论一下。
-
At the earlier sections, put a a brief introduction of what each clock is used for, why there is a PMU power domain and why there is a PSO power domain, which blocks will be impacted in idle mode, etc. Otherwise, first time readers in the software/application team may still have a tough time to understand what each clock is used for. Even after finishing reading the entire document, they may only 知其然而不知其所以然。 If these topics is already introduced somewhere else, please give a pointer here.
[YANGZUOXING]:各模块的时钟在对应模块的DATABOOK中有详细描述。JIANGBO会加一个REFERENCE TO MODULE’S DATABOOK.
POWER DOMAIN在POWER MANAGEMENT一章中有详细描述。JIANGBO会加一个REFERENCE.
-
Marketing, or system team, may have raised some requests during the course of design, it is very valuable to include them here. For example, Weimin’s words below are worthwhile to be reflected in.
[YANGZUOXING]: 可以考虑在下一个项目的MAS中,在BACKGOUND一章中加一节:MARKETING REQUIREMENT. 是否要加入到DATABOOK中,我们可以再考虑。
-
Not only cover what has been done, but "why" a decision is made to implement things in such a way. Provide reader the train of the thoughts, so that they can follow up easier.
[YANGZUOXING]:这个意见很好。这将作为我们写文档的一个重要指导原则。
-
Please add a revision history table.
[YANGZUOXING]:我们将在所有DATABOOK中加上这一部分。
Details
-
Corners encountered in the FPGA, ie., cache alignment issues while switching clocks, needs to be emphasized. Since this is a FPGA specific problem, it may not help system team much, but for sure it will be very helpful for future projects
[YANGZUOXING]: 在下一个项目的MAS中,要加入这一部分内容。由于ASIC没这个问题,就不打算加到DATABOOK中了。
-
When a particular implementation is discussed, the assumption should be addressed very clearly. The assumption is equally as important as the actual implementation, because software/system guys are suppose to follow design team’s assumptions when they write applications. For example, when discussing the clock switch, the following assumptions need to be added:
1.
We never change the clock frequency in the middle of an application / scenario. Typically, the frequency scaling happens when users switches from GUI to an application, or from an application to GUI;
2.
The only thing that needs to have audio play uninterruptedly is playing MP3 and then entering dark screen mode;
3.
Clock switch is never intended to be supported while in the middle of playing a video. Software is supposed to pre-parse the input bit stream and decide what frequency level to use up in the front, based on resolution.
4.
No need to maintain audio/video synchronization in the clock switch process, in general.
5.
….
[YANGZUOXING]:JIANGBO会在CLOCK_SWITCHING中加入这部分内容。
Related topics
-
How clock is set up in FPGA is also encouraged to be described here, so that other projects can have a template to follow after reading this document, rather than inventing something from scratch.
[YANGZUOXING]:下一个项目的MAS中要包括FPGA上的时钟方案。
-
What are the potential improvements after the 830 practice, if the corresponding designers, eg. Lv Pin, Jiangbo and Zuoxing, ever thought about this topic?
[YANGZUOXING]:CLKRST这个模块,到目前为止没有发现什么大问题,因此也谈不上期望的大改进。但很多模块都加上了LIMITATION AND ERRATA, 这在一定程度上记录了改进意见。
9:33 2009-4-10
VC0830, SV, clock, <TODO>任务</TODO>
1, 今天
1), 保证切频程序稳定性:
(1), 解决烧映像切频死的问题;
(2), 切240_120_120死
2), 加入原有update_module_divider支持的模块
2, sd bug
3, 整理p62 VC0830 例会笔记. Shuyu lcd相关
11:03 2009-4-10
VC0830, SV, clock, 解决"9:33 2009-4-10"问题1-1)
1, 逐一比较函数
1), clk_pll_switch
(1), xclkClockSwitchInfo获取方式不同, 现在是直接给指针xclkClockSwitchInfo赋值, 原来是使用get_xclk_info获取.
(2), 切频后打出回车后, 现在比原来多打出:
HALPrint("CLOCK SWITCH PROGRESS FAILED. the following operation point is not valid:\n");
总结: 流程一致, 查下面的函数;
2), clk_switch_to_xclk
原来是
HAL_WRITE_REG32(CLOCKRST_PLL_CTRL, reg|0x1); //power down pll1
现在是
HAL_WRITE_REG32(CLOCKRST_PLL_CTRL, reg|0x421); //power down pll1, pll2, pll3
现在这个是为了调试才改的, 原来就是上面的写法, 而且上面写法也更好.
3), cfg_sdrc, 相同;
4), 比较sdram参数. 相同.
至此, 与切频到12M死有关的部分都已经排查了.
2, 怀疑函数调用太多?
把
pll1_xclk_switch(pll1_freq, cpu_freq, bus_freq, vdec_freq);
拆成两步:
clockSwitchInfo = clkrst_MakeClockSwitchInfo(pll1_freq, cpu_freq, bus_freq, vdec_freq);
clk_pll_switch(clockSwitchInfo);
仍然不行.
3, 会不会是其它模块的影响?
sdram配置脚本都是新脚本
项目 clkrst 结果
1), 今天 zhangjian04021140 fail
2), 0401 今天 fail
4, 这样的结果, 意外.
先查case 2).
sdram配置脚本都是旧脚本
项目 clkrst 结果
1), 今天 今天 pass
2), 0401 今天 pass
5, 说明是sdram配置脚本问题.
1), 先保存代码, 为了以防万一, 把VC0830和VC0830_bootloader(rom bootloader)都打包保存了.
旧工程+旧clkrst代码:
20090401_clkrst_project+zhangjian200904021140clkswitch_including_vc0830+rom_bootloader.rar
新工程+新clkrst代码:
20090401_clkrst_project+zhangjian200904021140clkswitch_including_vc0830+rom_bootloader.rar
2), 脚本共四处不同:
(1), addr_off[1] = 0x60011004
name: SDRC_MODE
新: register_value[1] = 0x00000023 //32M must changed
旧: register_value[1] = 0x00000033 //32M must changed
差异: [6:4]CL (CAS Latency), 前者是2, 后者是3.
sdram_config.c是2.
(2), addr_off[4] = 0x60011020
name: RD_PATH_CTRL
新: register_value[4] = 0x00000022
旧: register_value[4] = 0x00000032
差异: [6:4]Tcas, 前者是2, 后者是3.
目前sdram_config.c用的是3, 可能有影响. 修改后死在bootloader的"Go".<TODO>继续</TODO>
(3), addr_off[9] = 0x60011048 //adj_2
新: register_value[9] = 0x00000078
旧: register_value[9] = 0x00000060
sdram_config.c是0x78.
(4), addr_off[10] = 0x6001104c //ADJ_3
新: register_value[10] = 0x000000a0
旧: register_value[10] = 0x00000078
sdram_config.c是0xa.
3), 同时修改CL(->3)和tcas(->3)后切频正常.
4), 虽然能跑了, 但是让人觉得费解, 详细查代码:
(1), 原来0-60, 60-200都没有写SDRC_MODE:
HAL_WRITE_REG32(SDRC_MODE, sdramInfo->sdrc_mode); //cas
可能是原来改代码时改错了, 把SDRC_MODE贴成了紧挨着它的SDRC_RD_PATH_CTRL.
HAL_WRITE_REG32(SDRC_RD_PATH_CTRL, sdramInfo->sdrc_rd_path_control); //tcas
(2), sdrc_rd_path_control在0-60,60-120都没有配成Lingming推荐值.
改为推荐值后仍然不行. (17:58 2009-4-10)调了半天发现改的是旧sdramInfo参数, 为了以后避免类似问题, 干脆删除. 以后sdramInfo都在sdram_config_xxx.c/h中.
5), <TODO>解决</TODO>: 暂时没有找到问题原因, 高度怀疑sdram低频参数或流程有问题.
暂时把CL, Tcas改为3, 并上传至服务器.
16:27 2009-4-10
VC0830, SV, sensor, <TODO>有时间看sensor原理图</TODO>
25,22断了, 造成sensor切屏, Shuyu保存图片后, 用YUVViewer看到是sensor保存的图片由四个相同的图片组成的.
17:34 2009-4-10
VC0830, SV, clock, clkswitch, bug
1, 用户输入480_240_120_120, 但实际切的是960_240_120.
发现程序中没有比较pll是否相同, 只比较了cpu,bus.
2, 删除:
CLKRST_NEW_MODULE_CLOCK_INFO
CLKRST_NEW_CLK_STRUCT
get_module_clk
INVALID_DIV
INVALID_DIVIER
3, 目前支持的模块有:
&m_clk_per,
&m_clk_uart0,
&m_clk_sdio,
&m_clk_snr,
&m_clk_iclk,
&m_clk_nfc,
&m_clk_spi,
&m_clk_phy_udc,
4, 测试:
1), rvdebug: 测试典型频率主要外设是否工作正常.
240_120, 288_144, 160_160, 168_168
a, 切频到12后 data abort,
sdrc_rd_path_control = 0x10 -> 0x20. 正常;
sdrc_rd_path_control = 0x22 -> 0x32. 正常
b, 120_60_60, dataabort.
用0-60的sdram参数实验.fail
c, 96_96_96, lcd,snr不能用.
2), 映像, 批量测试:
(1), cpu: 12->296, step 4, ratio 2:1, dma 10次
120_60 fail
(2), cpu: 144->200, step 4, ratio 1:1 dma 50次, 共测试5次. pass
(3), cpu: 12->116, step 4, ratio 2:1, dma 10次, 共测试5次, pass
(4), cpu: 144->280 step 4, ratio 1:1 dma 20次, fail at 第一次 276:138:138. 手动做lliautotest 100 pass.
(5), cpu: 144->280 step 4, ratio 2:1 dma 1次, fail at 第一次 268:134
(6), cpu: 144->260 step 4, ratio 2:1 dma 10次, fail at 第一次 256:128, 手动做lliautotest 100 pass.
(7), 可能是切的太快了, 切频后加了0.5秒延时.
有所好转(04110032):
a, cpu: 144->296 step 4, ratio 2:1 dma 10次, fail at 第一次 292:146
b, cpu: 144->292 step 4, ratio 2:1 dma 10次, fail at 第一次 288:144
b, cpu: 144->292 step 4, ratio 2:1 dma 10次, fail at 第一次 280:140
发现每次都死在倒数第二次, 每次都是dma测试后.
(8), 改成1s试试(04110038):
问题依旧.
5, 进展;
1), svclkinfo: 显示模块频率, pass.
2), clksv: 手动切频
(1), cpu 144->196 cpu:bus=1:1 step 4M: pass;
(2), cpu 240->288 cpu:bus=2:1 step 4M: pass
(3), fail:
a, bus=60. 但116:58, 120:60, 124:62, 56:56, 64:64都pass. 怀疑是60参数有问题?
b, cpu,bus=292:148
3), autoswitch, 目前只支持从低到高扫描, 用户可以输入min,max,step,cpu_bus_ratio等.
每次都是dma测试后死在倒数第二个测试点.
<TODO>估计autoswitch的问题用rvdebug调试就能解决</TODO>
16:06 2009-4-11
VC0830, SV, clock, clkswitch, bug, 续
解决"17:34 2009-4-10"5-3)bug
1, 昨天已经实验, minMax切频完成后出的错. 可能是新加的对多个Itor处理的影响.
2, <TODO></TODO>: 加入更好支持多个Itor的代码, 给出常用Itor组合, 同时也允许用户自定义Itor组合.
3, <TODO></TODO>:
1), #define MIN_PREFERED_PLL_FREQ (500) 根据databook改为(480).
2), 加入spi0,spi1,uart0-3很容易.
目前切频前计算clock div后设置status为TOSWITCH, 计算div后设置为SWTICHING, 切频后"update_module_divier()"设置UPTODATE.
SWTICHING改为SWITCHREADY更合适. 只计算不切频含义也没错.
16:16 2009-4-11
VC0830, SV, databook, clkrst
1,
1), pll
(1), VCO Frequency (Fvco) 480MHz ~ 900MHz.
(2), Jitter < 300ps cycle to cycle, <TODO>查实测jitter; 查jitter含义和影响</TODO>
(3), 稳定时间: Settling Time < 300us
2), pmu和rtc可以使用xclk或32.768k, 在pmu_ctrl[0](pmu_clk_sel), rtc_ctrl[10](rtc_clk_sel)选择.
发现模块定义是有共性的, 第一个寄存器一般是ctrl(00h或04h), 第二个寄存器是ckd(04h或08h). 好像在什么地方看到过模块寄存器定义的建议, <TODO>查找这个寄存器定义规范</TODO>
3), en_xclk
databook说的比mas清楚很多.
AP模式: en_xclk_reg: pmu_ctrl[1]. en_xclk由en_xclk_reg和VC0830工作模式共同决定. 只有进入sleep且en_xclk_reg=0, xclk才会关闭.
CP模式: xclk_disable: abi_ctrl[4]. en_xclk直接由xclk_disable控制, 注意逻辑是反的.
<TODO>看到databook clkrst p10, 争取周一看完</TODO>
9:12 2009-4-13
VC0830, SV, clkrst, clkswitch, <TODO>今天任务</TODO>
1, clkrst
1), autoswitch支持min to max, max to min, 及组合.
(1), 解决"17:34 2009-4-10"5-3)bug
OpIt_NextOpItor中把nextItor写成了next. next是取Item的.
(2), ItorGroup.
(3), 会弹出: Marb apb bridge time out,Error Addr:80201000.
跟踪发现是运行update_module_divier后i++出现的. <TODO>注释了i也是一样, 恢复到原来代码尝试!!!重要</TODO>
(4), 切频后sensor不能用, 真可能是程序的问题. 我的映像给beizhan板子烧问题同样.
用"shuyu: me_090413_120.pak"可以.(D:\work\VC0830\SV\image\shuyu)
(5), <转移>caijin需求: 切频时列出所有可能的vdec频率. 见"17:19 2009-4-13"
(6), 实验:
a, cpu: 24->196, step: 24MHz, Itor min to max to min, times: 5. dma times: 10. PASS.
b, cpu: 168->288, step: 4MHz, Itor min to max to min, times: 5. dma times: 20. PASS.
(7), <TODO>自动切频首先找到在MIN_PLL_FREQ和MAX_PLL_FREQ之间的解, 然后查找有无在MIN_PREFERED_PLL_FREQ-MAX_PREFERED_PLL_FREQ之间的解.
2), svclkinfo改为读取寄存器和读取当前值.
(8), 解决"20:47 2009-4-13". 需要gating, ungating时根据module freq是否INVALID_FREQ, INVALID_DIV分别操作.
(1), pll频率不正确.
读取寄存器时, 设置为OUTOFDATE, clock 模块的OUTOFDATE表示需要从寄存器更新数据到TClock结构体.
(2), 加入cpu,bus,vdec
2, sd/mmc初步结论.
16:06 2009-4-13
VC0830, SV, clkrst, debug板子
beizhan的板子烧入影响后死在Go处. 问题原因是memory板不好, 更好篮sdram板问题解决.
注: 目前用的sdram芯片都是samsung的K4s561632e(32M)
1, 先替换cpu板和memory板: 替换后无问题.
2, 只替换memory板(蓝sdram板). 通过. 说明是memory板问题.
17:16 2009-4-13
VC0830, SV, clkrst, bug问题, <TODO>整理</TODO>
1, 目前60M, 164M切频问题
caijin, 176封装(#5+#3)切到164没有死.
2, autoswitch 256MHzDMA后死;
3, 切频中出现marb apb time out 0x60201000.
17:19 2009-4-13
VC0830, SV, vdec, support, caijin需求: clkrst切频时列出所有vdec频率, 重点是vdec比bus高30%的情况.
1, 目的:
实验vdec比bus快30%左右时能否正常工作.
2, 具体情况见邮件:
Wally:
Yajing and Fengxiang,
刚才Zuoxing告诉我,目前830 DDR的时钟调到166MHz比较困难,目前只能到133MHz,由于我们以前VDEC设计中我们缺省认为HCLK是要比VCLK快的,这样就会导致VCLK也上不去,因而解码速度也比较慢。希望我们跑一两个VCLK比HCLK快的case,但是也不要太快,比如10%, 20%, 30%等等,看看我们当时在设计时是否考虑到这方面的问题,重点看看FIFO, control register synchronization, interrupt synchronization等。谢谢。
Zhang Ya Jing:
Hi.all
我run了几个case,跑完5帧,没有问题,
Case1
Vclk=105M hclk=88M vclk比hclk 快了近20%
Case2
Vclk=173M hclk=133M vclk比hclk 快了近30%
Case3
Vclk=133M hclk=88M vclk比hclk 快了近50%
所以,针对“重点看看FIFO, control register synchronization, interrupt synchronization等”,这几个设计应该是没问题的。不过我都run的一个码流,我可以再多跑几个码流。
Yang Zuo Xing:
不错呀。
HI, FENGXIANG,