1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 嵌入式linux驱动开发之移远4G模块EC800驱动移植指南

嵌入式linux驱动开发之移远4G模块EC800驱动移植指南

时间:2020-10-13 06:42:20

相关推荐

嵌入式linux驱动开发之移远4G模块EC800驱动移植指南

回顾下移远4G模块移植过程, 还是蛮简单的。一通百通,无论是其他4G模块都是一样的。这里记录下过程,分享给有需要的人。环境使用正点原子的imax6ul开发板,板子默认支持中兴和移远EC20的驱动,这里要移植使用的是移远4G模块EC800。

环境准备

imax6ul开发板

虚拟机(Ubuntu18.04)

交叉编译工具链

内核源码

安装依赖

# 安装 lzop 工具,用于生成压缩或解压镜像sudo apt-get install lzop # 安装 ncurese 相关库, U-boot 或者内核菜单显示时需要sudo apt-get install libncurses*

内核配置

imx6ul开发板的imx_v7_defconfig的linux内核配置:

CONFIG_APM_EMULATION=yCONFIG_KERNEL_LZO=yCONFIG_SYSVIPC=yCONFIG_NO_HZ=yCONFIG_HIGH_RES_TIMERS=yCONFIG_IKCONFIG=yCONFIG_IKCONFIG_PROC=yCONFIG_LOG_BUF_SHIFT=18CONFIG_CGROUPS=yCONFIG_RELAY=yCONFIG_BLK_DEV_INITRD=yCONFIG_EXPERT=yCONFIG_KALLSYMS_ALL=yCONFIG_PERF_EVENTS=yCONFIG_PRINTK_TIME=y# CONFIG_SLUB_DEBUG is not set# CONFIG_COMPAT_BRK is not setCONFIG_MODULES=yCONFIG_MODULE_UNLOAD=yCONFIG_MODVERSIONS=yCONFIG_MODULE_SRCVERSION_ALL=y# CONFIG_BLK_DEV_BSG is not setCONFIG_ARCH_MXC=yCONFIG_SOC_IMX50=yCONFIG_SOC_IMX53=yCONFIG_SOC_IMX6Q=yCONFIG_SOC_IMX6SL=yCONFIG_SOC_IMX6SX=yCONFIG_SOC_IMX6ULL=yCONFIG_SOC_IMX7D=yCONFIG_SOC_IMX6SLL=yCONFIG_SOC_VF610=y# CONFIG_SWP_EMULATE is not setCONFIG_SMP=yCONFIG_HAVE_ARM_ARCH_TIMER=yCONFIG_VMSPLIT_2G=yCONFIG_PREEMPT=yCONFIG_AEABI=yCONFIG_HIGHMEM=yCONFIG_CMA=yCONFIG_CMDLINE="noinitrd console=ttymxc0,115200"CONFIG_CPU_FREQ=yCONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=yCONFIG_CPU_FREQ_GOV_POWERSAVE=yCONFIG_CPU_FREQ_GOV_USERSPACE=yCONFIG_CPU_FREQ_GOV_INTERACTIVE=yCONFIG_CPU_FREQ_GOV_CONSERVATIVE=yCONFIG_ARM_IMX6Q_CPUFREQ=yCONFIG_ARM_IMX7D_CPUFREQ=yCONFIG_CPU_IDLE=yCONFIG_VFP=yCONFIG_NEON=yCONFIG_BINFMT_MISC=mCONFIG_PM_DEBUG=yCONFIG_PM_TEST_SUSPEND=yCONFIG_NET=yCONFIG_PACKET=yCONFIG_UNIX=yCONFIG_INET=yCONFIG_IP_PNP=yCONFIG_IP_PNP_DHCP=y# CONFIG_INET_XFRM_MODE_TRANSPORT is not set# CONFIG_INET_XFRM_MODE_TUNNEL is not set# CONFIG_INET_XFRM_MODE_BEET is not set# CONFIG_INET_LRO is not setCONFIG_IPV6=yCONFIG_VLAN_8021Q=yCONFIG_LLC2=yCONFIG_CAN=yCONFIG_CAN_FLEXCAN=yCONFIG_CAN_M_CAN=yCONFIG_BT=yCONFIG_BT_RTKBTUSB=mCONFIG_BT_RFCOMM=yCONFIG_BT_RFCOMM_TTY=yCONFIG_BT_BNEP=yCONFIG_BT_BNEP_MC_FILTER=yCONFIG_BT_BNEP_PROTO_FILTER=yCONFIG_BT_HIDP=yCONFIG_BT_HCIBTUSB=yCONFIG_BT_HCIUART=yCONFIG_BT_HCIUART_BCSP=yCONFIG_BT_HCIUART_ATH3K=yCONFIG_BT_HCIBCM203X=yCONFIG_BT_ATH3K=yCONFIG_CFG80211=yCONFIG_CFG80211_WEXT=yCONFIG_USB_ZD1201=mCONFIG_MAC80211=yCONFIG_DEVTMPFS=yCONFIG_DEVTMPFS_MOUNT=y# CONFIG_STANDALONE is not setCONFIG_DMA_CMA=yCONFIG_CMA_SIZE_MBYTES=0CONFIG_IMX_WEIM=yCONFIG_CONNECTOR=yCONFIG_MTD=yCONFIG_MTD_CMDLINE_PARTS=yCONFIG_MTD_BLOCK=yCONFIG_MTD_CFI=yCONFIG_MTD_JEDECPROBE=yCONFIG_MTD_CFI_INTELEXT=yCONFIG_MTD_CFI_AMDSTD=yCONFIG_MTD_CFI_STAA=yCONFIG_MTD_PHYSMAP_OF=yCONFIG_MTD_DATAFLASH=yCONFIG_MTD_M25P80=yCONFIG_MTD_SST25L=yCONFIG_MTD_NAND=yCONFIG_MTD_NAND_GPMI_NAND=yCONFIG_MTD_NAND_MXC=yCONFIG_MTD_SPI_NOR=yCONFIG_SPI_FSL_QUADSPI=yCONFIG_MTD_UBI=yCONFIG_BLK_DEV_LOOP=yCONFIG_BLK_DEV_RAM=yCONFIG_BLK_DEV_RAM_SIZE=65536CONFIG_SENSORS_FXOS8700=yCONFIG_SENSORS_FXAS2100X=yCONFIG_EEPROM_AT24=yCONFIG_EEPROM_AT25=y# CONFIG_SCSI_PROC_FS is not setCONFIG_BLK_DEV_SD=yCONFIG_SCSI_CONSTANTS=yCONFIG_SCSI_LOGGING=yCONFIG_SCSI_SCAN_ASYNC=y# CONFIG_SCSI_LOWLEVEL is not setCONFIG_ATA=yCONFIG_SATA_AHCI_PLATFORM=yCONFIG_AHCI_IMX=yCONFIG_PATA_IMX=yCONFIG_NETDEVICES=y# CONFIG_NET_VENDOR_BROADCOM is not setCONFIG_CS89x0=yCONFIG_CS89x0_PLATFORM=y# CONFIG_NET_VENDOR_FARADAY is not set# CONFIG_NET_VENDOR_INTEL is not set# CONFIG_NET_VENDOR_MARVELL is not set# CONFIG_NET_VENDOR_MICREL is not set# CONFIG_NET_VENDOR_MICROCHIP is not set# CONFIG_NET_VENDOR_NATSEMI is not set# CONFIG_NET_VENDOR_SEEQ is not setCONFIG_SMC91X=yCONFIG_SMC911X=yCONFIG_SMSC911X=yCONFIG_SMSC_PHY=y# CONFIG_NET_VENDOR_STMICRO is not setCONFIG_MICREL_PHY=yCONFIG_PPP=yCONFIG_PPP_BSDCOMP=yCONFIG_PPP_DEFLATE=yCONFIG_PPP_FILTER=yCONFIG_PPP_MPPE=yCONFIG_PPP_MULTILINK=yCONFIG_PPPOE=yCONFIG_PPP_ASYNC=yCONFIG_PPP_SYNC_TTY=yCONFIG_USB_PEGASUS=mCONFIG_USB_RTL8150=mCONFIG_USB_RTL8152=mCONFIG_USB_USBNET=yCONFIG_USB_NET_CDC_EEM=mCONFIG_BCMDHD=yCONFIG_BCMDHD_SDIO=yCONFIG_BCMDHD_FW_PATH="/lib/firmware/bcm/ZP_BCM4339/fw_bcmdhd.bin"CONFIG_BCMDHD_NVRAM_PATH="/lib/firmware/bcm/ZP_BCM4339/bcmdhd.ZP.OOB.cal"CONFIG_RTL_CARDS=mCONFIG_RTL8188EUS=mCONFIG_USB_GOBI_NET=mCONFIG_EXTRA_RTL8192CU=mCONFIG_BRIDGE=yCONFIG_RFKILL=yCONFIG_RFKILL_INPUT=y# CONFIG_INPUT_MOUSEDEV_PSAUX is not setCONFIG_INPUT_EVDEV=yCONFIG_INPUT_EVBUG=mCONFIG_KEYBOARD_GPIO=yCONFIG_KEYBOARD_IMX=yCONFIG_MOUSE_PS2=mCONFIG_MOUSE_PS2_ELANTECH=yCONFIG_INPUT_TOUCHSCREEN=yCONFIG_TOUCHSCREEN_ADS7846=yCONFIG_TOUCHSCREEN_EGALAX=yCONFIG_TOUCHSCREEN_ELAN_TS=yCONFIG_TOUCHSCREEN_MAX11801=yCONFIG_TOUCHSCREEN_IMX6UL_TSC=yCONFIG_TOUCHSCREEN_MC13783=yCONFIG_TOUCHSCREEN_TSC=yCONFIG_TOUCHSCREEN_STMPE=yCONFIG_TOUCHSCREEN_EDT_FT5X06=yCONFIG_TOUCHSCREEN_GT9XX=yCONFIG_INPUT_MISC=yCONFIG_INPUT_MMA8450=yCONFIG_INPUT_MPL3115=yCONFIG_SENSOR_FXLS8471=yCONFIG_INPUT_ISL29023=yCONFIG_SERIO_SERPORT=m# CONFIG_LEGACY_PTYS is not set# CONFIG_DEVKMEM is not setCONFIG_SERIAL_IMX=yCONFIG_SERIAL_IMX_CONSOLE=yCONFIG_SERIAL_FSL_LPUART=yCONFIG_SERIAL_FSL_LPUART_CONSOLE=yCONFIG_FSL_OTP=yCONFIG_LITEON_AP3216C=yCONFIG_HW_RANDOM_IMX_RNG=y# CONFIG_I2C_COMPAT is not setCONFIG_I2C_CHARDEV=y# CONFIG_I2C_HELPER_AUTO is not setCONFIG_I2C_ALGOPCF=mCONFIG_I2C_ALGOPCA=mCONFIG_I2C_IMX=yCONFIG_SPI=yCONFIG_SPI_GPIO=yCONFIG_SPI_IMX=yCONFIG_SPI_SPIDEV=yCONFIG_GPIO_SYSFS=yCONFIG_GPIO_MAX732X=yCONFIG_GPIO_PCA953X=yCONFIG_GPIO_74X164=yCONFIG_POWER_SUPPLY=yCONFIG_SABRESD_MAX8903=yCONFIG_POWER_RESET=yCONFIG_POWER_RESET_SYSCON_POWEROFF=yCONFIG_SENSORS_MAX17135=yCONFIG_SENSORS_MAG3110=yCONFIG_THERMAL=yCONFIG_CPU_THERMAL=yCONFIG_IMX_THERMAL=yCONFIG_DEVICE_THERMAL=yCONFIG_WATCHDOG=yCONFIG_IMX2_WDT=yCONFIG_MFD_DA9052_I2C=yCONFIG_MFD_MC13XXX_SPI=yCONFIG_MFD_MC13XXX_I2C=yCONFIG_MFD_MAX17135=yCONFIG_MFD_SI476X_CORE=yCONFIG_MFD_STMPE=yCONFIG_REGULATOR=yCONFIG_REGULATOR_FIXED_VOLTAGE=yCONFIG_REGULATOR_ANATOP=yCONFIG_REGULATOR_DA9052=yCONFIG_REGULATOR_GPIO=yCONFIG_REGULATOR_MAX17135=yCONFIG_REGULATOR_MC13783=yCONFIG_REGULATOR_MC13892=yCONFIG_REGULATOR_PFUZE100=yCONFIG_MEDIA_SUPPORT=yCONFIG_MEDIA_CAMERA_SUPPORT=yCONFIG_MEDIA_RADIO_SUPPORT=yCONFIG_MEDIA_RC_SUPPORT=yCONFIG_RC_DEVICES=yCONFIG_IR_GPIO_CIR=yCONFIG_MEDIA_USB_SUPPORT=yCONFIG_USB_VIDEO_CLASS=mCONFIG_V4L_PLATFORM_DRIVERS=yCONFIG_VIDEO_MXC_OUTPUT=yCONFIG_VIDEO_MXC_CAPTURE=mCONFIG_MXC_CAMERA_OV5640=mCONFIG_MXC_CAMERA_OV5642=mCONFIG_MXC_CAMERA_OV5640_MIPI=mCONFIG_MXC_TVIN_ADV7180=mCONFIG_MXC_IPU_DEVICE_QUEUE_SDC=mCONFIG_VIDEO_MXC_IPU_OUTPUT=yCONFIG_VIDEO_MXC_PXP_V4L2=yCONFIG_VIDEO_MXC_CSI_CAMERA=mCONFIG_MXC_VADC=mCONFIG_MXC_MIPI_CSI=mCONFIG_MXC_CAMERA_OV5647_MIPI=mCONFIG_SOC_CAMERA=yCONFIG_VIDEO_MX3=yCONFIG_V4L_MEM2MEM_DRIVERS=yCONFIG_VIDEO_CODA=yCONFIG_RADIO_SI476X=yCONFIG_SOC_CAMERA_OV2640=mCONFIG_SOC_CAMERA_OV772X=mCONFIG_DRM=yCONFIG_DRM_VIVANTE=yCONFIG_FB=yCONFIG_FB_MXS=yCONFIG_FB_MXC_SYNC_PANEL=yCONFIG_FB_MXC_MIPI_DSI=yCONFIG_FB_MXC_MIPI_DSI_SAMSUNG=yCONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL=yCONFIG_FB_MXC_TRULY_PANEL_TFT3P5079E=yCONFIG_FB_MXC_TRULY_PANEL_TFT3P5581E=yCONFIG_FB_MXC_LDB=yCONFIG_FB_MXC_HDMI=yCONFIG_FB_MXS_SII902X=yCONFIG_FB_MXC_DCIC=mCONFIG_HANNSTAR_CABC=yCONFIG_FB_MXC_EINK_PANEL=yCONFIG_FB_MXC_EINK_V2_PANEL=yCONFIG_LCD_CLASS_DEVICE=yCONFIG_LCD_L4F00242T03=yCONFIG_LCD_PLATFORM=yCONFIG_BACKLIGHT_PWM=yCONFIG_FRAMEBUFFER_CONSOLE=yCONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=yCONFIG_LOGO=yCONFIG_SOUND=yCONFIG_SND=yCONFIG_SND_USB_AUDIO=mCONFIG_SND_SOC=yCONFIG_SND_IMX_SOC=yCONFIG_SND_SOC_EUKREA_TLV320=yCONFIG_SND_SOC_IMX_WM8960=yCONFIG_SND_SOC_IMX_SII902X=yCONFIG_SND_SOC_IMX_WM8958=yCONFIG_SND_SOC_IMX_CS42888=yCONFIG_SND_SOC_IMX_WM8962=yCONFIG_SND_SOC_IMX_SGTL5000=yCONFIG_SND_SOC_IMX_MQS=yCONFIG_SND_SOC_IMX_SPDIF=yCONFIG_SND_SOC_IMX_MC13783=yCONFIG_SND_SOC_IMX_SI476X=yCONFIG_SND_SOC_IMX_HDMI=yCONFIG_USB=yCONFIG_USB_OTG_WHITELIST=yCONFIG_USB_OTG_FSM=yCONFIG_USB_EHCI_HCD=yCONFIG_USB_EHCI_MXC=yCONFIG_USB_HCD_TEST_MODE=yCONFIG_USB_ACM=mCONFIG_USB_STORAGE=yCONFIG_USB_CHIPIDEA=yCONFIG_USB_CHIPIDEA_UDC=yCONFIG_USB_CHIPIDEA_HOST=yCONFIG_USB_SERIAL=mCONFIG_USB_SERIAL_GENERIC=yCONFIG_USB_SERIAL_FTDI_SIO=mCONFIG_USB_SERIAL_OPTION=mCONFIG_USB_EHSET_TEST_FIXTURE=yCONFIG_NOP_USB_XCEIV=yCONFIG_USB_MXS_PHY=yCONFIG_USB_GADGET=yCONFIG_USB_CONFIGFS=mCONFIG_USB_CONFIGFS_SERIAL=yCONFIG_USB_CONFIGFS_ACM=yCONFIG_USB_CONFIGFS_OBEX=yCONFIG_USB_CONFIGFS_NCM=yCONFIG_USB_CONFIGFS_ECM=yCONFIG_USB_CONFIGFS_ECM_SUBSET=yCONFIG_USB_CONFIGFS_RNDIS=yCONFIG_USB_CONFIGFS_EEM=yCONFIG_USB_CONFIGFS_MASS_STORAGE=yCONFIG_USB_CONFIGFS_F_LB_SS=yCONFIG_USB_CONFIGFS_F_FS=yCONFIG_USB_ZERO=mCONFIG_USB_ETH=mCONFIG_USB_G_NCM=mCONFIG_USB_GADGETFS=mCONFIG_USB_MASS_STORAGE=mCONFIG_USB_G_SERIAL=mCONFIG_USB_SERIAL_CH341=mCONFIG_USB_SERIAL_CP210X=mCONFIG_MMC=yCONFIG_MMC_SDHCI=yCONFIG_MMC_SDHCI_PLTFM=yCONFIG_MMC_SDHCI_ESDHC_IMX=yCONFIG_MXC_IPU=yCONFIG_MXC_IPU_V3_PRE=yCONFIG_MXC_GPU_VIV=yCONFIG_MXC_SIM=yCONFIG_MXC_MIPI_CSI2=yCONFIG_MXC_HDMI_CEC=yCONFIG_NEW_LEDS=yCONFIG_LEDS_CLASS=yCONFIG_LEDS_GPIO=yCONFIG_LEDS_TRIGGERS=yCONFIG_LEDS_TRIGGER_TIMER=yCONFIG_LEDS_TRIGGER_ONESHOT=yCONFIG_LEDS_TRIGGER_HEARTBEAT=yCONFIG_LEDS_TRIGGER_BACKLIGHT=yCONFIG_LEDS_TRIGGER_GPIO=yCONFIG_RTC_CLASS=yCONFIG_RTC_INTF_DEV_UIE_EMUL=yCONFIG_RTC_DRV_MC13XXX=yCONFIG_RTC_DRV_MXC=yCONFIG_RTC_DRV_SNVS=yCONFIG_DMADEVICES=yCONFIG_MXC_PXP_V2=yCONFIG_MXC_PXP_V3=yCONFIG_IMX_SDMA=yCONFIG_MXS_DMA=yCONFIG_DMATEST=mCONFIG_STAGING=yCONFIG_STAGING_MEDIA=y# CONFIG_IOMMU_SUPPORT is not setCONFIG_IIO=yCONFIG_IMX7D_ADC=yCONFIG_VF610_ADC=yCONFIG_PWM=yCONFIG_PWM_IMX=yCONFIG_EXT2_FS=yCONFIG_EXT2_FS_XATTR=yCONFIG_EXT2_FS_POSIX_ACL=yCONFIG_EXT2_FS_SECURITY=yCONFIG_EXT3_FS=yCONFIG_EXT3_FS_POSIX_ACL=yCONFIG_EXT3_FS_SECURITY=yCONFIG_EXT4_FS=yCONFIG_EXT4_FS_POSIX_ACL=yCONFIG_EXT4_FS_SECURITY=yCONFIG_QUOTA=yCONFIG_QUOTA_NETLINK_INTERFACE=y# CONFIG_PRINT_QUOTA_WARNING is not setCONFIG_AUTOFS4_FS=yCONFIG_FUSE_FS=yCONFIG_ISO9660_FS=mCONFIG_JOLIET=yCONFIG_ZISOFS=yCONFIG_UDF_FS=mCONFIG_MSDOS_FS=mCONFIG_VFAT_FS=yCONFIG_TMPFS=yCONFIG_JFFS2_FS=yCONFIG_UBIFS_FS=yCONFIG_NFS_FS=yCONFIG_NFS_V3_ACL=yCONFIG_NFS_V4=yCONFIG_ROOT_NFS=yCONFIG_NLS_DEFAULT="cp437"CONFIG_NLS_CODEPAGE_437=yCONFIG_FAT_DEFAULT_IOCHARSET="utf8"CONFIG_NLS_ASCII=yCONFIG_NLS_ISO8859_1=yCONFIG_NLS_ISO8859_15=mCONFIG_NLS_UTF8=yCONFIG_DEBUG_FS=yCONFIG_MAGIC_SYSRQ=y# CONFIG_SCHED_DEBUG is not set# CONFIG_DEBUG_BUGVERBOSE is not set# CONFIG_FTRACE is not setCONFIG_SECURITYFS=yCONFIG_CRYPTO_USER=yCONFIG_CRYPTO_TEST=mCONFIG_CRYPTO_CTS=yCONFIG_CRYPTO_LRW=yCONFIG_CRYPTO_XTS=yCONFIG_CRYPTO_MD4=yCONFIG_CRYPTO_MD5=yCONFIG_CRYPTO_MICHAEL_MIC=yCONFIG_CRYPTO_RMD128=yCONFIG_CRYPTO_RMD160=yCONFIG_CRYPTO_RMD256=yCONFIG_CRYPTO_RMD320=yCONFIG_CRYPTO_SHA512=yCONFIG_CRYPTO_TGR192=yCONFIG_CRYPTO_WP512=yCONFIG_CRYPTO_BLOWFISH=yCONFIG_CRYPTO_CAMELLIA=yCONFIG_CRYPTO_DES=yCONFIG_CRYPTO_TWOFISH=y# CONFIG_CRYPTO_ANSI_CPRNG is not setCONFIG_CRYPTO_DEV_FSL_CAAM=yCONFIG_CRYPTO_DEV_FSL_CAAM_SM=yCONFIG_CRYPTO_DEV_FSL_CAAM_SM_TEST=yCONFIG_CRYPTO_DEV_FSL_CAAM_SECVIO=yCONFIG_CRYPTO_DEV_MXS_DCP=yCONFIG_CRC_CCITT=mCONFIG_CRC_T10DIF=yCONFIG_CRC7=mCONFIG_LIBCRC32C=mCONFIG_FONTS=yCONFIG_FONT_8x8=yCONFIG_FONT_8x16=y

