-
Notifications
You must be signed in to change notification settings - Fork 2
/
log200701.txt
908 lines (786 loc) · 50.4 KB
/
log200701.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
17:30 2007-01-01
Linux, gtk, 文档
gtk所有文档需要放在同一个目录下, 这样查资料时就可以直接点链接到其它文档. 例如从gtk到gobject.
我放在了/usr/share/gtk-2.0-doc/目录:
[root@localhost gtk-2.0-doc]# pwd
/usr/share/gtk-2.0-doc
[root@localhost gtk-2.0-doc]# ls
atk gdk gdk-pixbuf glib gobject gtk pango
疑问: 查g_signal_connect函数是如何把scribble_configure_event, scribble_expose_event等函数连接到对应的widget的.
74行:
widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
(11:05 2007-01-02)
GTK_WINDOW, GTK_CONTAINER等都是调用了G_TYPE_CHECK_INSTANCE_CAST, 用于判断是否是所需的g类型, 并返回对应的c类型(原文: Checks that instance is an instance of the type identified by g_type and emits a warning if this is not the case. Returns instance casted to a pointer to c_type). 例如:
#define GTK_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_WINDOW, GtkWindow))
#define GTK_TYPE_WINDOW (gtk_window_get_type ())
疑问: GCallback是如何定义的?从下式可以看出GCallback是一个类型, 但是没有找到在GCallback在何处定义了GCallback, 查***
#define G_CALLBACK(f) ((GCallback) (f))
GDK_POINTER_MOTION_MASK与GDK_POINTER_MOTION_HINT_MASK:
GDK_POINTER_MOTION_MASK接收每次的鼠标运动,
GDK_POINTER_MOTION_HINT_MASK的作用是(原文: When using the GDK_POINTER_MOTION_HINT_MASK the server will only send a single GDK_MOTION_NOTIFY event (which is marked as a hint) until the application asks for more, by calling gdk_window_get_pointer().)
14:12 2007-1-2
Linux, gtk
gdk_draw_arc()函数画一个椭圆或椭圆弧. 参数angle1和angl2都是以1/64度来指定的,所以360°就是360*64。这样可以更精确地指定弧形的尺寸和形状,而不需使用浮点数。
14:13 2007-1-2
完成drawingarea.c的阅读. 下一步试验画一列数据和显示一个汉子.
然后思考整个液晶显示的框架.
20:55 2007-01-02
Linux, gtk
终于画出了前天没有画出的圆形. 原因是没有加入gtk_widget_show(drawing_area);
(22:59 2007-1-2)
完成gtk画点程序"gtkpoint.c".
09:43 2007-01-05
英语句子, 嵌入式, 操作系统, 中间件
In a system with different OSes or a heterogeneous multicore system,
implementing a common middleware structure to manage communications
between the processors comes down to bridging between the different OSes
and/or processor types.
15:09 2007-01-05
嵌入式, 单片机开发板, USB, CP210x
串口使用: RxD, TxD, RTS, CTS四根线. 其余不需要连接(参考了S3C2410和LEON两个开发板). 其余参考: CP2102评估板原理图(位于CP2102评估板文档(CP2102-EK.PDF))
另外注意CP2102的RST引脚: RTS低电平15us, 可以使CP2102复位
10:36 2007-1-6
模拟电路, 电流源
上下两个相交的圆圈表示电流源.
15:00 2007-01-06
Linux, 技巧, 一些有用的目录
/usr/share/man, 保存手册(manual)
/usr/share/applications/, /usr/share/applnk/, /usr/share/applnk-redhat/, 保存Redhat应用程序菜单的项目.
14:28 2007-1-9
单片机讲座, MSP430
4618,样片申请不下来。
RS232,maxim3232。
CP2102,查封装,画封装LCC.
需要加入MSP430周围的接插件和开关。
169, 1611, 449,下载datasheet。比较169和1611引脚是否一样。
17:21 2007-1-9
网址, 嵌入式,
带2D加速显卡芯片的S3C2440的开发板
http://forum.eetchina.com/FORUM_POST_1200022940_0.HTM?click_from=1000012208,8883567706,2007-01-09,EECOL,FORUM
公司: www.xlongtech.com
17:28 2007-1-10
protrl, 原理图库
如果新画一个原理图库,当开发库文件时,对该库的修改需要选择tools-update schemetics才能生效,否则还是原来的内容。对于一个新化的器件就是什么也没有。
新建库的compoent设置和原理图的schemetics preferences与原有库设置一致即可
19:53 2007-1-10
单片机开发板
改:(高电平有效)IO-电阻-LED-地。
使用P5口接LED
23:42 2007-1-10
protel, 修改原理图图纸的大小.
Design-Docuemnt Options: standard style.
13:45 2007-1-11
c语言, 光栅, 编程风格***
光栅程序中查找汉字的区位码使用的下面的方法:
//查找汉字的区位码,如果不存在则使用黑方块显示
//放在printChar16String中,就需要传递fontPos,但这样不通用和易用
for(fontPos=0;fontPos<=FONTROW;fontPos++){
if(quweima==quweimaList[fontPos][0]){
break;
}
}
后来看《c语言嵌入式编程修炼之道》,发现下面的写法,比我的写法清除很多:
/* 获得焦点元素 */
while ( (element [i].ID!= currentFocus)&& (i < ELEMENT_NUM) ) {
i++;
}
这种方法中查找位置和判断溢出两个同等地位的判断写在一个表达式中,而我的程序把两个同等地位表达式分开写,这样看着不清楚,修改程序时也容易把两个条件分开修改。
20:14 2007-1-11
c语言实现面向对象:
Object-oriented programming in C
自: http://www.accu.org/acornsig/public/articles/oop_c.html
摘: An object has an internal state (i.e. variables that are local to the object) and operations to modify that state.
21:01 2007-1-11
c语言,
突然有个问题, sizeof操作, 是什么时候运行的?
sizeof中的类型在编译时是确定的,所以应该是在编译时就确定了sizeof的结果。但,是否存在sizeof(A)中A的类型不确定的情况呢?
思,查***
20:45 2007-1-12
嵌入式, Linux, 书***
1, 嵌入式设计及Linux驱动开发指南——基于ARM9处理器(第2版), 孙天泽, 袁文菊, 电子工业出版社, 49RMB, 2007-1
该书使用ARM S3C2410处理器和Linux2.6内核, 是综述类书籍, 很适合初学参考.
2, 嵌入式系统接口设计与Linux驱动程序开发, 刘淼, 北京航空航天大学出版社, 39RMB, 2006-6
本书重点是着重接口原理. 感觉写的很好, 很适合与Linux设备驱动相互补充.
3, Linux设备驱动(第三版), 有电子版
3, ARM嵌入式Linux系统构建与驱动开发范例, 周立功, 陈明计, 陈渝, 北京航空航天大学出版社, 38RMB, 2006-1
本书同时分析了接口原理和Linux驱动的基本结构, 也很不错. 缺点是有些叙述明显啰唆.
21:54 2007-1-12
22:10 2007-1-12
Linux, 文件系统
ls -ia
i表示列出inode和文件名.
23:26 2007-1-12
Linux, 文件系统, Unix/Linux编程实践教程
P105, spwd.c
1, 虽然经过检查但是仍然出错3处. 其中一处是"syntax error at end of input",根据C8051项目经验,很可能是"{", "}没有配对。于是在结尾多加一个"}",该错误消失(当然,由于多了"}",会在原有出错行后面引入其它新错误)。于是自最后向前检查,发现是“inum_to_name”函数中的while循环的括号不匹配。
2, 编译通过后,运行提示"Cannot stat ,: No such file or directory",开始以为是所在目录名有空格的原因,但是在其它目录仍然报告同样的错误。于是用gdb跟踪程序,发现错误是第一次递归时出现的,而且直到“my_inode=get_inode(".");”函数之前都正常。于是重点查这个函数,突然发现上面这句话中的"."写成了","。又是笔误。到目前,这个不到100行的代码,在编译前有四处笔误没有发现。
3, 根据书上提示,尝试在挂载根目录下的的其他文件系统下运行。在"/usr/src/src2"运行时(src2是其它硬盘分区挂载到Linux分区的),出错“error looking for inum2”,怀疑就是书上所说的原因——现有spwd仅仅能搜索一个文件系统的目录树。
4, 明天继续读完本书的本章内容。//2007-1-12 23:52
9:20 2007-1-13
Linux, shell
wc -l filename
显示该文件的行数,可以用于log助手(logAssistant)中计算文件的行数,改进现有办法。现有办法是在文件末尾提前插入日期标志,避免最后一条信息无法显示。
9:34 2007-1-13
Linux
man -a commandName
显示所有符合commandName的手册。按q退出第一个手册后,man命令会自动打开下一个直到最后一个相符的手册。
10:33 2007-1-13
Linux, pwd
spwd.c
两个问题:
1, 为什么遇到"."和".."inode相同,但程序没有停止;
程序在/usr/src/src2/snapgear-p29/开始运行,处于“/usr/src/src2/snapgear-p29/”目录时,"."的inode是2,".."的inode也是2。处于"/usr/src/src2/"时,"."(即this_inode)的inode是2,".."的inode也是570560。所以没有相同,因此程序继续运行。
(13:42 2007-1-13)
发现出错原因可能由于Linux版本不同。使用readdir时,找到“/usr/src/src2”的"."和".."目录的inode是相同的。如果使用get_inode函数(调用stat函数),找到“/usr/src/src2”的"."和".."目录的inode是不同的。不同。说明readdir调用不能跨越文件系统,stat可以跨越文件系统。
2, 如何显示从根目录开始的完整路径。根据mount手册当前挂载信息保存在“/etc/mtab”。
(14:18 2007-1-13)没有头绪,暂时放弃这个任务,待完成***
12:46 2007-1-13
自醒, 计划, 表达
还是太没有计划性。自己总是安排不好。
既然需要孙建辉看原理图,就应该早点提醒孙建辉学习protel的基本使用。还有告诉王龙伟和王宁毕设情况时也没有说清楚,结果昨天他两个人又问我。如何提高表达能力?
13:56 2007-1-13
Linux技巧
使用man命令查看手册时,可以使用":s"命令保存该手册。
19:21 2007-1-13
c语言编程
从18:03-现在,一个多小时时间,调试c语言的抽象思维的figure7-2。程序本身约使用了30分钟。同时借此机会学习了rand(), srand(), time()等函数。后来在处理输入参数时出了问题。使用scanf读入要生成的数字序列长度,如果输入字符,就会出错:scanf语句不起作用,仅仅是一遍一遍显示提示输入数据的信息。后来参考《c语言的抽象思维》的读取整数的方法。发现比想像的复杂很多,晚饭回来看。今天要simpio.c看完,并且把《c语言的抽象思维》的那些库函数在Linux下生成为库。
23:04 2007-1-13
c语言编程, Unix/Linux编程实践教程
simio.h,查下列函数:
Error(),错误处理。
23:15 2007-1-13
c语言编程, Unix/Linux编程实践教程
The ususl skip of leading white space is suppressed. To skip white space first, use an explicit space in format.
16:38 2007-1-16
网站, 中国学术会议在线
http://211.68.23.76/a.asp
21:16 2007-1-16
要做的事
1, 学习如何使用Linux下命令行ftp工具:wget
21:41 2007-1-16
嵌入式系统, PCMCIA接口***
《32位嵌入式系统系统设计与调试》第十章分别有用PCMCIA专用芯片和组合逻辑实现的嵌入式系统的PCMCIA扩展。书中组合逻辑实现部分可供使用FPGA实现时参考。
19:39 2007-01-16
Linux, PCI, 驱动, 模块
1, pci_device_id是什么含义, 在何处定义?
#define MODULE_DEVICE_TABLE(type,name) \
MODULE_GENERIC_TABLE(type##_device,name)
根据"linux/module.h"的注释, 可知MODULE_DEVICE_TABLE后面的第一个参数是一个已知的数据类型, 第二个参数是一个c数据类型, 用于传递设备信息.
很多地方都有"##", 是什么意思?待查***
2, pci_read_config_byte(dev, PCI_REVISION_ID, &revision);
(1) pci_read_config_byte定义位于"linux/pci.h", 如下:
#ifdef CONFIG_PCI
...
static inline int pci_read_config_word(struct pci_dev *dev, int where, u16
*val){
return pci_bus_read_config_word (dev->bus, dev->devfn, where, val);
}
...
#else
...
#define _PCI_NOP(o,s,t) \
static inline int pci_##o##_config_##s (struct pci_dev *dev, int
where, t val) \
{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
#define _PCI_NOP_ALL(o,x) _PCI_NOP(o,byte,u8 x) \
_PCI_NOP(o,word,u16 x) \
_PCI_NOP(o,dword,u32 x)
_PCI_NOP_ALL(read, *)
#endif
pci_bus_read_config_word在何处定义? 查***
这里的_PCI_NOP定义方式和Linux2.4内核中定义PCI_OP的方法类似. Linux2.4内核中PCI_OP宏定义int pci_read_config_word等函数. 替换过程简单表示如下:
_PCI_NOP_ALL(read, *) -> _PCI_NOP(read,byte,u8 x) -> static inline int
pci_read_config_byte (struct pci_dev *dev, int where, t val) ...
struct pci_dev位于"pci/pci.h",
PCI_REVISION_ID位于"linux/pci.h",#define PCI_REVISION_ID 0x08 /* Revision ID */
Revision ID 起什么作用? 查***
这些定义的信息可以用"cat /proc/pci"看到
3, 获取当前系统的PCI信息
lspci | cut -d: -f1-3
或cat /proc/bus/pci/devices | cut -f1
cut通过分隔符提取指定列。
其中前者系统管理员才能使用. 二者转换公式为
e.g. 0x00a0=0000:00:14.0, 后者的domain 16bits, bus 8bits, device 5bits, function 3bits.
Linux设备驱动中提到的(P305)tree命令, 不知为什么没有.
4, 根据PCI代码, 学习函数指针1
5, 学习Linux驱动中模块的原理, 接合刘淼驱动的书.
查***: module_init, module_exit ...
6, (20:38 2007-1-16)
大致阅读了pci_skel.c, 编译并运行.
7, (22:05 2007-1-16)
Cardbus是笔记本使用的总线.
8, PCI_DEVICE和PCI_DEVICE_CLASS位于"linux/pci.h".
9, (22:55 2007-1-16)
"Linux内核源代码情景分析"阅读到P188页. 阅读完该书PCI部分后, 可以阅读P419USB部分理解PCI总线的使用, 因为USB总线是基于PCI总线的设备.
Linux, PCI, 驱动, 模块
1, pci_device_id是什么含义, 在何处定义?
#define MODULE_DEVICE_TABLE(type,name) \
MODULE_GENERIC_TABLE(type##_device,name)
根据"linux/module.h"的注释, 可知MODULE_DEVICE_TABLE后面的第一个参数是一个已知的数据类型, 第二个参数是一个c数据类型, 用于传递设备信息.
很多地方都有"##", 是什么意思?待查***
2, pci_read_config_byte(dev, PCI_REVISION_ID, &revision);
(1) pci_read_config_byte定义位于"linux/pci.h", 如下:
#ifdef CONFIG_PCI
...
static inline int pci_read_config_word(struct pci_dev *dev, int where, u16
*val){
return pci_bus_read_config_word (dev->bus, dev->devfn, where, val);
}
...
#else
...
#define _PCI_NOP(o,s,t) \
static inline int pci_##o##_config_##s (struct pci_dev *dev, int
where, t val) \
{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
#define _PCI_NOP_ALL(o,x) _PCI_NOP(o,byte,u8 x) \
_PCI_NOP(o,word,u16 x) \
_PCI_NOP(o,dword,u32 x)
_PCI_NOP_ALL(read, *)
#endif
这里的_PCI_NOP定义方式和Linux2.4内核中定义PCI_OP的方法类似. Linux2.4内核(参, Linux内核源代码情景分析, 以下关于2.4内核如无说明都自本书)中PCI_OP宏定义int pci_read_config_word等函数. 替换过程简单表示如下:
_PCI_NOP_ALL(read, *) -> _PCI_NOP(read,byte,u8 x) -> static inline int
pci_read_config_byte (struct pci_dev *dev, int where, t val) ...
struct pci_dev位于"pci/pci.h",
PCI_REVISION_ID位于"linux/pci.h",#define PCI_REVISION_ID 0x08 /* Revision ID */
Revision ID 起什么作用? 查***
这些定义的信息可以用"cat /proc/pci"看到
(2) pci_bus_read_config_word在"/driver/pci/access.c"定义:
#define PCI_byte_BAD 0
#define PCI_word_BAD (pos & 1)
#define PCI_dword_BAD (pos & 3)
#define PCI_OP_READ(size,type,len) \
int pci_bus_read_config_##size \
(struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
{ \
int res; \
unsigned long flags; \
u32 data = 0; \
if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \
spin_lock_irqsave(&pci_lock, flags); \
res = bus->ops->read(bus, devfn, pos, len, &data); \
*value = (type)data; \
spin_unlock_irqrestore(&pci_lock, flags); \
return res; \
}
..
PCI_OP_READ(byte, u8, 1)
PCI_OP_READ(word, u16, 2)
PCI_OP_READ(dword, u32, 4)
...
EXPORT_SYMBOL(pci_bus_read_config_byte);
EXPORT_SYMBOL(pci_bus_read_config_word);
EXPORT_SYMBOL(pci_bus_read_config_dword);
pci_bus_read_config_word定义结束.
宏替换与(1)类似. "if (PCI_##size##_BAD)"是监测是否地址对齐. 对于pci_bus_read_config_byte来说, 是"if ( pos & 1 )" 在"drivers/pci/pci.c"中"__pci_bus_find_cap"函数调用了该函数: pci_bus_read_config_word(bus, devfn, PCI_STATUS, &status);
在linux/pci_regs.h中: #define PCI_STATUS 0x06 /* 16 bits */
16位地址是最低位为零的地址, (pos&1)是判断最低位是否是0, 如果是零说明16位地址对齐. 例如, 0x06 & 1 = 0, 所以"return PCIBIOS_BAD_REGISTER_NUMBER;"不会执行. (pos&3)同理是判断32位地址是否对齐.
PCIBIOS_BAD_REGISTER_NUMBER位于"linux/pci.h"
spin_lock_irqsave()是保存中断的当前状态, 并禁止本地中断, 然后在去获取指定的锁.
(Linux内核设计与实现P110), spin_unlock_irqrestore()相反.
和2.4的不同, 2.6.19.2中:
res = bus->ops->read(bus, devfn, pos, len, &data); \
*value = (type)data;
在2.4(Linux内核源代码情景分析P186)中:
res = dev->bus->ops->read_word(dev, pos, value);
区别:
2.6使用read, 用len设置读入字节长度. 2.4中分别使用read_byte, read_word,
read_dword实现.
EXPORT_SYMBOL()和EXPORT_SYMBOL_GPL()都是导出符号表的宏定义, 导出的函数才可以被模块调用, 只是后者只能用于满足GPL协议的模块. bamvor: 还是不明白, 再查***
(3) (9:45 2007-1-18)
(3-1)继续分析"pci_bus_read_config_##size",以"pci_bus_read_config_byte"为例. 前面分析了每一句的含义, 现在详细分析: "res = bus->ops->read(bus, devfn, pos, len, &data);"的细节.
read函数的原型: 在 struct pci_ops中定义, 结构如下:
在"linux/pci.h"中, 有
struct pci_bus {
...
struct pci_ops *ops; /* configuration access functions */
...
}
struct pci_ops {
int (*read)(struct pci_bus *bus, unsigned int devfn, int where, int
size, u32 *val);
int (*write)(struct pci_bus *bus, unsigned int devfn, int where, int
size, u32 val);
};
val是u32类型, 所以需要强制转换为type类型: "*value = (type)data;".
read函数是与体系结构相关的通过raw_pci_ops->read调用"pci_conf1_read", 对于i386位于"arch/i386/pci/common.c". 这与2.4内核不同, 2.4内核直接由read函数调用"pci_conf1_read". 查***: 为什么要加入"raw_pci_ops".
static int pci_read(struct pci_bus *bus, unsigned int devfn, int where, int
size, u32 *value)
{
return raw_pci_ops->read(0, bus->number, devfn, where, size, value);
}
struct pci_ops pci_root_ops = {
.read = pci_read,
.write = pci_write,
};
在direct.c, 根据1型和2型分别定义
struct pci_raw_ops pci_direct_conf1 = {
.read = pci_conf1_read,
.write = pci_conf1_write,
};
static struct pci_raw_ops pci_direct_conf2 = {
.read = pci_conf2_read,
.write = pci_conf2_write,
};
(3-2)以1型为例, 分析pci_conf1_read:
#define PCI_CONF1_ADDRESS(bus, devfn, reg) \
(0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3))
int pci_conf1_read(unsigned int seg, unsigned int bus,
unsigned int devfn, int reg, int len, u32 *value)
{
unsigned long flags;
if ((bus > 255) || (devfn > 255) || (reg > 255)) {
*value = -1;
return -EINVAL;
}
spin_lock_irqsave(&pci_config_lock, flags);
outl(PCI_CONF1_ADDRESS(bus, devfn, reg), 0xCF8);
switch (len) {
case 1:
*value = inb(0xCFC + (reg & 3));
break;
case 2:
*value = inw(0xCFC + (reg & 2));
break;
case 4:
*value = inl(0xCFC);
break;
}
spin_unlock_irqrestore(&pci_config_lock, flags);
return 0;
}
i) PCI_CONF1_ADDRESS宏是根据CF8寄存器要求的格式生成地址 --
1 | 保留不用(7位) | 总线号(8位) | 设备号(5位) | 功能号(3位) | 寄存器地址(8位)
(最高位为1) 最低两位为零
ii)
分别考虑不同长度(1,2,4字节), 2.4中是三个函数. 另外, inb/inw/inl/outb/outw/outl是对IO操作的函数, 对于i386体系结构, 位于"asm-i386/io.h"(文件开始的注释是这么写的),.
我理解是从
BUILDIO(b,b,char)
BUILDIO(w,w,short)
BUILDIO(l,,int)
开始, 通过一系列"#define"和内联函数实现, 没看懂:(, 以后再看.***.
作者是这样解释为什么会如此的繁琐:
* This file is not meant to be obfuscating: it's just complicated
* to (a) handle it all in a way that makes gcc able to optimize it
* as well as possible and (b) trying to avoid writing the same thing
* over and over again with slight variations and possibly making a
* mistake somewhere.
"这个文件并不是混乱不堪的. 把它写的如此的复杂有两个目的: 其一,
如此实现这些函数可以使gcc能对代码进可能的进行优化; 其二, 如果单独实现每个函数,
每个函数之间的差异很小, 很容易出错.
"
i386体系结构中预留CF8(地址寄存器)和CF7两个寄存器(数据寄存器).CPU借此向"宿主-PCI桥"发出指令, 由相应的PCI桥, 间接完成具体的读写.
查为什么read函数使用指针(u32 *val), 而write函数直接使用数值(u32 val).***
3, 获取当前系统的PCI信息
lspci | cut -d: -f1-3
或cat /proc/bus/pci/devices | cut -f1
其中前者系统管理员才能使用. 二者转换公式为
e.g. 0x00a0=0000:00:14.0, 后者的domain 16bits, bus 8bits, device 5bits, function 3bits.
Linux设备驱动中提到的(P305)tree命令, 不知为什么没有.
4, 根据PCI代码, 学习函数指针1
5, 学习Linux驱动中模块的原理, 接合刘淼驱动的书.
查***: module_init, module_exit ...
6, (20:38 2007-1-16)
大致阅读了pci_skel.c, 编译并运行.
7, (22:05 2007-1-16)
Cardbus是笔记本使用的总线.
8, PCI_DEVICE和PCI_DEVICE_CLASS位于"linux/pci.h".
9, (22:55 2007-1-16)
"Linux内核源代码情景分析"阅读到P188页. 阅读完该书PCI部分后, 可以阅读P419USB部分理解PCI总线的使用, 因为USB总线是基于PCI总线的设备.
12:43 2007-01-17
Linux, 技巧, 同步
sync: 强迫将已更改的数据写入磁盘,并更新超级块。
卸载移动设备之前运行sync, 可以避免对移动设备的修改没有生效.
13:04 2007-01-17
Linux, PCI, 驱动
pci_(read|write)_config_(byte|word|dword)如果成功返回0, 否则返回一个错误代码 (PCIBIOS_...)可以由pcibios_strerror转换为字符串
19:06 2007-01-17
Linux, 模块,
自: Linux内核设计与实现: P225-P226
1, 编译模块:
Makefile中: obj-m := finishing.o
...
编译:
make -C /kernel/source/location SUBDIRS=$PWD modules
2,载入和卸载模块
modprobe modulename
modprobe -r modulename
modprobe可以根据依赖关系确定除了modulename以外要载入和卸载的模块. 比insmod和rmmod智能.
3, 模块的配置. 同一本书, P227
20:43 2007-1-19
我的发展方向, 兼职, 吴老师***
吴老师希望实习时每周有两天可以在实验室学习. 觉得我做的嵌入式软件比做后端之类的应该多积累一些,发挥微电子专业和软件综合的特长。
bamvor: 这和我的想法基本相同。
22:07 2007-1-19
LED项目进展
1, 硬件
(1)光敏电阻/蓄电池与电阻分压以后的电压可以被AD读取, 设置两个域值时, 结果正确. 待做: 详细测试AD转换的结果(精确两位小数).
(2)光敏电阻电阻的测试: i, 晚上窗户外: 300K; ii, 晚上1403室内两个白炽灯: 70k; iii, 晚上1403室内一个远处白炽灯: 140k; iv, 待做: 白天各时段测试光敏电阻阻值.
(3)继电器: PIC单片机无法直接驱动. 待做: 用射频跟随器放大电流后, 驱动继电器.
2, 软件
(1) 单片机开发板(PIC16F877A). 可以运行LED测试程序的部分代码. 现在控制开发板上的LED灯仍有问题. 待做: 用单片机正确显示AD采样电压. 配合硬件(1)测试.
bamor: 总体感觉软件压力比较大.
14:17 2007-1-21
LED灯项目进展
1, 硬件.
1)张旺在三极管和继电器之间加入了射级跟随器。这样就可以PIC单片机就可以驱动继电器了。但现在最低的系统电源电压在4.7伏(相当于加给继电器3.5v电压)以上继电器才能吸合,解决方法:(1)减小Rb,这样就减小了从vb到继电器的电压降。(2)更换继电器,选择3v继电器或者需要更小驱动电流的继电器(***告诉张旺)。
2)昨天说的白天测光敏电阻阻值还没有做。
2, 软件进展不大。孙建辉觉得买的PIC开发板还是有问题。我让他自己焊接一个板子。晚上看进展。希望他们能考虑到以后连线方便,把PIC单片机放在中间。如果没有放在中间。就用7*2的排线(MSP430JTAG接口上有)或单跟的连线把线引出去。***
9:54 2007-1-22
LED灯项目进展
硬件需要考虑,如果太阳能电池板输出电压过高,需要接稳压管或稳压元件(是否需要精确控制电压为14.7v?)。
3月出样机后,可以在实验室内放一个灯,测试软件和硬件稳定性,重点是软件实时时钟是否准确,硬件蓄电池充放电是否正常。
10:10 2007-1-22
网址, 公司, Maxim, RS232
http://www.maxim-ic.com.cn/
技术支持, 中国: (010) 6211 5199
10:31 2007-1-22
网址, 电子
http://www.etuni.com/
电子爱好者网
http://www.21ic.com/
21IC中国电子网
11:59 2007-1-22
LED灯项目进展
硬件, 测试太阳能电池板:(已给张旺)
上午:
9:50. 1403窗边, 12v电池板: 11.6; 3v电池板: 3.5v;
12:00, 1403窗边, 12v电池板:13.59,13.80; 3v电池板:4.39,4.49.
12:43 2007-1-22
编程, 技巧, Linux编码风格, coding style
1, Linux编码风格见《Linux内核设计与实现》(第二版), P267-P272。可以用indent工具格式化代码,例如下面语句格式化为Linux编码风格:
indent -kr -i8 -ts8 -sob -l80 -ss -bs -ps1 <file>
还可以通过sripts/Lindent自动按照所需格式调用indent
2, (11:41 2010-10-9)这次xiaotao实验, 发现需要去掉"-ps1".
indent -kr -i8 -ts8 -sob -l80 -ss -bs <file>
19:44 2007-1-22
LED灯项目进展
测试光敏电阻发现标称阻值相同的光敏电阻实际阻值变化很大,不能按照预想的测量临界天黑的电阻阻值的方法。现在想到的办法是用比例的方法解决不同电阻阻值差异大的问题。例如,如果不同电阻的“临界天黑电阻/亮电阻”是稳定的,那么“临界天黑电压/最亮电压”也是稳定的,并设此系数为M,单片机就可以使用M*(任一电阻的最亮电压)得到临界天黑电压,从而确定何时天黑。
注:临界天黑指设定的从天亮到天黑的临界情况。最亮电压指一天中最亮的时候的光敏电阻和分压电阻的分压值。
另外,由于人体电阻在1-2M,所以在测试暗电阻时不能用手按住电阻。可以用两个人各拿表笔按住电阻一端。
20:42 2007-1-22
去年乃燃跑LEON板子时借JTAG线的那个板子找到了,就在1409一个书柜里面。加在书中间。是偶然发现的。现在放在1409放板子的柜子中。是一个DELL的箱子,里面除了这个spantan的板子,还有vertixII的板子和一个实验室自己画的fpga板子。
20:56 2007-1-22
LED灯项目进展
一,蓄电池:
1, 什么是浮充,循环充电?LED项目需要选用哪个。没有查到含义。但是查到了使用情况:
(1)浮充:蓄电池长时间处于充电状态,只有意外情况处于放电状态;
(2)循环充电:蓄电池处于充放交替情况。
可见,LED灯项目需要使用循环充电方法。刚才去测量了蓄电池,两个电压都是6.54v,暂时不需要充电。等张旺做完项目PIC板子,然后做80个灯泡的LED灯,测试蓄电池寿命。上次计算寿命时时按照蓄电池容量计算的,这就是按照蓄电池完全放完电的情况计算的。但实际要根据查放电倍率,确定蓄电池放电电压。
2, 确定蓄电池放电电压
蓄电池容量是24Ah,80个灯泡的LED灯电流=20mA*20=0.4A。0.4A/C20=0.4A/24A<0.05,所以蓄电池放电电压应该是1.8*6=10.8v
二,LED灯
但是实测张旺买的LED只有6-7mA,很奇怪。用照度计测量亮度是否13000流明。问师姐要求是13000流明,最低8000-9000流明。80cm。
如果用LED测试仪,20mA时张旺LED明亮,感觉也在正常工作。
测试情况:师姐原来的LED灯,电流大约,师姐LED在2000以上。
三,晚上实测,把手伸出1403窗外,朝下,大约0.3流明。其它方向也在0.1-0.8之间
软件(22:56 2007-1-22)
完成8段数码管的正确显示。开发板上PNP三极管起使能作用。做板子时也可以这么做,这样就不用73LS373做锁存器了,面积可以节省很多。希望张旺还是把8段数码管做上。
23:23 2007-1-22
2003级本科毕设情况(加入前面本科毕设log)
康波寒假没有安排,开学后有一半时间做毕设。毕业后想做编程的工作,符合毕设内容。寒假画板子,开学后调硬件和软件。
达渭然寒假学日语,开学后有一半时间做毕设。毕业后想做编程的工作,符合毕设内容。由于寒假时间不足,我没有让他画板子。
赵杨,想做集成电路。除找工作外没有安排。我建议赵杨寒假跑我《Linux On LEON》文档内容。开学根据他的兴趣再做安排,可以考虑在学Linux驱动同时接触一些IC设计内容。
9:42 2007-1-23
LED灯项目进展
测量太阳能电池板,太阳不直射。(数据已给张旺)
12v电池板:11.02v。电池板中心照度6770流明;
3v电池板:3.98v。电池板中心照度6750流明;
13:34 2007-1-23
LED灯项目进展
实验如何使用8段数码管
PIC输出接用上拉电阻再接继电器能不能驱动继电器。
22:25 2007-1-23
液晶转接口(2.54转两个5*2插座),用于接S3C2410开发板。端口描述:
第一行是编号;第二行对应LCM引脚名。
GND
O 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
O GND EL-E RST CS2 CS1 DB7 DB6 DB5 DB4 DB3 DB2 DB1 VDD DB0 E DI RS V0 VDD GND
O (RW)
O
VEE
其中横排第八个引脚连接到了S3C2410开发板的电源(S3C2410开发板CON6,7,8之一的第二个引脚)。
13:49 2007-1-24
LED灯项目进展
今晚再采集两组光敏电阻数据,确定如何确定光敏电阻分压值。确定刚天黑的分压值阈值。
每隔一小时记录一次蓄电池电压。
20:29 2007-1-24
LED灯项目进展
1, 硬件:
明日任务:1), 换成15v稳压管,并实际测试稳压值;2), 接上六个8段数码管;3), 连接光敏电阻分压电路,再测一组光敏电阻数值。
这样让孙建辉完全在一个板子上跑程序。
2, 软件:
正在调试实时时钟。完成实时时钟后,跑总体程序。如果有时间再丰富功能(晚上车灯问题,光敏电阻使用几个保证采光(可以考虑用四个,每个方向各一个;以及尘土造成的光敏电阻阻值变化如何解决)
经验:用单片机烧录器烧写完代码后,最好先把离烧录器远端的电源,如果拔烧录器的电源容易烧毁烧录器。***
20:59 2007-1-24
Linux, samba, smb.conf
testparm用于检查"/etc/samba/smb.conf"文件是否有语法错误。
14:31 2007-1-25
网址, 发光二极管, 数码管, LED灯项目
1, http://www.oneled.com/
深圳市星晨光电有限公司-发光二极管、LED灯、七彩LED、七彩LED灯,大功率LED、白光LED、蓝光LED、绿光LED、双色LED等发光二极管
有表贴LED。
2, http://www.gdjiafeng.com/index.asp
广东佳锋光电有限公司
http://www.ldled.com/
力达电子
http://www.led-china.com/
深圳市佳美光电电子有限公司,比较专业,有“常见问题”。
1, 都有发光二极管, 8段数码管, 点阵数码管等产品. 市场上各种封装的LED都有, 有时不知道引脚定义, 可参考网站上的产品原理图结合万用表LED档判断引脚.
14:36 2007-1-25
LED项目进展
4位8段数码管的引脚定义见项目文档.
14:42 2007-1-25
网址, PIC单片机, LED项目
http://forum.microchip.com/
microchip论坛
http://forum.microchip.com/tt.aspx?forumid=41
8位PIC单片机定时器分论坛
15:03 2007-1-25
PIC单片机, LED项目
LED项目进展
实时时钟
1, 应用笔记AN582 Lower-Power Real Time Clock
2, 数据手册PIC16F87XA,p78。
另外, PIC16FX的汇编有if语句,这比一般的宏汇编好。
if ( Debug )
bcf PORTD, 0 ; Set low, use to measure total
time in Int Service Routine
endif
16:17 2007-1-25
公司, 半导体, 飞利浦
NXP Semiconductors,原飞利浦半导体
17:10 2007-1-25
LED项目进展
1, LED灯电流下降,开始是0.34A,现在是0.29A,原因?
是否是LED灯老化?每个小时以后每个小时都要测电流。
如果有明显下降,明天与师姐讨论。
2, 17:16测太阳能电池,大约270流明。12V太阳能板大约1.2v,3v太阳能板大约0.58v。远远小于要求的电压,明天要更早写测量。
20:27 2007-1-25
LED项目进展
突然有个疑问,LED灯问什么用12v电压,如果用6v,可以减小很大的体积,而且一天中充电时间还可以延长。
回答:为经过师姐前期调研发现现有太阳能灯都是12v的,做成12v是为了与别人的产品接轨,与别人的配件匹配,避免后遗症。
bamvor: 前期调查很重要!!!了解别人的性能和规格。
8:46 2007-1-26
LED项目进展
1, 太阳能电池板电压
测量太阳能电池板,太阳不直射。(数据已给张旺)
12v电池板:9.58v。电池板中心照度4785流明(精确到十位);
3v电池板:3.60v。电池板中心照度4805流明(精确到十位);
2, 需要读取测试数据,例如,每天有几个小时的充电时间,蓄电池充了多少电(以电压计算);亮灯过程中蓄电池电压变化多
少;每天何时开灯何时关灯。PIC单片机写入flash的数据能否读出(看烧录器是否有此功能)?如果不行用msp430检测。学习MSP430或2410写flash的方法,参考应用笔记。
11:18 2007-1-26
LED项目进展, 经验
阻排(排阻)分不同的连接关系,购买时要注意。前天请师姐帮忙买的阻排连接关系就不是需要的。
例如,SA472J是有一个公共端,其余端口都有4.7k电阻的阻排。
相关网址:
http://www.bourns.com/chineseS/2/comp_6.html
http://electron.chinavendors.com/8PIN-resistor.htm
12:27 2007-1-26
LED项目进展
12月27日计划:
1, 软件:
bamvor: 由于解决了问题(5),所以(1)-(4)和(6)暂时不需要解决。
(1)测试定时器1溢出后,是继续进行计数还是等待程序把计数值清零后再开始计数。(孙建辉)
(2)解决数码管时间显示中小时计数的不正常。昨天的实验结果:实际时间经过了10小时23分钟(23:57:10--10:15:33),但是单片机显示时间经过了(00:05:00--02:18:00)。(孙建辉)
(3)定时器1工作在同步方式还是异步方式,对计时有没有影响;(孙建辉)
(4)定时器定时正常计数时,有可能重新开始计数。孙建辉张健观察到二次到6分钟时重新计数.(孙建辉)
(5)有"2:60"的情况,应该是"2:58"->"3:00",而不是"2:58"->"2:60"->"3:00"(孙建辉)
经过测试,发现定时误差在此。这是一个“边界”的错
误,是张健偶然发现的,原来做光栅项目时也出过类似错误。
bamvor: 说明到现在我写程序还是没有很好的测试的习惯!!!
(6)如果(1)的结果是定时器1溢出继续进行计数,可以直接在while(1)循环中查询定时器是否到时,这样就暂时解决了实时时钟问题。中断出问题的原因以后再解决。(孙建辉)
2, 硬件
(1)修改八段数码管的连接方式:把php管基级接上变阻器,设定阻值为4.7k,调整一个合适的电阻阻值保证pnp管在单片机高电平(实验数据:4v-5.5v)时可以正常起到放大作用。(张健,完成)
(2)查找稳压管使用方法。经过张旺测试现有电路无法起到稳压的作用。(张旺,失败)
(3)测量下午几点太阳能电池板电压小于15v,从三点开始测量,根据情况选择时间间隔。记录两块太阳能电池板电压和照度(单位:流明)。
(张健,明天早起)
13:23 2007-1-26
LED项目进展
昨天张旺焊接上八段数码管后,发现6个数码管都在闪烁,如果拔掉最后一个数码管的公共端(秒的个位)。闪烁会慢很多,经过对比发现闪烁的时候正是单片机向数码管写入数据的时候。开始以为是电源供电问题,后来发现不是。孙建辉偶然调整电压时发现是加在pnp三极管基级的电压太高了,大于2.5v时无法正常显示,大家都觉得奇怪。回宿舍途中,张健偶然问张旺,知道基级没有接电阻。是张健告诉张旺如何连接时忘了说基级要加电阻。
bamvor: 暴露两个问题1)一个小修改用了三个人,人与人任务交接的地方容易出问题;2)心不细。可以考虑用文档保证不会遗漏。
19:00 2007-1-26
LED项目进展
下午LED项目总结
1, 在PNP晶体基级接上电阻开始芯片不工作,电压正常,4MHz晶振正常,32k晶振不正常(波形见下图,频率是4MHz)。后来发现是张健没有接复位引脚。
bamvor: 说明基本功还是不行,用芯片怎么能没有考虑复位!!!
2, PNP晶体基级接上电阻的实验结果,如果不接第五位(小时个位),可以工作在4.8v。第五位接上后该位显示8,而且其余五位显示闪烁,现象像是PNP管子工作状态有问题(需要比较第五位与其它位PNP管子工作状态***)。
3, 稳压管工作有问题。起不到稳压作用。
20:02 2007-1-26
LED项目进展
1, 吃完饭发现问题2又没有问题了。怀疑是PNP暂时性损坏,长时间不用后,PNP管恢复了正常。
2, 经分析,当PNP发射极电压高时,数码管闪烁是由于BE结一直反偏。因为BE结需要反偏使数码管无效,正偏选中数码管。决定为集电极分压到2.4k左右,一是保证BE结可以正偏和反偏。二是,数码管限流,避免数码管快速老化。
21:31 2007-1-26
LED项目进展
1, 三端稳压器:6.4v时输出4.01,可以使系统工作;7.5v时输出5.00v,测试到15v时稳定在5.09v,12v(蓄电池电压)时5.09v。
2, 在电源和地之间接了一个20k的电位器,分压结果接到PNP管的发射极,分压结果是4.03v。这样即解决了三极管发射极需要单独电源的问题,也适当降低了数码管电流,延长了数码管的寿命。
3, 稳压管:
不接稳压管时电压 稳压电压 流过稳压管的电流
20v 14.9v 0.56mA
15v 14.9v 3.6uA
注:并没有实际使用太阳能电池板测试,使用直流电源做为输入稳压管无法稳压。测试时使用一个100k和10k的分压电压,10k电阻接直流电源正极,稳压管接在100k两端,100k电阻接地。把100k电阻的输出做为模拟的电源。
4,(22:51 2007-1-26)
新测试一个师姐买的4MHz晶振,可以起振(3.98MHz),但精度不高。
5, 明天任务:
(1)软件周末完成顶层,下周一开始第一次测试;
(2)周六上午测试直接把太阳能灯接在稳压管两端能否稳压。测量何时太阳能电池板电压可以超过15v,何时低于15v。
(3)整理蓄电池数据
23:48 2007-1-26
LED项目进展
使用32.768k晶振,重新烧录一个芯片,又出现了第二位(小时的个位)有问题的情况。怀疑是IO口问题,因为把第二位接到其它位时,其它位也显示不正常让建辉把小时个位显示到小时的十位,小时的十位不显示。测试发现小时个位显示正常。更怀疑是IO口问题。明天继续分析。
13:59 2007-1-27
LED项目进展
1, 软件:
(1)测试方法,加入按键。
按键1:按下后时间变为23:59:50;
按键2:按下后时间变为4:59:50;
(2)LED灯的刷新
现在使用delay1ms(for循环实现),改为用中断做定时。
测试最低的刷新频率。
(3)数码管小时个位的问题。
怀疑是IO口的问题。测试RB0到RB5六个IO口输出高低电平时的电流是否有差异:按键1按下输出六个IO口输出高电平。按键1抬起六个IO口输出低电平。RD0到R
D7输出八段数码管的零。
2, 硬件
(1)太阳能电池板给蓄电池充电问题。
师姐分析:10k电阻大于蓄电池内阻,所以电压主要很多降在蓄电池上。用1欧姆电阻时,1欧姆又小于太阳能电池板内阻,这样太阳能电池板自身压降很大。师姐估计是100欧姆***试验。
不要忘了需要加一个阻塞二极管限流(1N4007),避免太阳能电池板低于蓄电池电压时蓄电池电流流向太阳能板。
14:39 2007-1-27
LED项目进展
孙建辉计划:
解决方法:使用timer1shixiangai.c
1 移动delay_ms(1)的位置到for前看是否显示正常。去掉delay_ms(1),看其能显示吗? 即delayms(0);
2 改变delay_ms(1)的值,看其最大值是多少??既到不能正常刷新时,闪烁时的delay值!!
3 使用timer0中断实现刷新;(因为软件延时影响扫描速度!!!!!)
4 将timer1(SHI_JIAN_KONG();) ,timer0(刷新显示时间) (的中段标志放在一个数组中,分别扫描(更 好的方法:使用队的方法,问张健)
15:49 2007-1-27
1月26日实时时钟测试:
实际时间23:53:14--9:46:31
板子时间00:01:28--9:54:42
板子9小时53分17秒慢了3秒,误差=3/(9*3600+53*60+17)=0.00843%=万分之八。这小于晶振的误差0.7%,这点很奇怪。
16:23 2007-1-27
实验室。
吴老师给200,吃饭120。剩80。
16:32 2007-1-27
LED项目进展
测试数据
流明26890-28050。电压19.33
太阳能18.98v,蓄电池11.94v,直接把太阳能电池加到蓄电池上,蓄电池电压为11.98v。
师姐说原因是蓄电池内阻小,太阳能电池内阻大。
19:40 2007-1-27
封装, PCB版图
封装尺寸一般是"英寸(毫米)"这种表示方法.
18:34 1980-1-28
公交卡
自: http://new.smth.org/bbstcon.php?board=Embedded&gid=75141
1, 刷卡原理是在卡机中内置票价方案,刷卡的同时对卡进行读写(一个rf卡内有若干加密逻辑区域,可以进行读写操作),减扣预存款(此时卡内的金额已经发生了变化),刷卡记录存在卡机内的存储器中,车回总站后数据被下载到总站服务器,然后传回公交公司,再汇总到结算中心,最后到合作银行完成票款分账。
2, nod.
科普一下:
IC卡读写均有密码,而且密码尝试错3次以上卡片可以自动销毁,就报废了。所以,除非有内鬼,否则破解几乎不可能。IC卡片本身成本并不低,读写设备更是昂贵。穷举就不要想了。所有的IC卡大多是离线交易,即所谓的电子钱包。数据都存在卡本身里面。公交车的刷卡器也会存储交易数据。然后回到公交公司再做数据交换。
18:39 1980-1-28
显示, 待查
http://new.smth.org/bbstcon.php?board=Embedded&gid=75165
扩展一个2D加速卡
比如2440+SM501方案
19:50 1980-1-28
MSP430
DCO: Digitally Controlled Oscillator,数字控制振动器
13:51 2007-1-29
LED项目进展
PIC单片机选型,考虑从PIC10到PIC18系列的所有flash和OTP的单片机,最终单片机千片价格估计在1$一下。
PIC16C717 1.65$
PIC16F677 1$
最终产品大量样机时要考虑几个因素:
1, 有EEPROM,便于读取数据,进行改进;
2, I/O留有富裕;
3, 足够的rom和ram。
14:09 2007-1-29
网址, 公司, 嵌入式, 电源管理
http://www.md-ic.com.cn/index.htm
上海明达微电子有限公司
14:14 2007-1-29
网址, PIC论坛
http://www.picpic.cn/index.php
PIC单片机大本营
20:11 2007-1-29
技巧, PCB原理图, PCB版图, protel
如何根据已有库编辑新的库?
1, 打开一个已有的库;
2, 在Workspaces Panel中有PCB Library或SCH Library,在其中选择合适的元件;
如果没有找到,可以在“View->Workspaces Panel->PCB->PCB Library”或“View->Workspaces Panel->SCH->SCH Library”打开该面板。
3, 复制该元件并粘贴到新元件中。(执行Tools->New Component)
20:42 2007-1-29
嵌入式, 书, Linux, 驱动
《嵌入式设计与Linux驱动开发指南——基于ARM9处理器》(第二版),孙天泽。电子工业出版社。49元。
和李驹光那本4510类似,很适合入门。
23:37 2007-1-29
LED项目进展
1, 硬件
(1)现在发现的问题只有太阳能电池板给蓄电池充电没有解决。经过周六,周一测试结果仍然不能让人满意,经测试周一下午蓄电池电压为12.5v,但是到了晚上蓄电池电压恢复为11.89v,这和试验之前的电压基本相同,说明基本没有充电(明天告诉师姐)。觉得使用三端稳压器和DC-DC试试。
(2)蓄电池使用情况:
除了开始的虚电,每天放电大约0.4-0.6v。
(3)需要高精度32.768晶振。
2, 软件
张旺和孙建辉在周日下午进行了整体的调试。发现AD输入的阈值不能简单设置为一个固定值,AD输入电压会有50mV的波动,所以阈值应该是一个范围。现在是大于2.6v认为是天黑,小于2.4v认为是天亮。周日下午的测试没有发现其他问题。
软件还需要实现的细节:
(1)配合调试的按键。第一次按下按键3时间变为23:59:50,验证能否关灯。第二次按下按键3时间变为4:59:50,验证如果亮一晚上,到凌晨5点是否关灯;或者是如果到0点已经关灯,到凌晨5点是否恢复了对天亮和天黑的检测。第一次按下按键4表示系统进入0点关灯状态,对应LED灯亮,第二次按下按键4表示系统进入整夜亮灯状态,对应LED灯灭。
(2)设置时间。按下按键1后,进入时间调整状态(使用INT中断实现),每按一次按键,在小时,分钟,秒和正常显示三种状态中切换。按键2按下一次,对应时间数值加1。时间调整过程中,时钟正常运行。
(3)防止误操作。夜间车灯照射不能认为是白天。
(4)要使用看门狗。看门狗复位后,由于不能判断时间。所以运行状态改为仅仅根据光敏电阻开关灯。
(5)用LED下列状态:
LED1表示蓄电池高于最大电压(11),低于最大电压但高于最低放电电压(10),低于最低放电电压(00),LED2表示天亮和天黑。
10:05 2007-1-30
LED项目进展
MC34063相关网页
http://www.liuguo.net/Article/base/c/200611/594.html
http://www.tong-heng.cn/34063/34063.htm
http://class.ee.tnit.edu.tw/~s901009/new_page3.htm
快速开关二极管可以选用IN4148,在要求高效率的场合必须使用IN5819
11:04 2007-1-30
网址, 电子设计
http://www.tong-heng.cn/dzjc.htm
有很多基本电子电路
http://www.9688888.com/Index.html
维修之家
11:29 2007-1-30
LED项目进展
使用太阳能厂家做的电路,蓄电池未连接电路太阳能板时电压为6.21v,连接后为6.30v,10分钟后为6.47v,50分钟后为6.35v(可能是因为阳光弱了)。
14:40 2007-1-30
项目, 陈德明, nRF2401, 音频
陈德明实验室音频项目完成,经验:
1, 提高通信距离的办法:原有数据接收过程中,不允许帧头出错,但实际通信时部分数据出错很正常,所以nRF2401才有CRC校验。现在改写为帧头的判断允许每字节中有一位出错。这样通信距离和市场上同类产品不相上下。如何判断帧头是否有一位出错?这里为了提高效率,使用了很笨的办法——每字节最多有一位出错的可能共有8种,程序中逐个判断这8种可能性。
2, 汇编语言中少用跳转语句,因为跳转语句执行周期不确定,例如1-3周期,很可能程序运行中每次都是3个周期完成的。
3, 软硬件结合调试。这和我C8051 PTT项目感觉一致。陈德明当时使用的键盘大约是3ms抖动。
14:48 2007-1-30
项目, 陈德明
可能会和另一个实验室做嵌入式车牌识别系统,使用FPGA实现。汉王同类产品需要几千元一个,希望做到在白天性能差不多,但是价格只有1-2千。
关注这个项目。
18:15 2007-1-30
LED项目进展
1, 充电电路还是有问题,没有充上电。主要是被电池不足的万用表误导——显示的电压偏高,而且会变化。明天试验12v稳压管方案和太阳能厂的充电方案各半天,看能否充电,充电后接LED,并测量1小时的电压变化。
2, 软件。
按键按下切换时间的功能还没有实现。错误原因是按键按下把时间修改后,后面时间处理程序又把时间改了回去。
11:50 2007-1-31
LED项目进展
问:
1, 充电电路门限是多大。最大7.2v
2, 6v电池能否保证80个灯泡的使用?
根据现有300mA灯亮(4个串联20组并联)12小时需要12v蓄电池的0.4v电压。如果灯泡数量不变,换用6v需要2个串联40组并联,这样需要600mA电流,同样时间需要0.8v压降。按照6v蓄电池5.4-6.4范围内放电,大约只能充电1天多。
现在考虑用两个并行的6v蓄电池和及其太阳能板,用PIC单独控制两个蓄电池的放电,两个蓄电池交替放电。与师姐商量。***
(14:20 2007-1-31)
考虑直接用太阳能板接到蓄电池,加一个自恢复保险丝,同时使用AD读入蓄电池电压,用一个机械自锁的继电器控制太阳能电池是否给蓄电池充电。
熊工说可以用接一个电阻,测量电阻两端电压,再把电压放大,测试电压。
23:53 2007-01-31
LED项目进展
1, 硬件:
蓄电池充电实验两个方案, 一是太阳能电池板直接给蓄电池充电, 要控制不能超过充电电压(电阻分压后给AD, 由MCU通过继电器控制太阳能电池板是否给蓄电池充电), 不超过最大电流(考虑用自恢复保险丝). 二是使用太阳能厂熊工程师的充电电路, 请他在做一个12v的. 董老师希望我们自己按照他的样品仿制(与耿师姐商量).
都需要进一步测试. 二者使用集成电路工艺间的灯模拟太阳光(电流比用太阳光时低1/3左右), 测试充电效果.
2, 软件:
(1) 软件需要进一步测试, 给董老师演示. 用LED标识系统状态.
(2) 软件测试过程中. 感觉孙建辉程序的结构不够清楚, 2月1日, 认真分析一下, 看看有没有简单的优化方法.
01:01 2007-02-01
编程, 键盘***
用了75分钟, 把今天的晚上自己想测试的有"锁"的键盘程序测试完成, 时间有些长, 而且这么简单的代码也有4处有问题, 见"test_key.c"文件开始的注释.
1, 收获是比C8051中使用的程序简化了. 那时使用的是两个变量, 一个锁住按下的状态,
一个锁住释放的状态. 现在程序中, 仅仅使用一个变量.
2, 如果早知道用这么长时间, 应该明天再做, 但是明天也不一定有时间完成. 这样会影戏明天的状态.
3, 注: Linux下读取字符使用"int getc(FILE *stream);"或"int getchar(void);"不是"getch", 记得原来用的都是getch. 难道这个函数不属于标准c 么?