中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

找網(wǎng)站建設(shè)企業(yè)常德seo招聘

找網(wǎng)站建設(shè)企業(yè),常德seo招聘,小米的網(wǎng)站設(shè)計(jì),網(wǎng)站推廣的特點(diǎn)是什么目錄 1. ftdi_port_probe 1.1 私有數(shù)據(jù)結(jié)構(gòu)ftdi_private 1.2 特殊probe處理 1.3 確定FTDI設(shè)備類型 1.4 確定最大數(shù)據(jù)包大小 1.5 設(shè)置讀取延遲時(shí)間 1.6 初始化GPIO 1.6.1 使能GPIO 1.6.2 添加到系統(tǒng) 1.6.2.1 設(shè)置GPIO控制器的基本信息 1.6.2.2 設(shè)置GPIO控制器的元信息…

目錄

1.?ftdi_port_probe

1.1 私有數(shù)據(jù)結(jié)構(gòu)ftdi_private

1.2?特殊probe處理

1.3?確定FTDI設(shè)備類型

1.4?確定最大數(shù)據(jù)包大小

1.5?設(shè)置讀取延遲時(shí)間

1.6?初始化GPIO

1.6.1 使能GPIO

1.6.2 添加到系統(tǒng)

1.6.2.1?設(shè)置GPIO控制器的基本信息

1.6.2.2?設(shè)置GPIO控制器的元信息

1.6.3 GPIO實(shí)例

?2.?ftdi_gpio_remove


int (*port_probe)(struct usb_serial_port *port): 端口探測(cè)函數(shù)ftdi_port_probe,用于初始化單個(gè)端口。

void (*port_remove)(struct usb_serial_port *port): 端口移除函數(shù)ftdi_port_remove
ftdi_port_remove,用于清理單個(gè)端口。

1.?ftdi_port_probe

1.1 私有數(shù)據(jù)結(jié)構(gòu)ftdi_private

這個(gè)結(jié)構(gòu)是FTDI設(shè)備特有的,其實(shí)就是用來(lái)在驅(qū)動(dòng)中傳遞參數(shù)用的。在這個(gè)結(jié)構(gòu)體中定義了FTDI設(shè)備私有的一些變量。

struct ftdi_private *priv;
priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
if (!priv)return -ENOMEM;

這個(gè)私有數(shù)據(jù)是通過(guò)usb_set_serial_port_data放到port的私有數(shù)據(jù)保存。

usb_set_serial_port_data(port, priv);

1.2?特殊probe處理

和上一節(jié)一樣,端口的probe處理也是有特殊的情況。這個(gè)結(jié)構(gòu)體是通過(guò)port->serial傳遞的。

const struct ftdi_quirk *quirk = usb_get_serial_data(port->serial);
if (quirk && quirk->port_probe)quirk->port_probe(priv);

1.3?確定FTDI設(shè)備類型

result = ftdi_determine_type(port);
if (result)goto err_free;

?該類型是通過(guò)設(shè)備描述符中的bcdDevice來(lái)區(qū)別的。

version = le16_to_cpu(udev->descriptor.bcdDevice);

以FT4232H為例,該值可以在設(shè)備屬性的硬件ID中查看到,如下圖REV_0800?

case 0x800:priv->chip_type = FT4232H;break;

通過(guò)當(dāng)前接口初始化通道編號(hào),這只對(duì)多串口有意義(比如FT2232H和FT4232H)

#define CHANNEL_A		1
#define CHANNEL_B		2
#define CHANNEL_C		3
#define CHANNEL_D		4ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
priv->channel = CHANNEL_A + ifnum;

而baud_base是指波特率產(chǎn)生器的參考時(shí)鐘,默認(rèn)設(shè)置的是H系列的值:120M的二分頻。

priv->baud_base = 120000000 / 2;

最后是向設(shè)備節(jié)點(diǎn)發(fā)送消息,表明檢測(cè)到了哪種類型的FTDI芯片。

dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]);

在命令“sudo dmesg”返回結(jié)果中可以找到這句信息內(nèi)容,例如:

[16005.322690] usb 2-1: Detected FT4232H

1.4?確定最大數(shù)據(jù)包大小

ftdi_set_max_packet_size(port);

