驱动是利用ARM的中断完成的,在LINUX下。
主要利用到:
1.字符设备驱动开发的整体框架。
主要是编写FILE_OPERATIONS这个特殊结构体中相应的函数,比如READ,init,write这些供应用程序使用。完成后生成.o文件,下载到ARM中的嵌入式系统中,利用insmod 加载进内核,在/dev下生成相应的设备结点,供应用程序打开。
2.int request_irq(unsigned int irq,irqreturn_t (*handler)(int, void *, struct pt_regs *),unsigned long irqflags, const char *devname, void *dev_id);
这个是申请中断函数,还有下面一组函数void disable_irq(unsigned int irq);
void enable_irq(unsigned int irq);
void free_irq(unsigned int irq, void *dev_id);
int set_external_irq(int irq, int edge, int pullup);这是设置中断方式。
另外由于利用到任务队列,因此用到了内核中的锁机制,这与应用层稍有不同,它们是:
spinlock_t buffer_lock = SPIN_LOCK_UNLOCKED;
spin_lock_irq(&buffer_lock);
spin_unlock_irq(&buffer_lock);
3.任务队列,其实就是C语言中常用的环形队列,下面是我写的一个队列接口:
.c文件:
#include "queue.h"
#include
#define print() printf("error!\n")
void queue_init(QUEUE * myqueue)
{
myqueue->item_number = 0;
myqueue->head = NULL;
myqueue->rear = NULL;
}
bool queue_myempty(const QUEUE * myqueue)
{
return (myqueue->item_number == 0);
}
bool queue_myfull(const QUEUE * myqueue)
{
return (myqueue->item_number == MAXNUMBER );
}
int queue_count(const QUEUE * myqueue)
{
return (myqueue->item_number);
}
bool queue_add(ITEM item,QUEUE * myqueue)
{
ITEM *temp = (ITEM*)malloc(sizeof(ITEM));
if(queue_myfull(myqueue))
{
print();
return false;
}
printf("hello\n");
temp->number = item.number;
if(queue_myempty(myqueue))
myqueue->head = temp;
else
myqueue->rear->next = temp;
printf("add\n");
myqueue->rear = temp;
myqueue->item_number++;
temp->next = NULL;
printf("add\n");
return true;
}
bool queue_del(QUEUE * myqueue)
{
ITEM *temp;
if(queue_myempty(myqueue))
{
print();
return false;
}
temp = myqueue->head;
myqueue->head = myqueue->head->next;
printf("remove the node :%d\n",temp->number);
free(temp);
myqueue->item_number--;
if(queue_myempty(myqueue))
myqueue->rear = NULL;
return true;
}
bool queue_clear(QUEUE * myqueue)
{
while(!queue_myempty(myqueue))
queue_del(myqueue);
return true;
}
.h文件
#pragma c9x on
#ifndef __QUEUE_H__
#define __QUEUE_H__
#include
#define MAXNUMBER 10
typedef struct item{
int number;
struct item *next;
}ITEM;
typedef struct queue{
ITEM *head;
ITEM *rear;
int item_number;
}QUEUE;
bool queue_myempty(const QUEUE * myqueue);
bool queue_myfull(const QUEUE *myqueue);
bool queue_clear( QUEUE *myqueue);
int queue_count(const QUEUE *myqueue);
void queue_init(QUEUE * myqueue);
bool queue_add(ITEM item,QUEUE * myqueue);
bool queue_del(QUEUE *myqueue);
#endif
阅读(605) | 评论(0) | 转发(0) |