打印
[嵌入式linux]

开始学linux驱动,三个月熟悉,立帖为证!每日汇报进展

[复制链接]
60719|269
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tiger84|  楼主 | 2009-12-12 14:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
tiger84|  楼主 | 2009-12-14 12:25 | 只看该作者
抱歉啊,上班时间不是很方便上论坛,这么长时间才回复,再次说声抱歉。

也不能说没有半点基础,以前做过一段时间的linux的应用,不过像交叉环境编译,botloader,根文件系统之类都没有搭建过。

工作中要做的产品采用arm9+dsp的方案。arm9的选用在综合评定了三星,NXP,atmel的几款芯片后,选定了at91sam9260,dsp则采用的TI的带HPI接口的DSP。

于是找代理商借了块at91sam9260的开发板,基本上与atmel网站上的at91sam9260-ek的资源一致。

然后开始搭建环境。
我用的是虚拟机的方式,装的是fedora10,这样像GCC之类的都是比较新的,出问题也会少很多。
开发板的内核准备使用2.6.27,bootload使用u-boot,根文件系统使用ramdisk。
详细的安装过程就不多说了,碰到过的问题列举如下:
1,交叉编译U-boot时,先下载的1.1.6的版本,编译成功后下载到板子上,发现环境变量保存不了,上网搜索得知,可能这个版本不支持nand flash(可能而已),我对这些玩意一无所知,如果想改u-bbot源码,基本不现实。于是又采用u-boot的1.1.5版本,配置下参数,交叉编译之类的,命令如下:
make at91sam9260_nand_config
make
生成u-boot.bin,下载后环境变量可以保存。
2,交叉编译内核时,需要选择"Use the arm EABI to compile the kernel".GCC的版本一定要大于4.0,我刚开始用的redhat的gcc是3.4的,编译总是出现错误,查看了资料才知道问题出在gcc的版本上。
  还会出现一个错误,就是PATH_MAX没有定义,经过查找资料后,确定它的值为256,为了方便,我直接把它定义成了256.
然后编译通过。

使用特权

评论回复
板凳
tiger84|  楼主 | 2009-12-14 12:35 | 只看该作者
本帖最后由 tiger84 于 2009-12-14 12:39 编辑

现在基本上全天都在弄这个arm-linux,能把兴趣和工作融合到一块,运气也算OK吧。
对at91sam9260的了解仅限于它的资源和存储等,具体的细节还未曾了解过,要做的工作还比较多。
我的大致路线如下:
1,通过atmel官方上的例程熟悉at91sam9260;
   (1)hello world程序
   (2)LED程序
   (3)SPI读写FLASH
     这是今天和明天需要完成的。
2,linxu下的LED驱动及按键驱动
   本星期的任务。

使用特权

评论回复
地板
tiger84|  楼主 | 2009-12-14 21:55 | 只看该作者
今天白天看了一天的at91sam9260的SPI接口以及spi接口data flash 芯片at45db161,预计明天可以试验完毕该功能。
晚上看了下linux下面与at91sam9260的GPIO相关的源码,直接从源码里面拷贝了gpio.c,模块编译通过,不过有警告,比较郁闷。
输出信息如下:
make -C /home/zhh/linux-2.6.27 M=/mnt/hgfs/linux_share/apply/gpio modules
make[1]: Entering directory `/home/zhh/linux-2.6.27'
  CC [M]  /mnt/hgfs/linux_share/apply/gpio/gpio.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'at91_get_gpio_value' exported twice. Previous export was in vmlinux
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'at91_set_gpio_value' exported twice. Previous export was in vmlinux
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'gpio_direction_output' exported twice. Previous export was in vmlinux
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'gpio_direction_input' exported twice. Previous export was in vmlinux
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'at91_set_multi_drive' exported twice. Previous export was in vmlinux
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'at91_set_deglitch' exported twice. Previous export was in vmlinux
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'at91_set_gpio_output' exported twice. Previous export was in vmlinux
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'at91_set_gpio_input' exported twice. Previous export was in vmlinux
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'at91_set_B_periph' exported twice. Previous export was in vmlinux
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'at91_set_A_periph' exported twice. Previous export was in vmlinux
WARNING: /mnt/hgfs/linux_share/apply/gpio/gpio: 'at91_set_GPIO_periph' exported twice. Previous export was in vmlinux
WARNING: "handle_simple_irq" [/mnt/hgfs/linux_share/apply/gpio/gpio.ko] undefined!
WARNING: "set_irq_flags" [/mnt/hgfs/linux_share/apply/gpio/gpio.ko] undefined!
WARNING: "__set_irq_handler" [/mnt/hgfs/linux_share/apply/gpio/gpio.ko] undefined!
WARNING: "irq_desc" [/mnt/hgfs/linux_share/apply/gpio/gpio.ko] undefined!
  CC      /mnt/hgfs/linux_share/apply/gpio/gpio.mod.o
  LD [M]  /mnt/hgfs/linux_share/apply/gpio/gpio.ko
make[1]: Leaving directory `/home/zhh/linux-2.6.27'