這是從設(shè)備的端點(diǎn)描述符中獲取設(shè)備端點(diǎn)最大數(shù)據(jù)包大小。這一步更像是檢查FT232R的端點(diǎn)數(shù)據(jù)包最大值被客制為0的情況,當(dāng)被改為0時(shí)數(shù)據(jù)包大小設(shè)置為64字節(jié)。

1.5?設(shè)置讀取延遲時(shí)間

if (read_latency_timer(port) < 0)priv->latency = 16;
write_latency_timer(port);

這段代碼的作用是確保設(shè)備的讀取延遲時(shí)間被正確設(shè)置,如果無(wú)法獲取當(dāng)前的延遲時(shí)間,則會(huì)使用一個(gè)默認(rèn)值進(jìn)行設(shè)置。

獲取這個(gè)參數(shù)是通過(guò)函數(shù)usb_control_msg_recv實(shí)現(xiàn)的。

int usb_control_msg_recv(struct usb_device *dev, __u8 endpoint, __u8 request,__u8 requesttype, __u16 value, __u16 index,void *driver_data, __u16 size, int timeout,gfp_t memflags)

對(duì)應(yīng)的調(diào)用:

rv = usb_control_msg_recv(udev, 0, FTDI_SIO_GET_LATENCY_TIMER_REQUEST,FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE, 0,priv->channel, &buf, 1, WDR_TIMEOUT,GFP_KERNEL);

其中參數(shù)request和requesttype在ftdi_sio.h中有定義:

#define FTDI_SIO_GET_LATENCY_TIMER	0x0a /* Get the latency timer */
#define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST FTDI_SIO_GET_LATENCY_TIMER
#define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE 0xC0

這屬于FTDI定義的命令。

同樣,寫這個(gè)參數(shù)的命令是:

#define FTDI_SIO_SET_LATENCY_TIMER	9 /* Set the latency timer */
#define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST FTDI_SIO_SET_LATENCY_TIMER
#define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE 0x40rv = usb_control_msg(udev,usb_sndctrlpipe(udev, 0),FTDI_SIO_SET_LATENCY_TIMER_REQUEST,FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,l, priv->channel,NULL, 0, WDR_TIMEOUT);

1.6?初始化GPIO

這部分是利用了FTDI的CBUS實(shí)現(xiàn)USB轉(zhuǎn)GPIO的功能。這一步是受內(nèi)核配置CONFIG_GPIOLIB控制的,如果沒有使能GPIOLIB,則沒有這部分功能。

1.6.1 使能GPIO

由于不是所有的FTDI芯片都支持CBUS功能,所以前面有做芯片類型的判斷,這里會(huì)引用這個(gè)變量分別處理。

switch (priv->chip_type) {
case FT232H:result = ftdi_gpio_init_ft232h(port);break;
case FT232R:result = ftdi_gpio_init_ft232r(port);break;
case FTX:result = ftdi_gpio_init_ftx(port);break;
default:return 0;
}

只有3類芯片支持CBUS功能,這里3個(gè)分支都是從芯片(或外置EEPROM)中讀取CBUS配置信息使能CBUS腳。例如FT232H,一共有4個(gè)CBUS腳,分別為AC5,AC6,AC8和AC9,從eeprom的地址0x1a讀入4個(gè)字節(jié)

ret = ftdi_read_eeprom(port->serial, buf, 0x1a, 4);
if (ret < 0)goto out_free;

每個(gè)GPIO由4位表示方向和電平。

/*
* FT232H CBUS Memory Map
*
* 0x1a: X- (upper nibble -> AC5)
* 0x1b: -X (lower nibble -> AC6)
* 0x1c: XX (upper nibble -> AC9 | lower nibble -> AC8)
*/
cbus_config = buf[2] << 8 | (buf[1] & 0xf) << 4 | (buf[0] & 0xf0) >> 4;

最后更新priv->gc.ngpio和gpio_altfunc,對(duì)應(yīng)GPIO使能的話,gpio_altfunc對(duì)應(yīng)的位清零

priv->gc.ngpio = 4;
priv->gpio_altfunc = 0xff;for (i = 0; i < priv->gc.ngpio; ++i) {if ((cbus_config & 0xf) == FTDI_FTX_CBUS_MUX_GPIO)priv->gpio_altfunc &= ~BIT(i);cbus_config >>= 4;
}