内核编译步骤:

#使用Yocto SDK里的GCC 5.3.0交叉编译器编译出厂Linux源码,可不用指定ARCH等,直接执行Makesource /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi#!/bin/bash#编译前先清除make distclean#配置defconfig文件make imx_v7_defconfig -j 16#开始编译zImagemake zImage -j 16

设备树编译:

#NandFlash类型核心板#编译正点原子各种显示设备的设备树,若用户没有屏,#启动时默认会选择imx6ull-14x14-nand-4.3-480x272-c.dtb加载make imx6ull-14x14-nand-10.1-1280x800-c.dtbmake imx6ull-14x14-nand-7-1024x600-c.dtbmake imx6ull-14x14-nand-7-800x480-c.dtbmake imx6ull-14x14-nand-4.3-800x480-c.dtbmake imx6ull-14x14-nand-4.3-480x272-c.dtbmake imx6ull-14x14-nand-vga.dtbmake imx6ull-14x14-nand-hdmi.dtb

内核驱动模块编译

#编译内核模块make modules -j 16

#在当前目录下新建一个tmp目录,用于存放编译后的目标文件if [ ! -e "./tmp" ]; thenmkdir tmpfirm -rf tmp/*make modules_install INSTALL_MOD_PATH=tmpcd tmp/lib/modulestar -jcvf ../../modules.tar.bz2 .cd -rm -rf tmp/lib#拷贝zImage到tmp目录下cp arch/arm/boot/zImage tmp#拷贝所有编译的设备树文件到当前的tmp目录下cp arch/arm/boot/dts/imx6ull*.dtb tmpecho "编译完成,请查看当前目录下的tmp文件夹查看编译好的目标文件"