猜想是在编译内核时已经导出过一次了,现在试验模块编译时,又导出了一次,所以出现了警告。
具体还得明天晚上验证了

使用特权

评论回复
5
tiger84|  楼主 | 2009-12-14 22:01 | 只看该作者
发现find和grep的功能真是强大。

使用特权

评论回复
6
tiger84|  楼主 | 2009-12-15 22:01 | 只看该作者
本帖最后由 tiger84 于 2009-12-15 22:04 编辑

今天白天把SPI操作data flash看完并读写flash成功,顺便把at91sam9260的中断,时钟,电源管理等熟悉了。
晚上依旧在弄一个GPIO的驱动,不过仍然没有成功。
在图形配置内核界面里,就是没有找到支持GPIO的配置,是不是压根就不需要配置就能用?各位指点下。

也顺便看了下kconfig的语法,看makefile也逐渐清晰起来。

明天计划:
白天:板子上的sdram及nandflash熟悉;
晚上:完成linux下的LED驱动

使用特权

评论回复
7
牛牛特工| | 2009-12-15 22:26 | 只看该作者
本帖最后由 牛牛特工 于 2009-12-15 23:25 编辑

俺openOCD+OpenJtag win环境终于搭建完毕 按着顺序装就可以了
现在开始先编译裸奔代码 就是在一个2440的裸奔代码上改改 看了下PXA270的寄存器 简单写了个LED程序 靠 跑不起来
开始先下到SDRAM里面 后来看看人家说的 SDRAM还需要控制器进行配置后才能正常使用,就改到内部SRAM运行 结果还是运行不了~~ 晕倒一片 还不知道啥原因呢
然后又看资料 发现说需要关闭 MMU,就用命令关了MMU后再下载 依旧不行
检查了检查工程下面的makefile 发现工程里还有一个.s 用于复位后转向main的
发现里面是有些问题 一个设置WDT的 但是PXA270没有该寄存器,代之以另外一个寄存器 后面则是设置堆栈 我的270板子RAM地址和2440的板子不通 故也要设为另外一个值
修改后 main依然不能正常运行

.text
.global _start
_start:
            ldr     r0, =0x40a00018     @ WATCHDOG寄存器地址
            mov     r1, #0x0                     
            str   r1, [r0]              @ 写入0,禁止WATCHDOG,否则CPU会不断重启
            
            ldr     sp, =0x5c001000         @ 设置堆栈,               
bl      main                @ 调用C程序中的main函数
halt_loop:
            b       halt_loop

使用特权

评论回复
8
icecut| | 2009-12-16 10:44 | 只看该作者
牛牛初始化一下中断.关闭所有中断.

openjtag加上关闭mmu的指令.

使用特权

评论回复
9
icecut| | 2009-12-16 10:45 | 只看该作者
gpio是驱动初始化,内核不管.

使用特权

评论回复
10
tiger84|  楼主 | 2009-12-16 18:35 | 只看该作者
本帖最后由 tiger84 于 2009-12-16 22:32 编辑

谢谢icecut兄弟的解答,呵呵。我再瞅瞅.

驱动程序里也有个gpio.c文件,目录./linux-2.6.27/drivers/gpio/
看了下源码,应该在make menuconfig时有地方配置的,不过就是没找到

使用特权

评论回复
11
tiger84|  楼主 | 2009-12-16 18:39 | 只看该作者
今天上午一直在忙其他的工作,没有时间弄。
明天上午也没时间弄,进展不尽人意。

下午看了下at91sam9260的EBI,at91sam9260开发板原理图不明白的地方也豁然开朗。
下面转载一篇关于sdram,norflash接法的**,可能对初学者有些帮助。

外设位宽为8、16、32时,CPU与外设之间地址线的连接方法     



有不少人问到:
flash连接CPU时,根据不同的数据宽度,比如16位的NOR FLASH (A0-A19),处理器的地址线要(A1-A20)左移偏1位。为什么要偏1位?

从软件和CPU的角度而言,一个地址对应一个字节,就是8位数据。这是肯定的,不要怀疑这点。