1.6.2 添加到系統(tǒng)

這一步是通過(guò)標(biāo)準(zhǔn)的gpiochip的驅(qū)動(dòng)API函數(shù)gpiochip_add_data實(shí)現(xiàn)。

priv->gc.label = "ftdi-cbus";
priv->gc.request = ftdi_gpio_request;
priv->gc.get_direction = ftdi_gpio_direction_get;
priv->gc.direction_input = ftdi_gpio_direction_input;
priv->gc.direction_output = ftdi_gpio_direction_output;
priv->gc.init_valid_mask = ftdi_gpio_init_valid_mask;
priv->gc.get = ftdi_gpio_get;
priv->gc.set = ftdi_gpio_set;
priv->gc.get_multiple = ftdi_gpio_get_multiple;
priv->gc.set_multiple = ftdi_gpio_set_multiple;
priv->gc.owner = THIS_MODULE;
priv->gc.parent = &serial->interface->dev;
priv->gc.base = -1;
priv->gc.can_sleep = true;result = gpiochip_add_data(&priv->gc, port);
if (!result)priv->gpio_registered = true;

第一個(gè)參數(shù)priv->gc是配置好的`gpio_chip`結(jié)構(gòu)體,第二個(gè)參數(shù)是該gpio_chip的私有數(shù)據(jù),即實(shí)現(xiàn)接口參數(shù)的傳遞,例如:

static int ftdi_gpio_request(struct gpio_chip *gc, unsigned int offset)
{struct usb_serial_port *port = gpiochip_get_data(gc);
1.6.2.1?設(shè)置GPIO控制器的基本信息
  • priv->gc.label: 設(shè)置GPIO控制器的標(biāo)簽為"ftdi-cbus"。
  • priv->gc.request: 設(shè)置請(qǐng)求GPIO引腳的函數(shù)為`ftdi_gpio_request`,用于在使用前申請(qǐng)GPIO資源。
  • priv->gc.get_direction: 設(shè)置獲取GPIO引腳方向(輸入或輸出)的函數(shù)為`ftdi_gpio_direction_get`。
  • priv->gc.direction_input: 設(shè)置將GPIO引腳配置為輸入模式的函數(shù)為`ftdi_gpio_direction_input`。
  • priv->gc.direction_output: 設(shè)置將GPIO引腳配置為輸出模式的函數(shù)為`ftdi_gpio_direction_output`。
  • priv->gc.init_valid_mask: 設(shè)置初始化有效掩碼的函數(shù)為`ftdi_gpio_init_valid_mask`,用于確定哪些GPIO引腳可以被使用。
  • priv->gc.get: 設(shè)置讀取GPIO引腳狀態(tài)的函數(shù)為`ftdi_gpio_get`。
  • priv->gc.set: 設(shè)置設(shè)置GPIO引腳狀態(tài)的函數(shù)為`ftdi_gpio_set`。
  • priv->gc.get_multiple: 設(shè)置批量讀取GPIO引腳狀態(tài)的函數(shù)為`ftdi_gpio_get_multiple`。
  • priv->gc.set_multiple: 設(shè)置批量設(shè)置GPIO引腳狀態(tài)的函數(shù)為`ftdi_gpio_set_multiple`。
1.6.2.2?設(shè)置GPIO控制器的元信息
  • priv->gc.owner: 設(shè)置擁有者為當(dāng)前模塊,表明這個(gè)GPIO控制器是由當(dāng)前驅(qū)動(dòng)程序管理的。
  • priv->gc.parent: 設(shè)置父設(shè)備為`serial->interface->dev`,這通常是一個(gè)USB設(shè)備或串口設(shè)備,表明GPIO控制器與之關(guān)聯(lián)。
  • priv->gc.base: 設(shè)置GPIO引腳的起始編號(hào)為-1,實(shí)際值將在注冊(cè)時(shí)由系統(tǒng)分配。
  • priv->gc.can_sleep: 設(shè)置為`true`表示這個(gè)GPIO控制器可以在睡眠狀態(tài)下工作。

1.6.3 GPIO實(shí)例

例如使用FT232H,使用FT_PROG設(shè)置AC9為I/O Mode

在Linux中可以看到多一個(gè)gpiochip512的文件夾

/sys/class/gpio$ ls
export  gpiochip512  unexport
/sys/class/gpio/gpiochip512$ ls
base  device  label  ngpio  power  subsystem  uevent
/sys/class/gpio/gpiochip512$ cat label
ftdi-cbus
/sys/class/gpio/gpiochip512$ cat ngpio
4
/sys/class/gpio/gpiochip512$ cat base
512

可以看到一共分配了4個(gè)gpio,因?yàn)锳C9是第四個(gè)GPIO,所以其GPIO編號(hào)應(yīng)該為512 + 3 = 515.

