1. 程式人生 > >樹莓派GPIO學習和LCD時鐘設定

樹莓派GPIO學習和LCD時鐘設定

USB 轉 TTL 中的四根線這一端是需要連結到樹莓派 GPIO 上面的。(如下圖)
在這裡插入圖片描述
紅線(VCC)接排針外面一排,靠近顯示燈一端的第一針
黑線(GND)接排針外面一排,靠近顯示燈一端的第三針
白線(TXD)接排針外面一排,靠近顯示燈一端的第四針
綠線(RTX)接排針外面一排,靠近顯示燈一端的第五針
重要提示!(切記注意,GIPIO 的第二根針是不需要接的。千萬不能接錯,否則短路燒燬板子)

1,GPIO程式設計
s3c2410_gpio_cfgpin //配置埠的GPIO的功能
s3c2410_gpio_getcfg //讀取功能配置
s3c2410_gpio_pullup //配置上拉電阻
s3c2410_modify_misccr //雜項配置
s3c2410_gpio_getirq //給定埠,轉換出IRQ號
s3c2410_gpio_irqfilter //配置IRQ過濾使能與否
s3c2410_gpio_setpin //寫資料到埠
s3c2410_gpio_getpin //從埠讀資料
ldr r0, 0x3ff意思是把以0x3ff為地址的儲存單元中的資料賦值給r0,相當於r0=[0x3ff]
而ldr r0, =0x3ff,它是一條為指令,意思是把0x3fff直接賦值給r0,相當於r0=0x3ff.

STR R1,[R0] ;將R1中的內容傳輸到R0中的數所指定的地址的記憶體中去
LDR R1,[R0] ;將R0中的數所指定的地址的內容傳輸到R1

  1. bic BIC指令的格式為: BIC{條件}{S} 目的暫存器,運算元1,運算元2
    BIC指令用於清除運算元1的某些位,並把結果放置到目的暫存器中。
    運算元1應是一個暫存器, 運算元2可以是一個暫存器、被移位的暫存器、或一個立即數。
    運算元2為32位的掩碼,如果在 掩碼中置了某一位1,則清除這一位。未設定的掩碼位保持不變。
    GPIO驅動開發
    s5p6818 GPIO驅動
    enum {
    PAD_GPIO_A = (0 * 32),
    PAD_GPIO_B = (1 * 32),
    PAD_GPIO_C = (2 * 32),
    PAD_GPIO_D = (3 * 32),
    PAD_GPIO_E = (4 * 32),
    PAD_GPIO_ALV = (5 * 32),
    };
    sp56818中驅動程式使用NX_GPIO_PADFUNC_0、NX_GPIO_PADFUNC_1、NX_GPIO_PADFUNC_2、NX_GPIO_PADFUNC_3這三個巨集,可能某個引腳輸入功能是NX_GPIO_PADFUNC_2,而輸出功能是NX_GPIO_PADFUNC_1。
    linux驅動(helloword)
    1,基於linux核心的驅動開發(Ubuntu14.04系統)
    1, Makefile(注意 table建)
    ifneq ($(KERNELRELEASE),)
    CROSS_COMPILE =
    CC =gcc //選擇編譯器
    obj-m :=hello.o
    //根據hello.c

    else
    KDIR:= /lib/modules/3.2.0-61-generic-pae/build //核心的目錄
    PWD:= /home/shiyan/4-1-2 //自己的目錄
    all:
    make -C ( K D I R )
    M = (KDIR) M=
    (PWD) modules
    clean:
    rm -f *.ko *.o *.mod.o *.mod.c .symvers
    endif
    2,首先make,生成.ko
    insmod(載入) insmod hello.ko
    rmmod(解除安裝) rmmmod hello.ko
    lsmod(檢視) lsmod | grep hello.ko