对于具体器件而言,它的位宽是一定的,所谓位宽,指的是“读/写操作时,最小的数据单元”──别说最小单元是“位”,一般设备上没有单独的“位操作”,修改位时通过把整个字节、字或双字读出来、修改,再回写。

CPU的地址线(A0-A20)对应的最小数据单元是字节,即8位;
而位宽为16的NOR FLASH的地址线(A0-A19)对应的最小数据单元是16位。
这两个怎么对应起来?

如果说外设的位宽是16,难道我们写程序时会“特意”以16位进行操作吗?不用的,我们写程序时根本不用管外设位宽是8、16还是32。

仔细想想,其实是可以想通的:既然CPU、外设NOR FLASH的最小读/写单元已经固定,那么肯定就是CPU与NOR FLASH之间有个中间层,它来做处理:
这个中间层被称为“Memory Controller”,CPU要进行读写操作时,“Memory Controller”根据NOR FLASH的位宽,每次总是读/写16位数据。
以读操作为例:
CPU想进行8位操作时,它选择其中的8位返回给CPU;
CPU想进行16位操作时,它直接把这16位数据返回给CPU;
CPU想进行32位操作时,它发起2次读/写,把结果组合成32位返回给CPU。

现在的连线是:CPU的(A1-A20)接到 16位的NOR FLASH (A0-A19),即CPU的A0不接──这说明:不管A0是0还是1,NOR FLASH接收到的地址是一样的。
CPU发出地址0bxxxxxxxxx0、0bxxxxxxxxx1时,NOR FLASH看到的都是0bxxxxxxxxx,返回给“Memory Controller”的都是同一个16位数据。
再由“Memory Controller”选择其中的低8位或高8位给CPU。

“Memory Controller”会帮助我们做这些事情,举例为证:
1. 软件要读取地址0上的8位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000000的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第1个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据的低8位返回给CPU,这就是一个8位数据。

2. 软件要读取地址1上的8位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000001的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第1个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据的高8位(注意,前面的低8位)返回给CPU,这就是一个8位数据。

3. 软件要读取地址2上的8位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000010的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据的低8位返回给CPU,这就是一个8位数据。

4. 软件要读取地址3上的8位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000011的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据的高8位(注意,第3点是低8位)返回给CPU,这就是一个8位数据。

5. 软件要读取地址0和1上的16位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000000的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第1个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据返回给CPU

6. 软件要读取地址2和3上的16位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000010的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个“最小数据单元”
③ “Memory Controller”读入这个16位数据
④ “Memory Controller”把这个16位数据返回给CPU

7. 软件要读取地址0、1、2、3上的32位数据时,硬件是这样进行的:
① “Memory Controller”发出0b000000000000000000000的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000000
② NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第1个“最小数据单元”
③ “Memory Controller”读入这个16位数据

④ “Memory Controller”发出0b000000000000000000010的地址信号,NOR FLASH的A0-A19线上的信号是:0b00000000000000000001
⑤ NOR FLASH在数据总线D0~D15上提供一个16位的数据,这是NOR FLASH中的第2个“最小数据单元”
⑥ “Memory Controller”读入这个16位数据
⑦ “Memory Controller”把两个16位的数据组合成一个32位的数据,返回给CPU。

从1~7可知:
① 对于软件而言,它不知道底下发生了什么事,它只管结果:
读取地址0的8位数据,就得到了一个8位数据;读取地址1的8位数据,就得到另一个紧挨着的8位数据
读取地址0开始的16位数据,就得到了一个16位数据;读取地址2开始的16位数据,就得到另一个紧挨着的16位数据
读取地址0开始的32位数据,就得到了一个32位数据;读取地址4开始的32位数据,就得到另一个紧挨着的32位数据
② 对于NOR FLASH,它只按照A0-A19地址线,提供16位数据,才不管软件要的是8位、16位,还是32位呢。
③ “Memory Controller”完成了这些位宽之间的数据选择、合并。


所以:
外设位宽是8时,CPU的A0~AXX与外设的A0~AXX直接相连
外设位宽是16时,CPU的A1~AXX与外设的A0~AYY直接相连,表示不管CPU的A0是0还是1,外设看到的都是同一个地址,对应16位的数据,“Memory Controller”对数据进行选择或组合,再提供给CPU。
外设位宽是32时,CPU的A2~AXX与外设的A0~AZZ直接相连,表示不管CPU的A0A1是00,01,10还是11,外设看到的都是同一个地址,对应32位的数据,“Memory Controller”对数据进行选择或组合,再提供给CPU

<嵌入式Linux应用开发完全手册>出版

使用特权