驱动移植

USB 转串口驱动修改

模块加载 USB 转串口 option 驱动程序后,会在/dev 目录下创建 ttyUSB0、ttyUSB1 和 ttyUSB2 等设备文件。以下介绍如何将 USB 转串口 option 驱动程序移植到 Linux 操作系统中。

移植的第一步,找到你的4G模块的usb的VID和PID添加进去。

为了识别模块,需将模块的 VID 和 PID 信息添加到[KERNEL]/drivers/usb/serial/option.c 文件中,对应的 VID 和 PID 。

以EC25列模块为例:高于2.6.30 的 Linux 内核版本,可在[KERNEL]/drivers/usb/serial/option.c文件中添加以下语句:

static const struct usb_device_id option_ids[] = {#if 1 //Added by Quectel{ USB_DEVICE(0x2C7C, 0x0125) },#endif

我的EC800模块的PID和VID是0x2c7c,0x6002。

/* EC20,EC800 4G*/#define QUECTEL_VENDOR_ID0x2C7C#define QUECTEL_PRODUCT_EC200X0125#define QUECTEL_PRODUCT_EC800 0x6002

static const struct usb_device_id option_ids[] = {{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC20)},/* EC20*/{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC800)},/* EC800*/{ USB_DEVICE(GOSUNCN_VENDOR_ID, GOSUNCN_PRODUCT_0117)},/* ME3630-w */{ USB_DEVICE(GOSUNCN_VENDOR_ID, GOSUNCN_PRODUCT_0199)},/* ME3630-w */{ USB_DEVICE(GOSUNCN_VENDOR_ID, GOSUNCN_PRODUCT_1476)},/* ME3630-w */

