关于 s3c2416 hspi spi linux 驱动
最近在做samsung
s3c2416
在linux下的spi驱动程序,测试了下samsung发布的spi的内核源代码,无论是采用dma或者非dma模式都无法工作。阅读该驱动代码,发现
这码应该是一个未完成的版本,存在很多的bug。于是在这个版本的基础上进行修改,重写一个可用的、支持全双工的通讯的驱动。目前测试基本能够正常工作,
支持半双工、全双工、spi硬件中断模式和dma模式。
对hspi-s3c2443.[ch]源文件根据数据发送和接收的流程进行分析,在未采用dma模式下,函数调用的流程:s3c_spi_xfer
-> s3c_spi_doxfer -> s3c_spi_message_start ->
down_interruptible(&spi->sem),到这里,硬件会产生spi中断,进入到中断服务程序
s3c_spi_irq 中,中断函数调用 spi_s3c_irq_nextbyte
进行数据发送,根据spi->state的值做相应的操作,数据发送或接收完成后,调用 s3c_spi_stop
关闭spi,并up(&spi->sem),程序流程回到了s3c_spi_doxfer函数的
down_interruptible(&spi->sem),函数返回退出,一个spi的数据收发流程完成。
在这个发送接收流程中,中断服务程序存在很多不足的地方。
先看spi发送,发送最终调用的是:
while(!(tx_msgend(spi)))
s3c_spi_write_fifo(spi);
这两行代码的功能是判断写缓冲里是否还有数据,有的话就写入到spi发送寄存器(S3C_SPI_TX_DATA)中。我们知道spi的硬件能够缓冲64
个字节的数据,如果我们一次发送的数据长度小于64个字节,并且下一次发送数据时缓冲中的数据发送完成,那么这段代码表面上应该是没什么问题。如果我们发
送的数据长度大于64个字节,那么这段代码至少造成的后果是产生一个SPI transmit over run error。
在看spi接收,接收调用的代码是:
while(!(rx_msgend(spi))){
spi->msg->rbuf[spi->msg_rd_pt
相关文档:
setitimer()是比较精准的定时器,是Linux的API
以下代码是个倒计时例子:
#include <signal.h>
#include <sys/time.h>
static int time_count=30;
static void sigalrm_handler(int sig)
{
time_count--;
printf("timer signal.. %d\n", time_count);
}
struct itimerval v; ......
1、首先从软件管理里把所有有关邮件服务软件都装上,其中包括了,sendmail和dovecot
2
、
DN
S配
置
(1)修改/etc/named.conf
,此文件一般是个软链接,添加如下:
zone "excontainer.com" IN {
type master;
&nb ......
应该说uClinux同标准Linux的最大区别就在于内存管理,同时也由于uClinux的内存管理引发了一些标准Linux所不会出现的问题。本文将把uClinux内存管理同标准Linux的那内存管理部分进行比较分析。
标准Linux使用的虚拟存储器技术
标准Linux使用虚拟存储器技术,这种技术用于提供比计算机系统中实际使用的物理内存大得多的内存 ......
Windows程序员如何转向Linux开发应用?
这是一封发到邮箱里面的邮件,感觉有点代表性,这里做个统一回答,一家之言哈,欢迎拍砖。
原文如下:
我从csdn学习大本营得到您的信息。不好意思打搅您。
我现在用c++在linux下开发大型应用程序。我想请教是否值得深入学习linux kernel。
我没有特别多的时间。另外我有多年Wind ......
导航:[首页]>[linux内核学习笔记]
目录
[隐藏]
1 字符设备驱动知识讲解
1.1 描述字符设备基本结构体
1.2 作用
1.3 各字段详解
1.4 操作
1.5 实例
1.5.1 代码
1.5.2 运行
[编辑]字符设备驱动知识讲解
作者:[牛涛]
[编辑]描述字符设备基本结构体
/linux/ ......