日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux中probe函数传递参数的寻找(下)

發(fā)布時間:2025/4/16 linux 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux中probe函数传递参数的寻找(下) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊打開鏈接

linux中probe函數(shù)傳遞參數(shù)的尋找(下)

???????? 通過追尋driver的腳步,我們有了努力的方向:只有找到spi_bus_type的填充device即可,下面該從device去打通,當(dāng)兩個連通之日,也是任督二脈打通之時。先從設(shè)備定義去查看,在mach-smdk6410.c中定義了硬件設(shè)備信息,從這作為突破口。

/* for mx25lx*/

static void?cs_set_level(unsigned line_id, int lvl) {

???gpio_direction_output(line_id, lvl);

};

static struct s3c64xx_spi_csinfos3c64xx_spi1_csinfo = {

? ???? .fb_delay=0x3,

? ???? .line=S3C64XX_GPC(7),

?????? .set_level=cs_set_level,

};

?

static int mx25lx_ioSetup(struct spi_device*spi)

{

???????? printk(KERN_INFO"mx25lx: setup gpio pins CS and External Int\n");

???????? s3c_gpio_setpull(S3C64XX_GPL(8),S3C_GPIO_PULL_UP);????????????? //External interrupt from CAN controller

???????? s3c_gpio_cfgpin(S3C64XX_GPL(8),S3C_GPIO_SFN(3)); ????????????????? //External interrupt from CAN controller (hopefully external interrupt)

???????? //s3c_gpio_cfgpin(S3C64XX_GPL(8),S3C_GPIO_INPUT);???????????????? //External interrupt from CAN controller

???????? s3c_gpio_setpull(S3C64XX_GPC(7),S3C_GPIO_PULL_NONE);?????? // Manual chipselect pin as used in 6410_set_cs

???????? s3c_gpio_cfgpin(S3C64XX_GPC(7),S3C_GPIO_OUTPUT);??????????????? // Manualchip select pin as used in 6410_set_cs

???????? return0;

}

?

static?struct mx25lx_platform_datamx25lx_info?=

{

???????? .oscillator_frequency= 8000000,

???????? .board_specific_setup= mx25lx_ioSetup,

???????? .transceiver_enable= NULL,

???????? .power_enable= NULL,

};

?

static struct spi_board_info __initdataforlinx6410_mc251x_info[]? =

{

???????? {

?????????????????? .modalias= "mcp2515",

???????????????????.platform_data = &mx25lx_info,

?????????????????? .irq= IRQ_EINT(16),

?????????????????? .max_speed_hz= 10*1000*1000,?

?????????????????? .bus_num= 1,

?????????????????? .chip_select= 0,

?????????????????? .mode= SPI_MODE_0,???

?????????????????? .controller_data=&s3c64xx_spi1_csinfo,

???????? },

};

?

struct platform_device s3c64xx_device_spi0= {

???????? .name??????????????? ?= "s3c64xx-spi",

???????? .id????????????? ?= 0,

???????? .num_resources?????? ? =ARRAY_SIZE(s3c64xx_spi0_resource),

???????? .resource ? =s3c64xx_spi0_resource,

???????? .dev= {

?????????????????? .dma_mask?????????????? = &spi_dmamask,

?????????????????? .coherent_dma_mask???? = DMA_BIT_MASK(32),

?????????????????? .platform_data= &s3c64xx_spi0_pdata,

???????? },

};

?

static struct platform_device*smdk6410_devices[] __initdata =

{

???????? ……

???????? /*addby fatfish*/

???????? &s3c64xx_device_spi0,

???????? &s3c64xx_device_spi1,

};

?

???????? 其中platform_device定義為:

struct platform_device {

???????? constchar??????? * name;

???????? int????????????? id;

???????? structdevice??? dev;

???????? u32??????????? num_resources;

???????? structresource??????? * resource;

?

???????? conststruct platform_device_id???? *id_entry;

?

???????? /*MFD cell pointer */

???????? structmfd_cell *mfd_cell;

?

???????? /*arch specific additions */

???????? structpdev_archdata????? archdata;

};

