怎么在網(wǎng)站中做彈窗廣告百度官方官網(wǎng)
目錄
- 前言
- 一、配置內(nèi)容
- 二、驅(qū)動代碼實現(xiàn)
- 三、總結(jié)
前言
本筆記總結(jié)linux下使用gpio模擬spi時序的方法,基于arm64架構(gòu)的一個SOC,linux內(nèi)核版本為linux5.10.xxx,以驅(qū)動三線spi(時鐘線sclk,片選cs,sdata數(shù)據(jù)讀和寫使用同一個數(shù)據(jù)線進行分時復(fù)用做半雙工)的hmc704x為例;
一、配置內(nèi)容
設(shè)備樹配置
1.在芯片的引腳模式寄存器中配置 cs ,sclk , mosi ,miso為 gpio模式;
2.在spi控制器下添加pinctrl-x = 引腳引用,對引腳的模式進行生效
;
3.在spi控制器的節(jié)點下添加spi從設(shè)備節(jié)點,并定義cs,sclk,mosi,miso的gpio屬性:
spics = <引用>;
spiclk = <引用>;
spimiso = <引用>;
spimosi = <引用>;
二、驅(qū)動代碼實現(xiàn)
1、gpio請求
int spics_gpio = 0;
int spiclk_gpio = 0;
int spimiso_gpio = 0;
int spimosi_gpio = 0;
void xxx_probe(xxxx)
{spics_gpio = of_get_named_gpio(spi->dev.of_node,"spics",0);if(spics_gpio<0){printk("faild to request gpio!\n");}gpio_request(spics_gpio,NULL);gpio_direction_output(spics_gpio,0);spiclk_gpio = of_get_named_gpio(spi->dev.of_node,"spiclk",0);if(spics_gpio<0){printk("faild to request gpio!\n");}printk("get GPIO%d\n",spiclk_gpio);gpio_request(spiclk_gpio,NULL);gpio_direction_output(spiclk_gpio,0);spimiso_gpio = of_get_named_gpio(spi->dev.of_node,"spimiso",0);
if(spimiso_gpio<0){printk("faild to request gpio!\n");
}
gpio_request(spimiso_gpio,NULL);gpio_direction_output(spimiso_gpio,0);spimosi_gpio = of_get_named_gpio(spi->dev.of_node,"spimosi",0);if(spimosi_gpio<0){printk("faild to request gpio!\n");}
gpio_request(spimosi_gpio,NULL);gpio_direction_output(spimosi_gpio,0);
}
2、讀寫函數(shù)實現(xiàn)
讀寫時序
讀函數(shù)
#define HMC7044_WRITE (0 << 15)
#define HMC7044_READ (1 << 15)
#define HMC7044_CNT(x) (((x) - 1) << 13)
#define HMC7044_ADDR(x) ((x) & 0xFFF)static int xxx_read(unsigned int reg,unsigned int *val)
{u16 cmd,i;u32 data,datatemp;uint8_t tempvalue = 0;cmd = HMC7044_READ | HMC7044_CNT(1) | HMC7044_ADDR(reg);data = cmd; gpio_direction_output(spimosi_gpio,0);gpio_set_value(spics_gpio,1);gpio_set_value(spiclk_gpio,0);gpio_set_value(spimosi_gpio,0);udelay(5);gpio_set_value(spics_gpio,0);for(i=0;i<16;i++){gpio_set_value(spiclk_gpio,0);datatemp = ((data>>(15-i)) & 0x1);if(datatemp>0) gpio_set_value(spimosi_gpio,1);else gpio_set_value(spimosi_gpio,0);udelay(5);gpio_set_value(spiclk_gpio,1);udelay(5);}gpio_direction_input(spimosi_gpio);for(i=0;i<8;i++){gpio_set_value(spiclk_gpio,0);udelay(5);tempvalue<<=1;gpio_set_value(spiclk_gpio,1);if(gpio_get_value(spimosi_gpio)){tempvalue++;}udelay(5);}gpio_set_value(spics_gpio,1);*val = tempvalue;return 0;
}
寫函數(shù)
static int xxx_write(unsigned int reg,unsigned int val)
{ u16 cmd,i;u32 data,datatemp;cmd = HMC7044_WRITE | HMC7044_CNT(1) | HMC7044_ADDR(reg);data = (cmd << 8) | (val & 0xFF);gpio_direction_output(spimosi_gpio,0);gpio_set_value(spics_gpio,1); gpio_set_value(spiclk_gpio,0);gpio_set_value(spimosi_gpio,0);udelay(5);gpio_set_value(spics_gpio,0);for(i=0;i<24;i++){gpio_set_value(spiclk_gpio,0);datatemp = ((data>>(23-i)) & 0x1);if(datatemp>0) gpio_set_value(spimosi_gpio,1); else gpio_set_value(spimosi_gpio,0);udelay(5);gpio_set_value(spiclk_gpio,1);udelay(5);}gpio_set_value(spics_gpio,1);return 0;
}
三、總結(jié)
具體的芯片讀寫協(xié)議不一樣,按具體spi時序協(xié)議做相應(yīng)修改即可;