android下調試3G之gpio控制3G上電

來源:互聯網
上載者:User

標籤:3g   linux   android   gpio   驅動   

      如果是自己開發的板子,需要用GPIO引腳控制3G模組開機/關機時,下面的文章會對你有所協助,是以處理器IMX6和中興MG3732模組為例介紹。

一、引腳串連

       處理器的gpio3_GPIO[9]串連3G模組的ON/OFF(29)引腳來控制3G的開機/關機。

二、開關機條件

       給ON/OFF引腳連續2500~3500毫秒低電平則開機,給再ON/OFF引腳連續2500~3500毫秒低電平則關機。

三、gpio驅動程式

       gpio_3g.c 

#include<linux/module.h>#include<linux/kernel.h>#include<linux/init.h>#include<linux/fs.h>#include<linux/cdev.h>#include<linux/device.h>#include<asm/io.h>#include<linux/mm.h>#include<asm/uaccess.h>#include<linux/gpio.h>#define GPIO_IOF_MAGIC 0xd0#define 3G_INPUT    _IO(GPIO_IOF_MAGIC,8)#define 3G_OUTPUT   _IO(GPIO_IOF_MAGIC,9)#define 3G_ON_OFFIMX_GPIO_NR(3,9)    //控制引腳為:gpio3[9]MODULE_LICENSE ("GPL");int gpio_major=2555;int gpio_minor=0;int number_devices=1;struct cdev gpiocdev;struct class *my_class;static int gpio_open(struct inode *inode,struct file *file){printk (KERN_INFO "GPIO device opened\n");if(gpio_direction_output(3G_ON_OFF,0x00)<0){printk("3G_ON_OFF set direction failed\n");}  return 0;}static long gpio_ioctl(struct file *file,unsigned int cmd,unsigned long arg){int val;printk("GPIO:ioctl running....\n");switch(cmd){case 3G_INPUT:if(gpio_direction_input(3G_ON_OFF)<0){printk("3G_ON_OFF set input failed\n");}if(arg>0){gpio_set_value(3G_ON_OFF,0x01);}else{gpio_set_value(3G_ON_OFF,0x00);}val=gpio_get_value(3G_ON_OFF);printk("3G_ON_OFF ioctl val=%d\n",val);break;case 3G_OUTPUT:if(gpio_direction_output(3G_ON_OFF,0x00)<0){printk("3G_ON_OFF set direction failed\n");}if(arg>0){gpio_set_value(3G_ON_OFF,0x01);}else{gpio_set_value(3G_ON_OFF,0x00);}val=gpio_get_value(3G_ON_OFF);printk("3G_ON_OFF ioctl val=%d\n",val);break;default:printk("cmd is not exist\n");return -1;}return val;}static int gpio_release (struct inode *inode, struct file *file){printk (KERN_INFO "GPIO device closed\n");  return 0;}struct file_operations gpio_fops = {.owner=THIS_MODULE,.open=gpio_open,.release=gpio_release,.unlocked_ioctl=gpio_ioctl,};static void char_reg_setup_cdev (void){int error;dev_t devno;devno=MKDEV(gpio_major,gpio_minor);cdev_init(&gpiocdev,&gpio_fops);gpiocdev.owner=THIS_MODULE;error=cdev_add(&gpiocdev,devno,1);if (error)printk(KERN_NOTICE "Error %d adding char device GPIO",error);}static int __init gpio_init (void){int result;dev_t devno;devno=MKDEV(gpio_major,gpio_minor);if(gpio_major){result=register_chrdev_region(devno,number_devices,"gpio_3g");}else{result=alloc_chrdev_region(&devno,0,number_devices,"gpio_3g");gpio_major=MAJOR(devno);}if (result<0){printk(KERN_WARNING "GPIO:can't get major number %d\n", gpio_major);return result;}char_reg_setup_cdev ();my_class=class_create(THIS_MODULE,"GPIOCLASS");device_create(my_class,NULL,MKDEV(gpio_major,gpio_minor),NULL,"gpio_3g");if(gpio_request(3G_ON_OFF,"UnKnow")<0){printk("3G_ON_OFF request failed\n");}printk (KERN_INFO "char device GPIO registered\n");return 0;}static void __exit gpio_exit(void){dev_t devno=MKDEV(gpio_major,gpio_minor);gpio_free(3G_ON_OFF);cdev_del(&gpiocdev);unregister_chrdev_region(devno,number_devices);device_destroy(my_class,devno);class_destroy(my_class);printk(KERN_INFO"char device GPIO  unregister\n");}module_init (gpio_init);module_exit (gpio_exit);


四、核心添加gpio驅動步驟(android4.3源碼)

      1、把gpio_3g.c放到~/myandroid/kernel_imx/drivers/char目錄下(假設源碼在~/myandroid下)。

      2、~/myandroid/kernel_imx/drivers/char/Konfig中最後添加紅色框部分語句。

          

      3、在~/myandroid/kernel_imx/drivers/char/Makefile中添加紅色框部分語句。

          

      4、在~/myandroid/kernel_imx下 make  menuconfig 來配置核心,配置完成後退出並儲存。如:

          

          

          

          

      5、在進入~/myandroid/kernel_imx目錄執行:

            cp  .config   arch/arm/configs/imx6_android_defconfig

            到此後,行以下命令編譯:

             source build/enevsetup.sh

             lunch sabresb_6dq-user

             make

 

五、編譯3G模組開關機程式

      1、程式碼

       3g_on_off.c  

#include<stdio.h>#include<unistd.h>#include<fcntl.h>#include<errno.h>#include<sys/ioctl.h>#include<sys/types.h>#define 3G_INPUT     _IO(GPIO_IOF_MAGIC,8)#define 3G_OUTPUT    _IO(GPIO_IOF_MAGIC,9)#define SET_ON           0x01#define SET_OFF          0x00int main(int argc, char *argv[]){int fd;fd=open("/dev/gpio_3g",O_RDWR); //開啟gpio_3g裝置檔案if(fd<0){perror("open:");}if(ioctl(fd,3G_OUTPUT,SET_ON)<0){ //設定該引腳為輸出高perror("3G_OUTPUT ioctl:");}sleep(3);if(ioctl(fd,3G_OUTPUT,SET_OFF)<0){ //設定該引腳為輸出低perror("3G_OUTPUT ioctl:");}if(ioctl(fd,3G_INPUT,SET_OFF)<0){ //設定該引腳為輸入,防止被意外篡改perror("3G_INPUT ioctl:");}close(fd);return 0;}

       Android.mk   

LOCAL_PATH:=$(call my-dir)include$(CLEAR_VARS)LOCAL_MODULE_TAGES:=optionalLOCAL_MODULE:=3g_on_offLOCAL_SRC_FILES:=3g_on_off.cinclude$(BUILD_EXECUTABLE)

     

      2、在~/myandroid/external下建立 3g_on_off檔案夾

      3、把 3g_on_off.c 和 Android.mk 檔案放到建立檔案夾下。

      4、執行以下命令編譯:

            source  build/enevsetup.sh

            lunch  sabresb_6dq-user

            mmm  external/3g_on_off

      5、把產生的可執行程式:

            ~/myandroid/out/target/product/sabresd_6dq/obj/EXECUTABLES/3g_on_off_intermediates/3g_on_off放到

            ~/myandroid/out/target/product/sabresd_6dq/system裡面

            執行:make  snod   打包

六、燒寫鏡像到開發板,執行3g_on_off程式對3G模組進行開關機操作。

 

 

 

android下調試3G之gpio控制3G上電

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.