?

???????? 初始化函數(shù)如下:

static void __initsmdk6410_machine_init(void)

{

???????? ……

???????? s3c64xx_spi_set_info(0,0,1);

???????? s3c64xx_spi_set_info(1,0,1);

???????? spi_register_board_info(forlinx6410_mc251x_info,ARRAY_SIZE(forlinx6410_mc251x_info));

???????? ……

}

?????? 其中的注冊板信息的函數(shù)如下,后項參數(shù)為1,其中board_list為spi.c中定義的全局變量,即:static LIST_HEAD(board_list);。

int __init

spi_register_board_info(structspi_board_info const *info, unsigned n)

{

???????? structboardinfo *bi;

???????? inti;

?

???????? bi= kzalloc(n * sizeof(*bi), GFP_KERNEL);

???????? if(!bi)

?????????????????? return-ENOMEM;

?

???????? for(i = 0; i < n; i++, bi++, info++) {

?????????????????? structspi_master *master;

?

?????????????????? memcpy(&bi->board_info,info, sizeof(*info));

?????????????????? mutex_lock(&board_lock);

?????????????????? list_add_tail(&bi->list,&board_list);

?????????????????? list_for_each_entry(master,&spi_master_list, list)

??????????????????????????? spi_match_master_to_boardinfo(master,&bi->board_info);

?????????????????? mutex_unlock(&board_lock);

???????? }

?

???????? return0;

}

???????? 其中結(jié)果成員如下:


???????? 先加鎖,然后將board_list加入鏈接中,在遍歷設(shè)備,最關(guān)鍵的函數(shù)是:

static voidspi_match_master_to_boardinfo(struct spi_master *master,

???????????????????????????????????? structspi_board_info *bi)

{

???????? structspi_device *dev;

?

???????? if(master->bus_num != bi->bus_num)

?????????????????? return;

?

???????? dev= spi_new_device(master, bi);

???????? if(!dev)

?????????????????? dev_err(master->dev.parent,"can't create new device for %s\n",

??????????????????????????? bi->modalias);

}

???????? spi_new_device作用是實例化一個新設(shè)備,定義如下:

struct spi_device *spi_new_device(structspi_master *master,

???????????????????????????????????? ? struct spi_board_info *chip)

{

???????? structspi_device???? *proxy;

???????? int?????????????????????? status;

?

?

???????? proxy= spi_alloc_device(master);

???????? if(!proxy)

?????????????????? returnNULL;

?

……

???????? strlcpy(proxy->modalias,chip->modalias, sizeof(proxy->modalias));

?????????proxy->dev.platform_data = (void *)chip->platform_data;

???????? proxy->controller_data= chip->controller_data;

???????? proxy->controller_state= NULL;

?

???????? status= spi_add_device(proxy);

???????? if(status < 0) {

?????????????????? spi_dev_put(proxy);

?????????????????? returnNULL;

???????? }

?

???????? returnproxy;

}

?

???????? 拷貝了platform_data,即mx25lx_info。其中的spi_alloc_device函數(shù)定義如下:

struct spi_device *spi_alloc_device(structspi_master *master)

{

???????? structspi_device???? *spi;

???????? structdevice???????????? *dev =master->dev.parent;

?

???????? if(!spi_master_get(master))

?????????????????? returnNULL;

?

???????? spi= kzalloc(sizeof *spi, GFP_KERNEL);

???????? if(!spi) {

?????????????????? dev_err(dev,"cannot alloc spi_device\n");

?????????????????? spi_master_put(master);

?????????????????? returnNULL;

???????? }

?

???????? spi->master= master;

???????? spi->dev.parent= dev;

???????? spi->dev.bus= &spi_bus_type;

???????? spi->dev.release= spidev_release;

???????? device_initialize(&spi->dev);

???????? returnspi;

}

???????? 在這個定義中將spi_bus_type和dev聯(lián)系起來,不過此時還沒有我們定義的設(shè)備信息,設(shè)備信息在接下來的賦值中完成。

???????? 最后是spi_add_device,將設(shè)備信息提交。