使用 USBNet 驱动

接下来配置使模块的所有 USB 接口均绑定 USB 转串口 option 驱动程序,导致 USBNet 驱动程序接口无法工作。用户可以添加以下语句来防止 USBNet 驱动程序接口绑定 USB 转串口 option 驱动程序。

static int option_probe(struct usb_serial *serial,const struct usb_device_id *id){struct usb_interface_descriptor *iface_desc =&serial->interface->cur_altsetting->desc;struct usb_device_descriptor *dev_desc = &serial->dev->descriptor;const struct option_blacklist_info *blacklist;/* GOSUNCN 4G modems */printk("idVendor=%x, idProduct=%x, bInterfaceNumber =%d\r\n",serial->dev->descriptor.idVendor,serial->dev->descriptor.idProduct,serial->interface->cur_altsetting->desc. bInterfaceNumber);//..........if (dev_desc->idVendor == cpu_to_le16(0x2c7C) &&iface_desc->bInterfaceNumber >= 4)return -ENODEV;if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {__u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc;if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42) {//ECM, RNDIS, NCM, MBIM, ACM, UAC, ADBreturn -ENODEV;}if ((idProduct&0xF000) == 0x0000) {//MDM interface 4 is QMIif (intf->bInterfaceNumber == 4 && intf->bNumEndpoints == 3&& intf->bInterfaceSubClass==0xFF && intf->bInterfaceProtocol == 0xFF){return -ENODEV;}}}/* Store the blacklist info so we can use it during attach. */usb_set_serial_data(serial, (void *)blacklist);return 0;}

添加零包机制

根据 USB 协议的要求,通过添加如下语句在 bulk-out 传输过程中添加处理零包的机制:

高于 2.6.34 的 Linux 内核版本,需在[KERNEL]/drivers/usb/serial/usb_wwan.c文件中添加以下语句。低于 2.6.35 的 Linux 内核版本,需在[KERNEL]/drivers/usb/serial/option.c 文件中添加。

static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,int endpoint,int dir, void *ctx, char *buf, int len,void (*callback) (struct urb *)){struct usb_serial *serial = port->serial;struct urb *urb;urb = usb_alloc_urb(0, GFP_KERNEL);/* No ISO */if (!urb)return NULL;usb_fill_bulk_urb(urb, serial->dev,usb_sndbulkpipe(serial->dev, endpoint) | dir,buf, len, callback, ctx);if (dir == USB_DIR_OUT) {struct usb_device_descriptor *desc = &serial->dev->descriptor;if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9090))urb->transfer_flags |= URB_ZERO_PACKET;if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9003))urb->transfer_flags |= URB_ZERO_PACKET;if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9215))urb->transfer_flags |= URB_ZERO_PACKET;if (desc->idVendor == cpu_to_le16(0x2C7C))urb->transfer_flags |= URB_ZERO_PACKET;}return urb;}

