資源簡介
基于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\
評論
共有 條評論