int spi_add_device(struct spi_device *spi)

{

???????? staticDEFINE_MUTEX(spi_add_lock);

???????? structdevice *dev = spi->master->dev.parent;

???????? structdevice *d;

???????? intstatus;

?

……

???????? mutex_lock(&spi_add_lock);

?

???????? d= bus_find_device_by_name(&spi_bus_type, NULL, dev_name(&spi->dev));

???????? ……

???????? status= spi_setup(spi);

???????? if(status < 0) {

?????????????????? dev_err(dev,"can't setup %s, status %d\n",

???????????????????????????????????? dev_name(&spi->dev),status);

?????????????????? gotodone;

???????? }

……

done:

???????? mutex_unlock(&spi_add_lock);

???????? returnstatus;

}

???????? 最終完成將spi_bus_type與定義的device信息聯(lián)系起來。由于本人才疏學(xué)淺,不正確的地方,懇求大牛指正,在此表示感謝


總結(jié)

以上是生活随笔為你收集整理的linux中probe函数传递参数的寻找(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av在线不卡一区 | 艳妇乳肉豪妇荡乳 | 99久久免费国产精精品 | 免费成人在线视频观看 | 毛片天天看 | 污视频免费看 | 天天色亚洲 | 玖草视频在线观看 | 国产精品无码毛片 | 日本精品视频在线 | 日韩一级av毛片 | 亚洲乱码中文字幕 | 草草福利影院 | 成人免费毛片片v | 麻豆传谋在线观看免费mv | 天天看天天做 | 国产综合网站 | 成年人网站在线观看视频 | 国产真实生活伦对白 | 新超碰97 | www.久久伊人 | 亚洲av电影一区二区 | 嫩草视频在线观看 | 日本黄色天堂 | 亚洲啪啪网址 | 国模一区二区三区 | 91一区二区在线观看 | 欧美黄色三级 | 久久视频在线观看 | 一区二区不卡在线 | 超碰97在线播放 | 国产高清免费在线观看 | 亚洲高清在线观看 | 麻豆精品a∨在线观看 | 91黄色免费看 | 超碰97国产在线 | 国产视频在线观看一区 | 人妻视频一区二区 | a视频在线观看免费 | 人人草人人爱 | 成人性生交大片 | 国产第三页 | 亚洲影视在线观看 | 你懂得在线视频 | 能看的av网站 | 国产精品污www一区二区三区 | 999xxxx| 亚洲综合精品视频 | 老女人人体欣赏a√s | 亚洲iv一区二区三区 | 国产精品久久久一区二区 | 任我爽在线 | 欧美在线视频免费 | 国产精品av在线免费观看 | 韩日中文字幕 | 精品在线你懂的 | 制服丝袜先锋 | 青青草视频在线看 | 亚洲av永久无码精品放毛片 | 综合激情五月婷婷 | 久久精品5 | 日本不卡一二三区 | 喷水视频在线观看 | 男人的天堂成人 | 国产精品嫩草影院桃色 | 一级性生活免费视频 | 五月天激情开心网 | 成人黄色小视频在线观看 | 国产精品一区在线免费观看 | 亚日韩欧美 | 四虎精品视频 | www.毛片com| 中文字幕精品一区久久久久 | av在线入口 | 欧美精品1 | 黄色网址视频在线观看 | 97精品国产97久久久久久春色 | 精品无码人妻一区二区三 | jizz欧美大片 | 精品人妻一区二区三区潮喷在线 | 国产精品一区二区av | 日韩国产欧美在线视频 | 午夜精品福利一区二区三区蜜桃 | 亚洲视频在线免费 | 2019亚洲天堂 | 日韩精品在线一区二区三区 | 香蕉视频在线观看黄 | 亚洲一区人妻 | 国产免费一区二区三区四区五区 | 亚洲精品国产成人av在线 | www.欧美亚洲 | 欧美a级成人淫片免费看 | 日韩免费视频观看 | 一区二区国产在线观看 | 超碰av人人 | av自拍 | 欧美视频一级 | 免费日本黄色网址 | 日日摸天天爽天天爽视频 |