2 基於arm 開發板的驅動開發
ifneq ($(KERNELRELEASE),)
obj-m :=1_gpio.o
CROSS_COMPILE =
CC =arm-linux-gnueabihf-gcc //這裡必須是arm的編譯器
else
KDIR:= /home/tangtao/linux-3.4.y
PWD:= /home/tangtao/driver/1_day/1_gpio
all:
make -C ( K D I R ) M = (KDIR) M= (PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c .symvers
endif
生成的1_gpio.ko需要移植到開發板上進行安裝,命令和上面一樣
S5p4818-gpio瞭解:
1、功能
J60這組GPIO有20個引腳,最常用的有8個引腳(J60-1~J60-8),這個8個引腳有普通I/O功能,也可以配置成SPI功能。電路原理圖:
在這裡插入圖片描述
2、引腳名字、功能配置
在對引腳進行操作之前,我們要先找到相應的引腳在驅動中的名字,這點很重要,如果引腳找錯了,無論程式碼如何寫也無法配置出需要的功能。
那麼如何找到引腳在驅動的名字呢?以J60-1引腳為例
a) J60-1在開發板電路原理圖的名字是MCU_SPICLK0,如圖1所示。
b) MCU_SPICLK0在核心板電路原理圖對應的是GPIOC29/SPICLK0,如圖2所示。
c) GPIOC29在驅動中的命名是PAD_GPIO_C + 29(參考RP4418-4G android開發板說明文件.pdf),我們對PAD_GPIO_C + 29進行操作就可以實現對引腳MCU_SPICLK0操作。表1是各個引腳的名字與功能配置使用的巨集(參考arch/arm/plat-s5p4418/drone2/include/cfg_gpio.h)。
在這裡插入圖片描述
3、功能配置(以J60-1引腳為例)
配置引腳功能要使用到函式NX_GPIO_SetPadFunction(index, bit, func);引數index表示GPIO組:PAD_GPIO_C,引數bit表示具體哪個GPIO引腳:29,引數func表示功能選擇巨集:PAD_FUNC_ALT0/ PAD_FUNC_ALT1。
如要將J60-1配置成SPI功能:NX_GPIO_SetPadFunction(PAD_GPIO_C, 29, PAD_FUNC_ALT1);
4、J60 中的GPIO與上下、左右四個按鍵(即K11、K20、K19、K15)共用相同的引腳,在按鍵驅動(參考:nxp_io_key.c)中,這幾個引腳是中斷功能的,如果在J60 GPIO控制驅動(參考:rp_gpio_ctrl.c),對這幾個引腳進行操作,將會破壞其中斷功能。如不需要使用這四個按鍵,可以不編譯nxp_io_key.c,在 rp_gpio_ctrl.c修改程式碼可以實現對這幾個引腳的控制。如需要使用到這四個按鍵,那麼就不允許在rp_gpio_ctrl.c對這四個按鍵的引腳進行操作。在rp_gpio_ctrl.c中,只要控制J60_NUM這個巨集的值就可以實現切換控制。
//如果J60_NUM == 0,那麼驅動控制j60-1~j60-8,
//如果J60_NUM == 4,那麼驅動控制j60-5~j60-8
#define J60_NUM 4 //35行
2,lcd驅動筆記
在這裡插入圖片描述
__u32 pixclock; /畫素時鐘(皮秒)/
  __u32 left_margin; /行切換,從同步到繪圖之間的延遲/
  __u32 right_margin; /行切換,從繪圖到同步之間的延遲/
  __u32 upper_margin; /幀切換,從同步到繪圖之間的延遲/
  __u32 lower_margin; /幀切換,從繪圖到同步之間的延遲/
  __u32 hsync_len; /水平同步的長度/
  __u32 vsync_len; /垂直同步的長度/
VBP(vertical back porch):表示在一幀影象開始時,垂直同步訊號以後的無效的行數,對應驅動中的upper_margin;
  VFB(vertical front porch):表示在一幀影象結束後,垂直同步訊號以前的無效的行數,對應驅動中的lower_margin;
  VSPW(vertical sync pulse width):表示垂直同步脈衝的寬度,用行數計算,對應驅動中的vsync_len;
  HBP(horizontal back porch):表示從水平同步訊號開始到一行的有效資料開始之間的VCLK的個數,對應驅動中的left_margin;
 HFP(horizontal front porth):表示一行的有效資料結束到下一個水平同步訊號開始之間的VCLK的個數,對應驅動中的right_margin;
HSPW(horizontal sync pulse width):表示水平同步訊號的寬度,用VCLK計算,對應驅動中的hsync_len;
pixclock的計算:
DOTCLK = fframe × (X + HBP + HFP+HSPW) × (Y + VBP + VFP+VSPW) (單位:MHz)
pixclock = 1012/ DOTCLK=1012/ (fframe × (X + HBP + HFP+HSPW) × (Y + VBP + VFP+VSPW)) (單位:皮秒)