/sys/class/gpio# echo "515" > /sys/class/gpio/export 
/sys/class/gpio# ls
export  gpio515  gpiochip512  unexport

注意,這里FT_PROG雖然只配置了一個(gè)GPIO,但是驅(qū)動(dòng)層還是按照4個(gè)GPIO分配,如果暴露512可以看到返回錯(cuò)誤:

/sys/class/gpio# echo "512" > /sys/class/gpio/export 
bash: echo: 寫入錯(cuò)誤:無(wú)效的參數(shù)

?2.?ftdi_gpio_remove

這個(gè)函數(shù)將gpio移除和釋放內(nèi)存。

http://www.risenshineclean.com/news/53133.html

相關(guān)文章:

  • 做證券考試的網(wǎng)站電商seo是什么
  • 小說(shuō)網(wǎng)站制作模板網(wǎng)絡(luò)營(yíng)銷分析報(bào)告
  • 大連網(wǎng)站建設(shè)選網(wǎng)龍建網(wǎng)站
  • 做網(wǎng)站開發(fā) 用的最多的語(yǔ)言手機(jī)系統(tǒng)流暢神器
  • 去除wordpress主題底部信息網(wǎng)站seo綜合查詢
  • 建好的網(wǎng)站怎么用橙子建站
  • 營(yíng)銷型網(wǎng)站建設(shè)的注意事項(xiàng)灰色行業(yè)推廣平臺(tái)
  • 如何組建網(wǎng)站開發(fā)團(tuán)隊(duì)亞馬遜alexa
  • php做的網(wǎng)站好么自己搜20條優(yōu)化措施
  • wordpress插件 圖片上傳采集站seo提高收錄
  • php網(wǎng)站源碼怎么在本地測(cè)試網(wǎng)站設(shè)計(jì)的基本原則
  • 安徽餐飲網(wǎng)站建設(shè)市場(chǎng)監(jiān)督管理局
  • 織夢(mèng)做響應(yīng)式網(wǎng)站網(wǎng)站收錄查詢工具
  • 服裝網(wǎng)站建設(shè)價(jià)格百度瀏覽器官網(wǎng)入口
  • 專門做二手的網(wǎng)站seo是搜索引擎優(yōu)化
  • 青島做網(wǎng)站建設(shè)的公司手機(jī)登錄百度pc端入口
  • 南充網(wǎng)站建設(shè)服務(wù)商現(xiàn)在如何進(jìn)行網(wǎng)上推廣
  • 網(wǎng)站設(shè)建設(shè)表單chatgpt網(wǎng)址
  • 中小企業(yè)網(wǎng)站建設(shè)成人用品網(wǎng)店進(jìn)貨渠道
  • 網(wǎng)站定制的公司哪家好百度模擬搜索點(diǎn)擊軟件
  • 一站式做網(wǎng)站哪家專業(yè)網(wǎng)站怎么收錄到百度
  • 寧波seo網(wǎng)站服務(wù)如何推銷自己的產(chǎn)品
  • oa系統(tǒng)開發(fā)教程seo 資料包怎么獲得
  • 觸摸屏html網(wǎng)站深圳網(wǎng)絡(luò)營(yíng)銷怎么推廣
  • 溫州專業(yè)微網(wǎng)站制作多少錢sem搜索引擎
  • 建筑資料網(wǎng)站有哪些鄭州seo技術(shù)外包
  • 如果做二手車網(wǎng)站南寧seo公司
  • 團(tuán)購(gòu)營(yíng)銷型網(wǎng)站制作關(guān)鍵一招
  • 山西建設(shè)執(zhí)業(yè)注冊(cè)管理中心網(wǎng)站怎么推廣比較好
  • 優(yōu)化公司流程制度百度seo關(guān)鍵詞排名 s