• 大小: 5KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-08
  • 语言: 其他
  • 标签: vuart  模拟串口  tty  

资源简介

基于linux-4.9内核的tty模拟驱动。无需串口芯片。ubuntu/嵌入式linux系统上均可运行。

资源截图

代码片段和文件信息

#include ject.h>
#include 
#include 
#include 
#include 
#include 


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include “simu_uart.h“

/*

通过对sys属性文件的读写,来模拟对tty硬件FIFO的读写
1.rx属性文件
对应模拟TTY硬件的TX-FIFO
2.tx属性文件
对应模拟TTY硬件的RX-FIFO

*/







/*计算有效数据size*/
int calc_valid_fifo(struct v_fifo* fifo)
{
if((fifo->head)==(fifo->tail))
return 0;
if((fifo->head) >= (fifo->tail))
return ((fifo->head) - (fifo->tail));
else{
return ((fifo->head) + (V_FIFO_SIZE-fifo->tail));
}
}
/*计算空闲空间*/
int  calc_free_fifo(struct v_fifo* fifo)
{
int valid = calc_valid_fifo(fifo);
return (V_FIFO_SIZE-valid-1);
}

int writechar_2_fifo(struct v_fifo* fifochar cc)
{
fifo->dat[fifo->head] = cc;
fifo->head = (fifo->head+1)&(V_FIFO_SIZE-1);

return 0;
}

/*读fifo*/
int readchar_from_fifo(struct v_fifo* fifochar *cc)
{
cc[0] = fifo->dat[fifo->tail];
fifo->tail = (fifo->tail+1)&(V_FIFO_SIZE-1);
return 0;
}



static int init_fifo(struct v_fifo* fifo)
{
if(!fifo)
return -1;
fifo->head = fifo->tail = 0;
return 0;
}


/*定义TX-FIFO  RX-FIFO*/
static struct vuart_dev *my_vuart_dev;

struct vuart_dev * get_udev(void)
{
return my_vuart_dev;
}



/*sysfs属性文件操作方法*/
static ssize_t curr_fifotail_show(struct device * dev struct device_attribute *attrchar *buf)
{
int sizei;
struct vuart_dev * vdev = (struct vuart_dev *)dev_get_drvdata(dev);
/*同步*/
if(down_interruptible(&vdev->sem_rx))
return -ERESTARTSYS;
/*计算fifo中有效数据size*/
size = calc_valid_fifo(&vdev->v_RX_FIFO);
/*copy数据*/
for(i=0;i buf[i] = vdev->v_RX_FIFO.dat[vdev->v_RX_FIFO.tail];
vdev->v_RX_FIFO.tail = (vdev->v_RX_FIFO.tail+1)&(V_FIFO_SIZE-1);
}

up(&vdev->sem_rx);
return size;
}
static ssize_t curr_fifohead_store(struct device *dev struct device_attribute * attr const char *buf size_t count)
{
int sizei;
struct vuart_dev * vdev = (struct vuart_dev *)dev_get_drvdata(dev);

/*同步*/
if(down_interruptible(&vdev->sem_tx))
return -ERESTARTSYS;
/*计算fifo中空闲size*/
size = calc_free_fifo(&vdev->v_TX_FIFO);
if(size <= 0){
printk(“Failed to store data: TX FIFO is FULL

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        5424  2017-11-01 15:22  vuart_code\simu_uart.c
     文件         825  2017-11-01 09:46  vuart_code\simu_uart.h
     文件        7898  2017-11-01 15:29  vuart_code\simu_uart_2.c
     目录           0  2018-04-20 16:52  vuart_code\

评论

共有 条评论