添加 Reset-resume 机制

部分 USB 主机控制器或 USB hub 在 MCU 进入 Suspend/Sleep(挂起/睡眠)模式时会发生掉电或复位,并且在 MCU 退出 Suspend/Sleep 模式后不能使模块恢复。需要通过添加以下语句来启用 reset-resume机制。高于 3.4 的 Linux 内核版本,需在[KERNEL]/drivers/usb/serial/option.c 文件中添加以下语句。

static struct usb_serial_driver option_1port_device = {……#ifdef CONFIG_PM.suspend = usb_wwan_suspend,.resume = usb_wwan_resume,#if 1 //Added by Quectel.reset_resume = usb_wwan_resume,#endif#endif};

拨号测试,无论使用ppp模式或者是ECM模式,都是需要拨号的。所谓的拨号直观上看就是通过串口操作AT指令,让模块联网的过程。所以开头的第一步,让能识别出ttyUSB0,ttyUSB1等是必须的。以下是拨号的AT指令日志。

正式用建议用官方提供的拨号程序quectel-CM即可,简单且功能强大。

拨号源码下载

附上拨号源码应用程序quectel-CM的下载地址,可以直接正式用。该应用程序会自动查找设备并使用相应的驱动自动拨号:

拨号源码下载地址:

/download/qq8864/88050116

以下的拨号日志:

root@ATK-IMX6U:~# lsdriver quectel-CM shellroot@ATK-IMX6U:~# ./quectel-CM[07-22_07:32:47:407] QConnectManager_Linux_V1.6.4[07-22_07:32:47:410] Find /sys/bus/usb/devices/1-1 idVendor=0x2c7c idProduct=0x6002, bus=0x001, dev=0x005[07-22_07:32:47:412] Auto find qmichannel = /dev/ttyUSB1[07-22_07:32:47:412] Auto find usbnet_adapter = usb0[07-22_07:32:47:413] netcard driver = cdc_ether, driver version = 22-Aug-[07-22_07:32:47:416] Modem works in ECM_RNDIS_NCM mode[07-22_07:32:47:436] atc_fd = 7[07-22_07:32:47:438] AT> ATE0Q0V1[07-22_07:32:47:441] AT< ATE0Q0V1[07-22_07:32:47:443] AT< OK[07-22_07:32:48:444] AT> AT+QCFG="usbnet"[07-22_07:32:48:447] AT< +QCFG: "usbnet",1[07-22_07:32:48:447] AT< OK[07-22_07:32:48:447] AT> AT+QNETDEVCTL=?[07-22_07:32:48:449] AT< +QNETDEVCTL: (0-3),(1-15),(0-1)[07-22_07:32:48:449] AT< OK[07-22_07:32:48:450] AT> AT+CGREG=2[07-22_07:32:48:451] AT< OK[07-22_07:32:48:451] AT> AT+CEREG=2[07-22_07:32:48:453] AT< OK[07-22_07:32:48:454] AT> AT+C5GREG=2[07-22_07:32:48:456] AT< ERROR[07-22_07:32:48:456] AT> AT+QNETDEVSTATUS=?[07-22_07:32:48:458] AT< ERROR[07-22_07:32:48:458] AT> AT+QCFG="NAT"[07-22_07:32:48:460] AT< +QCFG: "nat",1[07-22_07:32:48:460] AT< OK[07-22_07:32:48:461] AT> AT+CGMR[07-22_07:32:48:463] AT< EC800MCNLCR06A05M04[07-22_07:32:48:463] AT< OK[07-22_07:32:48:463] AT> AT+CPIN?[07-22_07:32:48:465] AT< +CPIN: READY[07-22_07:32:48:465] AT< OK[07-22_07:32:48:465] AT> AT+QCCID[07-22_07:32:48:468] AT< +QCCID: 898604C6062260003592[07-22_07:32:48:468] AT< OK[07-22_07:32:48:468] requestGetICCID 898604C6062260003592[07-22_07:32:48:468] AT> AT+CIMI[07-22_07:32:48:471] AT< 460084674003592[07-22_07:32:48:471] AT< OK[07-22_07:32:48:471] requestGetIMSI 460084674003592[07-22_07:32:48:471] AT> AT+QICSGP=1[07-22_07:32:48:474] AT< +QICSGP: 3,"","","",0[07-22_07:32:48:474] AT< OK[07-22_07:32:48:474] requestGetProfile[1] ///0/IPV4V6[07-22_07:32:48:474] AT> AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?[07-22_07:32:48:478] AT< +COPS: 0,0,"CHINA MOBILE",7[07-22_07:32:48:478] AT< +COPS: 0,1,"CMCC",7[07-22_07:32:48:478] AT< +COPS: 0,2,"46000",7[07-22_07:32:48:478] AT< OK[07-22_07:32:48:478] AT> AT+CEREG?[07-22_07:32:48:480] AT< +CEREG: 2,1,"4978","EF555C2",7[07-22_07:32:48:481] AT< OK[07-22_07:32:48:481] AT> at+cops?[07-22_07:32:48:483] AT< +COPS: 0,2,"46000",7[07-22_07:32:48:483] AT< OK[07-22_07:32:48:483] AT> at+qeng="servingcell"[07-22_07:32:48:492] AT< +QENG: "servingcell","NOCONN","LTE","TDD",460,00,EF555C2,316,41134,41,5,5,4978,-86,-3,-81,15,40[07-22_07:32:48:492] AT< OK[07-22_07:32:48:492] AT> AT+QNETDEVCTL?[07-22_07:32:48:495] AT< +QNETDEVCTL: 0,0,0,0[07-22_07:32:48:495] AT< OK[07-22_07:32:48:496] ifconfig usb0 0.0.0.0[07-22_07:32:48:547] ifconfig usb0 down[07-22_07:32:48:607] AT> AT+CGACT?[07-22_07:32:48:611] AT< +CGACT: 1,1[07-22_07:32:48:611] AT< OK[07-22_07:32:48:611] AT> AT+QNETDEVCTL=1,1,1[07-22_07:32:50:613] AT< OK[07-22_07:32:50:614] AT> AT+CGPADDR=1[07-22_07:32:50:621] AT< +CGPADDR: 1,"10.68.39.96","::0:0:0:0:0:0:0"[07-22_07:32:50:621] AT< OK[07-22_07:32:50:621] requestGetIPAddress 10.68.39.96[07-22_07:32:50:622] AT> at+cops?[07-22_07:32:50:624] AT< +COPS: 0,2,"46000",7[07-22_07:32:50:624] AT< OK[07-22_07:32:50:625] AT> at+qeng="servingcell"[07-22_07:32:50:633] AT< +QENG: "servingcell","NOCONN","LTE","TDD",460,00,EF555C2,316,41134,41,5,5,4978,-87,-4,-81,14,40[07-22_07:32:50:633] AT< OK[07-22_07:32:50:634] AT> AT+QNETDEVCTL?[07-22_07:32:50:635] AT< +QNETDEVSTATUS: 1[07-22_07:32:50:636] AT< +QNETDEVCTL: 1,1,1,1[07-22_07:32:50:636] AT< OK[07-22_07:32:50:637] AT> AT+CGACT?[07-22_07:32:50:640] AT< +CGACT: 1,1[07-22_07:32:50:640] AT< OK[07-22_07:32:50:641] ifconfig usb0 up[07-22_07:32:50:701] busybox udhcpc -f -n -q -t 5 -i usb0[07-22_07:32:50:741] udhcpc (v1.24.1) started[07-22_07:32:50:947] Sending discover...[07-22_07:32:51:007] Sending select for 10.68.39.96...[07-22_07:32:51:067] Lease of 10.68.39.96 obtained, lease time 86400[07-22_07:32:51:227] /etc/udhcpc.d/50default: Adding DNS 120.196.165.7[07-22_07:32:51:228] /etc/udhcpc.d/50default: Adding DNS 221.179.38.7[07-22_07:32:51:257] AT> at+cops?[07-22_07:32:51:260] AT< +COPS: 0,2,"46000",7[07-22_07:32:51:261] AT< OK[07-22_07:32:51:261] AT> at+qeng="servingcell"[07-22_07:32:51:267] AT< +QENG: "servingcell","NOCONN","LTE","TDD",460,00,EF555C2,316,41134,41,5,5,4978,-87,-3,-81,15,40[07-22_07:32:51:267] AT< OK[07-22_07:32:51:267] AT> AT+QNETDEVCTL?[07-22_07:32:51:270] AT< +QNETDEVCTL: 1,1,1,1[07-22_07:32:51:270] AT< OK[07-22_07:32:51:270] AT> AT+CGACT?[07-22_07:32:51:274] AT< +CGACT: 1,1[07-22_07:32:51:274] AT< OK[07-22_07:33:06:288] AT> at+cops?[07-22_07:33:06:291] AT< +COPS: 0,2,"46000",7[07-22_07:33:06:291] AT< OK[07-22_07:33:06:291] AT> at+qeng="servingcell"[07-22_07:33:06:299] AT< +QENG: "servingcell","NOCONN","LTE","TDD",460,00,EF555C2,316,41134,41,5,5,4978,-87,-3,-81,14,40[07-22_07:33:06:299] AT< OK[07-22_07:33:06:299] AT> AT+QNETDEVCTL?[07-22_07:33:06:302] AT< +QNETDEVCTL: 1,1,1,1[07-22_07:33:06:302] AT< OK[07-22_07:33:06:302] AT> AT+CGACT?[07-22_07:33:06:306] AT< +CGACT: 1,1[07-22_07:33:06:306] AT< OK[07-22_07:33:21:317] AT> at+cops?[07-22_07:33:21:320] AT< +COPS: 0,2,"46000",7[07-22_07:33:21:321] AT< OK[07-22_07:33:21:321] AT> at+qeng="servingcell"[07-22_07:33:21:328] AT< +QENG: "servingcell","NOCONN","LTE","TDD",460,00,EF555C2,316,41134,41,5,5,4978,-87,-3,-81,15,39[07-22_07:33:21:328] AT< OK[07-22_07:33:21:328] AT> AT+QNETDEVCTL?[07-22_07:33:21:331] AT< +QNETDEVCTL: 1,1,1,1[07-22_07:33:21:331] AT< OK[07-22_07:33:21:331] AT> AT+CGACT?[07-22_07:33:21:335] AT< +CGACT: 1,1[07-22_07:33:21:335] AT< OK[07-22_07:33:36:346] AT> at+cops?[07-22_07:33:36:349] AT< +COPS: 0,2,"46000",7[07-22_07:33:36:349] AT< OK[07-22_07:33:36:349] AT> at+qeng="servingcell"[07-22_07:33:36:356] AT< +QENG: "servingcell","NOCONN","LTE","TDD",460,00,EF555C2,316,41134,41,5,5,4978,-87,-3,-81,15,39[07-22_07:33:36:356] AT< OK[07-22_07:33:36:357] AT> AT+QNETDEVCTL?[07-22_07:33:36:359] AT< +QNETDEVCTL: 1,1,1,1[07-22_07:33:36:360] AT< OK[07-22_07:33:36:360] AT> AT+CGACT?[07-22_07:33:36:363] AT< +CGACT: 1,1[07-22_07:33:36:364] AT< OK[07-22_07:33:51:366] AT> at+cops?[07-22_07:33:51:369] AT< +COPS: 0,2,"46000",7[07-22_07:33:51:369] AT< OK[07-22_07:33:51:370] AT> at+qeng="servingcell"[07-22_07:33:51:378] AT< +QENG: "servingcell","NOCONN","LTE","TDD",460,00,EF555C2,316,41134,41,5,5,4978,-88,-3,-81,14,39[07-22_07:33:51:379] AT< OK[07-22_07:33:51:379] AT> AT+QNETDEVCTL?[07-22_07:33:51:381] AT< +QNETDEVCTL: 1,1,1,1[07-22_07:33:51:381] AT< OK[07-22_07:33:51:382] AT> AT+CGACT?[07-22_07:33:51:385] AT< +CGACT: 1,1[07-22_07:33:51:385] AT< OK[07-22_07:34:06:393] AT> at+cops?[07-22_07:34:06:396] AT< +COPS: 0,2,"46000",7[07-22_07:34:06:397] AT< OK[07-22_07:34:06:397] AT> at+qeng="servingcell"[07-22_07:34:06:404] AT< +QENG: "servingcell","NOCONN","LTE","TDD",460,00,EF555C2,316,41134,41,5,5,4978,-88,-4,-81,14,39[07-22_07:34:06:405] AT< OK[07-22_07:34:06:405] AT> AT+QNETDEVCTL?[07-22_07:34:06:408] AT< +QNETDEVCTL: 1,1,1,1[07-22_07:34:06:408] AT< OK[07-22_07:34:06:408] AT> AT+CGACT?[07-22_07:34:06:412] AT< +CGACT: 1,1[07-22_07:34:06:412] AT< OK

需要注意的问题是,上述编译内核和驱动时,把这几个驱动模块usbserial.ko,usb_wwan.ko,option.ko等都单独编译成驱动模块了,默认开机启动时并没有加载。

所以如果上述移植都ok,但是插上usb的4G模块后还不认,可以lsmod指令看下有没加载这几个驱动模块。测试可进入/lib/modules/4.1.15-g3dc0a4b/kernel/drivers/usb/serial/目录下,通过insmod命令加载驱动到内核系统中。注意,这几个有先后依赖顺序,必须先insmod usbserial.ko,再usb_wwan.ko,最后加载option.ko.

以上操作后,应该能够在/dev/目录下看到ttyUSB0等这几个设备节点。

可通过串口命令测试下AT指令,看看模块是否有响应。

通过串口发送AT命令echo -e "AT+QCFG=\"usbnet\",0\r\n" > /dev/ttyUSB2 #设定模式

或者使用mincom串口打开com口,看下模块的AT指令输出。

网关路由配置

如果IP都已经自动获取到了还是无法联网,则需检查下路由对不对。

因为你的板子上可能用了以太网口,走的路由限制了。可以以下改下默认网关路由。

iprouteshowroute del defaultroute add default dev usb0

设置自启动脚本

在Linux中,rc.local是一个启动脚本,位于/etc/rc.d/目录或/etc/init.d/目录下。它用于在系统启动时执行自定义命令或脚本。rc.local文件中的命令或脚本会在系统启动的最后阶段执行,可以用来执行一些需要在系统启动时运行的自定义任务。这些任务可以包括启动特定的服务、设置环境变量、挂载文件系统等。

rc.local文件的作用类似于其他Linux发行版中的/etc/rc.local文件,但在一些发行版中,如Ubuntu,已经不再默认提供rc.local文件。如果需要使用rc.local文件,可以自行创建并设置权限。

需要注意的是,rc.local文件中的命令或脚本应该是可执行的,并且应该在文件的末尾添加"exit 0"以确保正常退出。

在/etc/init.d/rc.local内容如下:

#! /bin/sh### BEGIN INIT INFO# Provides:rc.local# Required-Start: $all# Required-Stop:# Default-Start:2 3 4 5# Default-Stop:# Short-Description: Run /etc/rc.local if it exist### END INIT INFOPATH=/sbin:/usr/sbin:/bin:/usr/bindo_start() {if [ -x /etc/rc.local ]; thenecho -n "Running local boot scripts (/etc/rc.local)"/etc/rc.local[ $? = 0 ] && echo "." || echo "error"return $ESfi}case "$1" instart)do_start;;restart|reload|force-reload)echo "Error: argument '$1' not supported" >&2exit 3;;stop);;*)echo "Usage: $0 start|stop" >&2exit 3;;esac

在/etc/rc.local内容如下:

#!/bin/sh -e## rc.local## This script is executed at the end of each multiuser runlevel.# Make sure that the script will "exit 0" on success or any other# value on error.## In order to enable or disable this script just change the execution# bits.## By default this script does nothing.echo 30000 > /proc/sys/vm/min_free_kbytessource /etc/profile /opt/QDesktop >/dev/null 2>&1 &/etc/myuser.shexit 0

自定义的myuser.sh脚本,内容如下,后续有需要自定义开机启动的内容都可以在这里添加。

#!/bin/bashecho "=================user define shell exec..."insmod /lib/modules/$(uname -r)/kernel/drivers/usb/serial/usbserial.koinsmod /lib/modules/$(uname -r)/kernel/drivers/usb/serial/usb_wwan.koinsmod /lib/modules/$(uname -r)/kernel/drivers/usb/serial/option.koifconfig eth0 192.168.21.96 netmask 255.255.255.0route add gw 192.168.21.1route del defaultroute add default dev usb0quectel-CM &

其他资源

嵌入式Linux驱动开发初级-内核模块编译方法_芬达在学习的博客-CSDN博客

/dream397/p/13984263.html

Linux内核模块(Module)的单独编译 - 知乎

Linux设备驱动之IIO子系统——IIO框架及IIO数据结构

iio子系统框架分析_chongyuzhao的博客-CSDN博客

一文带你深入了解Linux IIO 子系统_iio框架_Linux加油站的博客-CSDN博客

linux kernel iio 架构

/article/1164591.html

FS4412开发板使用Linux IIO驱动框架实现ADC驱动 - 代码先锋网

Linux route 命令_mayue_csdn的博客-CSDN博客

正点原子IMX6U仓库 (GuangzhouXingyi) -

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。