评论回复
12
牛牛特工| | 2009-12-16 19:19 | 只看该作者
本帖最后由 牛牛特工 于 2009-12-17 09:45 编辑

谢谢icecut指点 为啥俺没想到 郁闷
好 试试!! halt查看CPSR 发现CPSR竟然处于 IRQ处理状态 并且FIRQ中断响应好像是打开的, 在.s文件中增加如下代码段

mrs r0,cpsr   
bic r0,r0,#0x1f
orr r0,r0,#0x13 //svc模式
orr r0,r0,#0xc0// 禁止中断
msr cpsr,r0

郁闷啊 还是不行 不过这次进入这个程序之后 跳的地址不一样了 之前跑到0xf开头 这次跑到 0x8开头了
首先reset 然后禁止MMU 下载代码到0x5c000000 再禁止MMU resume 0x5c000000
halt 后cpsr=0x6000003d pc=0x8xxxxxxx
并且MMU 和icache 又被使能了 奇怪
明明已经执行了 xscale mmu disable  xscale icache disable  xscale dcache disable  
只要一resume 到我烧程序的地址,就又被使能了
看了反汇编 .dis  觉得貌似是肯定会有问题哈,
00000000 <_start>:
   0: e329f0d3  msr CPSR_fc, #211 ; 0xd3
   4: e59f0010  ldr r0, [pc, #16] ; 1c <halt_loop+0x4>
   8: e3a01000  mov r1, #0 ; 0x0
   c: e5801000  str r1, [r0]
  10: e59fd008  ldr sp, [pc, #8] ; 20 <halt_loop+0x8>
  14: eb00000d  bl 50 <main>
这里bl到 50 而程序地址实际在 0x5c000000 +0x50   不晓得能否正确跳转到呢?
想试试有没有什么设断点的方法,设一个断点
用BP命令 设了一个断点    CPU能够在此停下 说明程序能够执行到这里
唉0x5c000060处设了一断点 程序能够运行到此处 并且MMI Dcache Icache 处于不使能状态,CPSR=Df 即中断已经关闭 那么到底在什么地方出错导致程序跑飞了呢
按照相关的教程 设置了eclipse 但是仍然无法调试 这个教程也没有设置地址等 估计是肯定不行,目前直接导致我板子里原有的bootloader也废了
没办法 还是只能命令行设断点 而且还只能用bp设仅一个硬件断点 ,软件断点的命令查不到
发现程序在该地址跑飞 这个应该是编译的问题咯 要么编译器不正常 要么就是makefile写的有问题
00000058 <main>:
  58: e52de004  push {lr}  ; (str lr, [sp, #-4]!)
  5c: e24dd004  sub sp, sp, #4 ; 0x4
  60: e3a03000  mov r3, #0 ; 0x0
  64: e58d3000  str r3, [sp]
  68: e3a03141  mov r3, #1073741840 ; 0x40000010
  6c: e283360e  add r3, r3, #14680064 ; 0xe00000
  70: e3a027c3  mov r2, #51118080 ; 0x30c0000
  74: e5832000  str r2, [r3]
  78: e3a00c75  mov r0, #29952 ; 0x7500
  7c: e2800030  add r0, r0, #48 ; 0x30
  80: ebffffe9  bl 2c <wait>
  84: e59d3000  ldr r3, [sp]
  88: e3530003  cmp r3, #3 ; 0x3
  8c: 979ff103  ldrls pc, [pc, r3, lsl #2]
  90: ea000026  b 130 <main+0xd8>
  94: 000000a4  .word 0x000000a4
  98: 000000c8  .word 0x000000c8
  9c: 000000ec  .word 0x000000ec
  a0: 00000110  .word 0x00000110
如上 当程序在 0x90之前时  可以中断
到了 90就不能正常运行了 对linux的这些工具还是不熟悉啊 makefile下面  arm-elf-ld 后面接lds文件 还没弄明白 试了下把.=改了一下 编译出来的基地址就变了~~~ 然后CFLAG是一堆参数 也不晓得啥意思~~  查看了gcc 4.2.4的mannual command option 这一节总算是知道了 CFLAG的意思  fomit-frame-pointer 这个选项的E文 frame-pointer不晓得指的是哪个寄存器 freestandding 这个概念还不是很清楚 google这个词被和谐了 baidu出来得到一个 托管(host)和 独立(freestandding)的概念 看起来俺们的学习就象是爬一样哈哈
leds.rar (8.44 KB) 程序及makefile在此

使用特权

评论回复
13
牛牛特工| | 2009-12-17 23:37 | 只看该作者
本帖最后由 牛牛特工 于 2009-12-18 00:24 编辑

靠 今天又加班
终于可以又来搞了 下了gnu ld 的手册 咋看都觉得稀里糊涂的 索性自己瞎改
把lds文件改为如下内容 就可以在RAM中运行  第一个.=修改为0x00 则可以从ROM启动

SECTIONS {
        . = 0x5c000000;
          .text          :   { *(.text) }
          . = 0x5c000800;
        .rodata ALIGN(4) : {*(.rodata)}
        . = 0x5c001000;
          .data ALIGN(4) : { *(.data) }
          . = 0x5c002000;
          .bss ALIGN(4)  : { *(.bss)  *(COMMON) }
}
跑起来了!!!
setion里面的这些东西还真不晓得怎么弄
没看到标准的setor名称定义代表的意思 只知道 text 是代码 ro大概是const data则是全局变量 rss 堆内存?  先编几个裸奔程序玩玩吧
extern char _etext, _data, _edata, _bstart, _bend;
char *src = &_etext;
char *dst = &_data;
/* ROM has data at end of text; copy it. */
while (dst < &_edata) {
*dst++ = *src++;
}
/* Zero bss */
for (dst = &_bstart; dst< &_bend; dst++)




*dst = 0;

使用特权

评论回复
14
icecut| | 2009-12-18 10:36 | 只看该作者
1.openjtag的状态更新慢.这个不是问题知道就行了.
2.uboot的main是在内存执行的.确认总线配置正确.还要把自己复制到sdram中.其他bootloader也是这么搞的.---我初始化内存时错误过.是因为直接内存运行,程序从rom读数据配置内存了.

使用特权

评论回复
15
tiger84|  楼主 | 2009-12-18 22:29 | 只看该作者
今天上午在忙其他的工作。
下午开始看linux的字符设备驱动。
先是看宋宝华的那本设备驱动开发详解,对cdev结构体描述字符设备驱动有了个基本的认识。
然后看linux的相关驱动源码,相关的太多了,经常顾此失彼。折腾了一个下午,也只是能把和板子硬件关系不大的字符驱动运行起来,和硬件相关的,比如简单的LED,就搞不定了。

主要原因在于对驱动结构还没有清楚的认识,只知道照葫芦画瓢。

在公司没有人熟悉linux和at91sam9260芯片,出现问题,只能自己摸索。

明天一定要把LED点亮,点不亮,俺明晚不睡了!

使用特权

评论回复
16
tiger84|  楼主 | 2009-12-18 22:35 | 只看该作者
突然发现我在LED操作时竟然用的物理地址!

使用特权

评论回复
17
tiger84|  楼主 | 2009-12-19 17:14 | 只看该作者
今天天气很冷,起来时就已经10点了,呆在床上把驱动的基础又看了下。
吃了个中饭,打了个盹,继续开始LED。

昨天在操作LED时用的是物理地址,于是今天开始找物理IO空间映射到虚拟空间的地址,仍然没有找到。

在源代码里,找到了几个貌似可以通过操作虚拟空间中映射到物理地址的函数,调用了下,终于把LED灯可以点亮点灭了。

虽然对很多人来说是很简单的事,但是我依然花了好几天的时间,虽走了许多弯路,不过也算收获了下。

接下来看物理地址和虚拟空间的地址到底是怎么映射的?

本周末任务,顺便弄下按键中断的驱动。

使用特权

评论回复
18
icecut| | 2009-12-19 22:09 | 只看该作者
hehe,宋宝华的书我也有,他写的有点山寨了。io所以物理地址,优势是让人更快体会到驱动的感觉。坏处就是太山寨,不是Linux的风格。

好像宋宝华在翻译 精通Linux驱动程序开发 这本我看的e文版

使用特权

评论回复
19
tiger84|  楼主 | 2009-12-21 21:53 | 只看该作者
昨天没有来汇报,一天都浪费了,实在是惭愧,简单的把linux的内存分布及IO空间,物理地址与虚拟地址的映射等看了下,了解了大概。
今天上午开了一上午的会,下午本打算把按键驱动弄出来,没料到对我而言,还是比较复杂的一件事。
里面涉及到了中断,定时器等。
又是把相关的东东都大致的翻一遍,然后开始进行。
初步预计明天上午能弄出来。

明天计划:按键驱动,串口驱动。

使用特权

评论回复
20
tiger84|  楼主 | 2009-12-21 21:55 | 只看该作者
上网搜索相关例子时,发现基本上都是s3c2410及S3C2440的例子,关于at91sam9260的例子比较少。
虽然说源码里面都有了,但是看起来还是比较吃力和麻烦。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

862

帖子

0

粉丝