linux驱动开发,vscode环境配置

背景

在windows下使用VScode编辑器,源码存放在远程Linux服务器中,编译也在Linux中进行,windows下只编辑+查看。

1 ssh远程登录

先安装ssh插件:Remote-ssh,点击右下角箭头,输入账号密码后ssh登录。
在这里插入图片描述
注意:首次连接极大可能出现连接失败,报timeout的错误,修改下ssh的timeout参数即可
linux驱动开发,vscode环境配置_第1张图片

2 ssh免密码登录

把ssh的公钥和私钥放在C:\Users\用户名.ssh下
linux驱动开发,vscode环境配置_第2张图片
也可以创建config文件,为ssh起一个别名,这样就不用记ip地址了。
linux驱动开发,vscode环境配置_第3张图片

3 下载安装vscode的插件

  • Remote-ssh
  • Arm Assembly
  • Atom One Dark Theme
  • Better C++ Syntax
  • C/C++ Themes
  • Chinese
  • Device Tree
  • Jupyter Keymap
  • kconfig
  • LinkerScript
  • Linux Themes for vscode
  • One dark pro

Linux远程需要安装的插件

  • Cmake
  • Cmake-tools
  • Clang-Format
  • Rainbow Brackets
  • Trailing Spaces
  • Include Autocomplete
  • Pylance

4 Linux内核源码显示过滤

因为Linux本身就是可裁剪的,源码可能包含大量的无关内容,比如设备树或defconfig文件,使用显示过滤,直接过滤掉arch/arm/、arch/arm64/boot等无关文件夹,需要啥,显示啥,清爽无比。
linux驱动开发,vscode环境配置_第4张图片
linux驱动开发,vscode环境配置_第5张图片

5 Linux 源码宏定义

5.1 创建c_cpp_properties.json,补充宏

Linux本身就是支持裁剪的,大部分源码都使用宏定义进行编译控制,如:

#ifdef CONFIG_MMU
	funA()
#else
	funB()
#endif 

而Linux的宏很多都是在arch/arm64/configs/*defconfig文件指定的(实际上每次编译make xxx_defconfig,就是把defconfig文件按照Kconfig的语法重新组织,生成.config文件,再生成auto_config,下次make时会使用auto_config里面的宏)
linux驱动开发,vscode环境配置_第6张图片
同样地,在.vscode/c_cpp_properties.json添加内容:
linux驱动开发,vscode环境配置_第7张图片

5.2 将defconfig文件中的定义复制到c_cpp_properties.json

  1. Ctrl+A将defconfig中的全部信息都复制粘贴到c_cpp_properties.json的"defines":后面。linux驱动开发,vscode环境配置_第8张图片
  2. Ctrl+H打开“替换”,选择“正则表达式”
    在这里插入图片描述
  3. 删除掉"#"开头,如:# CONFIG_COMPILE_TEST is not set
    ^#.*  替换为空
    
    其中:^是行开头搜索,#是关键字,.是选择后一个字符,*是通配符
    直接点击替换,啥都不用输入。
  4. 删除"=“xxx” ",如:CONFIG_DEFAULT_TCP_CONG=“cubic” 变成 CONFIG_DEFAULT_TCP_CONG
    =.*"  与  =.* 都替换为空
    

直接点击替换,啥都不用输入。

  1. 为前后加上"":CONFIG_TARGET_XJ3变成"CONFIG_TARGET_XJ3 "
    查找:^C;替换为:"C
    

后面的没办法,只能

$替换为  ",

然后把多余的删掉

  1. 删除空白行:
    ^\s*\n
    

其中:^匹配字符串开始;\s匹配空白字符;*匹配前面的子表达式零次或多次;\n匹配换行符

  1. 删除掉"=y":
    直接"=y"替换为空
  2. 删除掉"既带有CONFIG_,又带有"结尾的"
     (?=.*CONFIG_)(?=.*").*
    
  3. “既带有CONFIG_,又带有=的”
    (?=.CONFIG_)(?=.=).*

6 Linux 代码自动规范

代码写完后,不符合代码规范?arc lint报错?手动改太慢了?
下载插件:Clang-Format
在kernel目录下创建:.clang-format,复制粘贴如下内容:

# SPDX-License-Identifier: GPL-2.0
#
# clang-format configuration file. Intended for clang-format >= 4.
#
# For more information, see:
#
#   Documentation/process/clang-format.rst
#   https://clang.llvm.org/docs/ClangFormat.html
#   https://clang.llvm.org/docs/ClangFormatStyleOptions.html
#
---
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
#AlignEscapedNewlines: Left # Unknown to clang-format-4.0
AlignOperands: true
AlignTrailingComments: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
  AfterClass: false
  AfterControlStatement: false
  AfterEnum: false
  AfterFunction: true
  AfterNamespace: true
  AfterObjCDeclaration: false
  AfterStruct: false
  AfterUnion: false
  #AfterExternBlock: false # Unknown to clang-format-5.0
  BeforeCatch: false
  BeforeElse: false
  IndentBraces: false
  #SplitEmptyFunction: true # Unknown to clang-format-4.0
  #SplitEmptyRecord: true # Unknown to clang-format-4.0
  #SplitEmptyNamespace: true # Unknown to clang-format-4.0
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Custom
#BreakBeforeInheritanceComma: false # Unknown to clang-format-4.0
BreakBeforeTernaryOperators: false
BreakConstructorInitializersBeforeComma: false
#BreakConstructorInitializers: BeforeComma # Unknown to clang-format-4.0
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: false
ColumnLimit: 85
CommentPragmas: '^ IWYU pragma:'
#CompactNamespaces: false # Unknown to clang-format-4.0
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 8
ContinuationIndentWidth: 8
Cpp11BracedListStyle: false
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
#FixNamespaceComments: false # Unknown to clang-format-4.0

# Taken from:
#   git grep -h '^#define [^[:space:]]*for_each[^[:space:]]*(' include/ \
#   | sed "s,^#define \([^[:space:]]*for_each[^[:space:]]*\)(.*$,  - '\1'," \
#   | sort | uniq
ForEachMacros:
  - 'apei_estatus_for_each_section'
  - 'ata_for_each_dev'
  - 'ata_for_each_link'
  - 'ax25_for_each'
  - 'ax25_uid_for_each'
  - 'bio_for_each_integrity_vec'
  - '__bio_for_each_segment'
  - 'bio_for_each_segment'
  - 'bio_for_each_segment_all'
  - 'bio_list_for_each'
  - 'bip_for_each_vec'
  - 'blkg_for_each_descendant_post'
  - 'blkg_for_each_descendant_pre'
  - 'blk_queue_for_each_rl'
  - 'bond_for_each_slave'
  - 'bond_for_each_slave_rcu'
  - 'btree_for_each_safe128'
  - 'btree_for_each_safe32'
  - 'btree_for_each_safe64'
  - 'btree_for_each_safel'
  - 'card_for_each_dev'
  - 'cgroup_taskset_for_each'
  - 'cgroup_taskset_for_each_leader'
  - 'cpufreq_for_each_entry'
  - 'cpufreq_for_each_entry_idx'
  - 'cpufreq_for_each_valid_entry'
  - 'cpufreq_for_each_valid_entry_idx'
  - 'css_for_each_child'
  - 'css_for_each_descendant_post'
  - 'css_for_each_descendant_pre'
  - 'device_for_each_child_node'
  - 'drm_atomic_crtc_for_each_plane'
  - 'drm_atomic_crtc_state_for_each_plane'
  - 'drm_atomic_crtc_state_for_each_plane_state'
  - 'drm_for_each_connector_iter'
  - 'drm_for_each_crtc'
  - 'drm_for_each_encoder'
  - 'drm_for_each_encoder_mask'
  - 'drm_for_each_fb'
  - 'drm_for_each_legacy_plane'
  - 'drm_for_each_plane'
  - 'drm_for_each_plane_mask'
  - 'drm_mm_for_each_hole'
  - 'drm_mm_for_each_node'
  - 'drm_mm_for_each_node_in_range'
  - 'drm_mm_for_each_node_safe'
  - 'for_each_active_drhd_unit'
  - 'for_each_active_iommu'
  - 'for_each_available_child_of_node'
  - 'for_each_bio'
  - 'for_each_board_func_rsrc'
  - 'for_each_bvec'
  - 'for_each_child_of_node'
  - 'for_each_clear_bit'
  - 'for_each_clear_bit_from'
  - 'for_each_cmsghdr'
  - 'for_each_compatible_node'
  - 'for_each_console'
  - 'for_each_cpu'
  - 'for_each_cpu_and'
  - 'for_each_cpu_not'
  - 'for_each_cpu_wrap'
  - 'for_each_dev_addr'
  - 'for_each_dma_cap_mask'
  - 'for_each_drhd_unit'
  - 'for_each_dss_dev'
  - 'for_each_efi_memory_desc'
  - 'for_each_efi_memory_desc_in_map'
  - 'for_each_endpoint_of_node'
  - 'for_each_evictable_lru'
  - 'for_each_fib6_node_rt_rcu'
  - 'for_each_fib6_walker_rt'
  - 'for_each_free_mem_range'
  - 'for_each_free_mem_range_reverse'
  - 'for_each_func_rsrc'
  - 'for_each_hstate'
  - 'for_each_if'
  - 'for_each_iommu'
  - 'for_each_ip_tunnel_rcu'
  - 'for_each_irq_nr'
  - 'for_each_lru'
  - 'for_each_matching_node'
  - 'for_each_matching_node_and_match'
  - 'for_each_memblock'
  - 'for_each_memblock_type'
  - 'for_each_memcg_cache_index'
  - 'for_each_mem_pfn_range'
  - 'for_each_mem_range'
  - 'for_each_mem_range_rev'
  - 'for_each_migratetype_order'
  - 'for_each_msi_entry'
  - 'for_each_net'
  - 'for_each_netdev'
  - 'for_each_netdev_continue'
  - 'for_each_netdev_continue_rcu'
  - 'for_each_netdev_feature'
  - 'for_each_netdev_in_bond_rcu'
  - 'for_each_netdev_rcu'
  - 'for_each_netdev_reverse'
  - 'for_each_netdev_safe'
  - 'for_each_net_rcu'
  - 'for_each_new_connector_in_state'
  - 'for_each_new_crtc_in_state'
  - 'for_each_new_plane_in_state'
  - 'for_each_new_private_obj_in_state'
  - 'for_each_node'
  - 'for_each_node_by_name'
  - 'for_each_node_by_type'
  - 'for_each_node_mask'
  - 'for_each_node_state'
  - 'for_each_node_with_cpus'
  - 'for_each_node_with_property'
  - 'for_each_of_allnodes'
  - 'for_each_of_allnodes_from'
  - 'for_each_of_pci_range'
  - 'for_each_old_connector_in_state'
  - 'for_each_old_crtc_in_state'
  - 'for_each_oldnew_connector_in_state'
  - 'for_each_oldnew_crtc_in_state'
  - 'for_each_oldnew_plane_in_state'
  - 'for_each_oldnew_private_obj_in_state'
  - 'for_each_old_plane_in_state'
  - 'for_each_old_private_obj_in_state'
  - 'for_each_online_cpu'
  - 'for_each_online_node'
  - 'for_each_online_pgdat'
  - 'for_each_pci_bridge'
  - 'for_each_pci_dev'
  - 'for_each_pci_msi_entry'
  - 'for_each_populated_zone'
  - 'for_each_possible_cpu'
  - 'for_each_present_cpu'
  - 'for_each_prime_number'
  - 'for_each_prime_number_from'
  - 'for_each_process'
  - 'for_each_process_thread'
  - 'for_each_property_of_node'
  - 'for_each_reserved_mem_region'
  - 'for_each_resv_unavail_range'
  - 'for_each_rtdcom'
  - 'for_each_rtdcom_safe'
  - 'for_each_set_bit'
  - 'for_each_set_bit_from'
  - 'for_each_sg'
  - 'for_each_sg_page'
  - '__for_each_thread'
  - 'for_each_thread'
  - 'for_each_zone'
  - 'for_each_zone_zonelist'
  - 'for_each_zone_zonelist_nodemask'
  - 'fwnode_for_each_available_child_node'
  - 'fwnode_for_each_child_node'
  - 'fwnode_graph_for_each_endpoint'
  - 'gadget_for_each_ep'
  - 'hash_for_each'
  - 'hash_for_each_possible'
  - 'hash_for_each_possible_rcu'
  - 'hash_for_each_possible_rcu_notrace'
  - 'hash_for_each_possible_safe'
  - 'hash_for_each_rcu'
  - 'hash_for_each_safe'
  - 'hctx_for_each_ctx'
  - 'hlist_bl_for_each_entry'
  - 'hlist_bl_for_each_entry_rcu'
  - 'hlist_bl_for_each_entry_safe'
  - 'hlist_for_each'
  - 'hlist_for_each_entry'
  - 'hlist_for_each_entry_continue'
  - 'hlist_for_each_entry_continue_rcu'
  - 'hlist_for_each_entry_continue_rcu_bh'
  - 'hlist_for_each_entry_from'
  - 'hlist_for_each_entry_from_rcu'
  - 'hlist_for_each_entry_rcu'
  - 'hlist_for_each_entry_rcu_bh'
  - 'hlist_for_each_entry_rcu_notrace'
  - 'hlist_for_each_entry_safe'
  - '__hlist_for_each_rcu'
  - 'hlist_for_each_safe'
  - 'hlist_nulls_for_each_entry'
  - 'hlist_nulls_for_each_entry_from'
  - 'hlist_nulls_for_each_entry_rcu'
  - 'hlist_nulls_for_each_entry_safe'
  - 'ide_host_for_each_port'
  - 'ide_port_for_each_dev'
  - 'ide_port_for_each_present_dev'
  - 'idr_for_each_entry'
  - 'idr_for_each_entry_continue'
  - 'idr_for_each_entry_ul'
  - 'inet_bind_bucket_for_each'
  - 'inet_lhash2_for_each_icsk_rcu'
  - 'iov_for_each'
  - 'key_for_each'
  - 'key_for_each_safe'
  - 'klp_for_each_func'
  - 'klp_for_each_object'
  - 'kvm_for_each_memslot'
  - 'kvm_for_each_vcpu'
  - 'list_for_each'
  - 'list_for_each_entry'
  - 'list_for_each_entry_continue'
  - 'list_for_each_entry_continue_rcu'
  - 'list_for_each_entry_continue_reverse'
  - 'list_for_each_entry_from'
  - 'list_for_each_entry_from_reverse'
  - 'list_for_each_entry_lockless'
  - 'list_for_each_entry_rcu'
  - 'list_for_each_entry_reverse'
  - 'list_for_each_entry_safe'
  - 'list_for_each_entry_safe_continue'
  - 'list_for_each_entry_safe_from'
  - 'list_for_each_entry_safe_reverse'
  - 'list_for_each_prev'
  - 'list_for_each_prev_safe'
  - 'list_for_each_safe'
  - 'llist_for_each'
  - 'llist_for_each_entry'
  - 'llist_for_each_entry_safe'
  - 'llist_for_each_safe'
  - 'media_device_for_each_entity'
  - 'media_device_for_each_intf'
  - 'media_device_for_each_link'
  - 'media_device_for_each_pad'
  - 'netdev_for_each_lower_dev'
  - 'netdev_for_each_lower_private'
  - 'netdev_for_each_lower_private_rcu'
  - 'netdev_for_each_mc_addr'
  - 'netdev_for_each_uc_addr'
  - 'netdev_for_each_upper_dev_rcu'
  - 'netdev_hw_addr_list_for_each'
  - 'nft_rule_for_each_expr'
  - 'nla_for_each_attr'
  - 'nla_for_each_nested'
  - 'nlmsg_for_each_attr'
  - 'nlmsg_for_each_msg'
  - 'nr_neigh_for_each'
  - 'nr_neigh_for_each_safe'
  - 'nr_node_for_each'
  - 'nr_node_for_each_safe'
  - 'of_for_each_phandle'
  - 'of_property_for_each_string'
  - 'of_property_for_each_u32'
  - 'pci_bus_for_each_resource'
  - 'ping_portaddr_for_each_entry'
  - 'plist_for_each'
  - 'plist_for_each_continue'
  - 'plist_for_each_entry'
  - 'plist_for_each_entry_continue'
  - 'plist_for_each_entry_safe'
  - 'plist_for_each_safe'
  - 'pnp_for_each_card'
  - 'pnp_for_each_dev'
  - 'protocol_for_each_card'
  - 'protocol_for_each_dev'
  - 'queue_for_each_hw_ctx'
  - 'radix_tree_for_each_contig'
  - 'radix_tree_for_each_slot'
  - 'radix_tree_for_each_tagged'
  - 'rbtree_postorder_for_each_entry_safe'
  - 'resource_list_for_each_entry'
  - 'resource_list_for_each_entry_safe'
  - 'rhl_for_each_entry_rcu'
  - 'rhl_for_each_rcu'
  - 'rht_for_each'
  - 'rht_for_each_continue'
  - 'rht_for_each_entry'
  - 'rht_for_each_entry_continue'
  - 'rht_for_each_entry_rcu'
  - 'rht_for_each_entry_rcu_continue'
  - 'rht_for_each_entry_safe'
  - 'rht_for_each_rcu'
  - 'rht_for_each_rcu_continue'
  - '__rq_for_each_bio'
  - 'rq_for_each_segment'
  - 'scsi_for_each_prot_sg'
  - 'scsi_for_each_sg'
  - 'sctp_for_each_hentry'
  - 'sctp_skb_for_each'
  - 'shdma_for_each_chan'
  - '__shost_for_each_device'
  - 'shost_for_each_device'
  - 'sk_for_each'
  - 'sk_for_each_bound'
  - 'sk_for_each_entry_offset_rcu'
  - 'sk_for_each_from'
  - 'sk_for_each_rcu'
  - 'sk_for_each_safe'
  - 'sk_nulls_for_each'
  - 'sk_nulls_for_each_from'
  - 'sk_nulls_for_each_rcu'
  - 'snd_pcm_group_for_each_entry'
  - 'snd_soc_dapm_widget_for_each_path'
  - 'snd_soc_dapm_widget_for_each_path_safe'
  - 'snd_soc_dapm_widget_for_each_sink_path'
  - 'snd_soc_dapm_widget_for_each_source_path'
  - 'tb_property_for_each'
  - 'udp_portaddr_for_each_entry'
  - 'udp_portaddr_for_each_entry_rcu'
  - 'usb_hub_for_each_child'
  - 'v4l2_device_for_each_subdev'
  - 'v4l2_m2m_for_each_dst_buf'
  - 'v4l2_m2m_for_each_dst_buf_safe'
  - 'v4l2_m2m_for_each_src_buf'
  - 'v4l2_m2m_for_each_src_buf_safe'
  - 'zorro_for_each_dev'

#IncludeBlocks: Preserve # Unknown to clang-format-5.0
IncludeCategories:
  - Regex: '.*'
    Priority: 1
IncludeIsMainRegex: '(Test)?$'
IndentCaseLabels: false
#IndentPPDirectives: None # Unknown to clang-format-5.0
IndentWidth: 8
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: Inner
#ObjCBinPackProtocolList: Auto # Unknown to clang-format-5.0
ObjCBlockIndentWidth: 8
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true

# Taken from git's rules
#PenaltyBreakAssignment: 10 # Unknown to clang-format-4.0
PenaltyBreakBeforeFirstCallParameter: 30
PenaltyBreakComment: 10
PenaltyBreakFirstLessLess: 0
PenaltyBreakString: 10
PenaltyExcessCharacter: 100
PenaltyReturnTypeOnItsOwnLine: 60

PointerAlignment: Right
ReflowComments: false
SortIncludes: false
#SortUsingDeclarations: false # Unknown to clang-format-4.0
SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
#SpaceBeforeCtorInitializerColon: true # Unknown to clang-format-5.0
#SpaceBeforeInheritanceColon: true # Unknown to clang-format-5.0
SpaceBeforeParens: ControlStatements
#SpaceBeforeRangeBasedForLoopColon: true # Unknown to clang-format-5.0
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInContainerLiterals: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp03
TabWidth: 8
UseTab: Always

下次写代码,直接用Clang-Format格式化代码即可。
linux驱动开发,vscode环境配置_第9张图片

7 使用clangd阅读linux kernel源码

7.1 先下载clangd可执行文件

https://github.com/clangd/clangd/releases/tag/15.0.0
把clangd-linux-15.0.0.zip放在:~/.vscode-server/data/User/globalStorage/llvm-vs-code-extensions.vscode-clangd目录下,然后unzip这个文件

7.2 安装配置clangd插件

在这里插入图片描述
需要禁用掉微软的C/C++插件。
在这里插入图片描述
修改clangd可执行文件的位置。
把7.1步骤下载来的bin/clangd可执行文件路径复制进来。注意是绝对路径。
linux驱动开发,vscode环境配置_第10张图片

7.3 建立compile_commands.json文件

Linux源码的scripts/clang-tools/gen_compile_commands.py有点问题。使用bear命令生成compile_commands.json

sudo apt-get install bear

然后通过bear来记录编译时的信息。正常编译kernel,只不过加了bear的前缀

./build clean && bear ./build.sh

7.4 clangd插件的自动配置

每次使用vscode自动配置clangd。在目录下.vscode/setting.json中追加:
linux驱动开发,vscode环境配置_第11张图片

7.5 让clangd缓存

打开任何一个C文件,这里都会显示缓存情况。我这个是已经建立完成缓存的,一般需要一两分钟建立。
在这里插入图片描述
默认的缓存文件放在.cache/目录下
在这里插入图片描述
现在单击函数名,就能跳转到实际编译的函数里了
linux驱动开发,vscode环境配置_第12张图片

附录: 其他人的参考设置

https://bitaichi.com/2021/09/05/VS-Code-%E6%90%AD%E5%BB%BA-Linux-Kernel-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83-2021%E7%89%88/

我的setting.json

{
    "files.watcherExclude": {
        "**/.git/objects/**": true,
        "**/.git/subtree-cache/**": true,
        "**/node_modules/*/**": true
    },
    "search.exclude": {
        "README": true,
        "arch/arc*":true,
        "arch/[b-z]*":true,
    },
    "search.followSymlinks":false,
    "files.exclude": {
        "**/.git": true,
        "**/.svn": true,
        "**/.hg": true,
        "**/CVS": true,
        "**/.DS_Store": true,
        // "**/*.o":true,
        "**/*.repo":true,
        // "**/*Kconfig":true,
        "**/*.su":true,
        "**/*.cmd":true,
        "**/*.gitignore":true,
        ".gitignore":true,
        ".arclint":true,
        ".config.old":true,
        "u-boot*":true,
        "*README*":true,

        "**/Kbuild":true,
        "**/Kconfig.*":true,

        "arch/[c-z]*":true,
        "arch/arm":true,
        "arch/alpha":true,
        "arch/arc":true,
        "arch/Kconfig":true,
        "arch/arm64/configs/defconfig":true,
        "arch/arm64/crypto":true,
        "arch/arm64/[d-z]*":true,
        "arch/arm64/boot/dts/[a-g]*":true,
        "arch/arm64/boot/dts/[i-z]*":true,
        "arch/arm64/boot/dts/hi*":true,
        "arch/arm64/boot/dts/Makefile":true,

        
        "board/[a-g]*":true,
        "board/[i-z]*":true,
        "board/h[a-n]*":true,
        "board/h[p-z]*":true,
        "board/[A-Z]*":true,
        "board/[0-9]*":true,
        "board/h[0-9]*/":true,

        "configs/[A-Z]*/":true,
        "configs/[a-g]*/":true,
        "configs/[i-z]*/":true,
        "configs/[0-9]*/":true,
        "configs/h[0-9]*/":true,
        "configs/h[a-l]*/":true,
        "configs/h[n-z]*/":true,
        "LICENSES":true,
        "Licenses/":true,
        // "include/":true,
        "net/":true,
        // "post/":true,
        // "fs/":true,
        // "env/":true,
        // "examples/":true,
        // "disk/":true,
        // "dts/":true,
        // "tools/":true,
        // "test/":true,
        "Doc*/":true,
        "doc/":true,
        // "scripts/":true,
        // "api/":true,
    },
    "files.associations": {
        "*.S": "c",
        "xj3_soc_defconfig": "makefile",
        "xj3_perf_defconfig": "makefile",
        ".config": "makefile",
        "interrupt.h": "c",
        "module.h": "c",
        "spi.h": "c",
        "elf.h": "c",
        "spi_master_protocol.h": "c",
        "*_defconfig": "makefile",
        "diag_lib.h": "c",
        "sstream": "c",
        "api.h": "c",
        "environment.h": "c",
        "mmc_private.h": "c",
        "hb_info.h": "c",
        "*.inc": "c",
        "typeinfo": "c",
        "net.h": "c",
        "eth_internal.h": "c",
        "phy.h": "c",
        "reset.h": "c",
        "common.h": "c",
        "lzmatools.h": "c",
        "wait_bit.h": "c",
        "autoboot.h": "c",
        "timer.h": "c",
        "bootretry.h": "c",
        "cli.h": "c",
        "console.h": "c",
        "fdtdec.h": "c",
        "menu.h": "c",
        "post.h": "c",
        "sha256.h": "c",
        "bootcount.h": "c",
        "dm.h": "c",
        "errno.h": "c",
        "watchdog.h": "c",
        "div64.h": "c",
        "io.h": "c",
        "time.h": "c",
        "bootstage.h": "c",
        "mkimage.h": "c",
        "hb_bootstage.h": "c",
        "config.h": "c",
        "array": "c",
        "*.tcc": "c",
        "memory": "c",
        "istream": "c",
        "functional": "c",
        "tuple": "c",
        "utility": "c",
        "command.h": "c",
        "optional": "cpp",
        "ostream": "cpp",
        "system_error": "cpp",
        "type_traits": "cpp",
        "env_default.h": "c",
        "part.h": "c",
        "arm-smccc.h": "c",
        "xj3_cpus.h": "c",
        "string_view": "c",
        "initializer_list": "c",
        "ota.h": "c",
        "mmc.h": "c",
        "image.h": "c",
        "md5.h": "c",
        "bootm.h": "c",
        "cpu.h": "c",
        "xj3.h": "c",
        "veeprom.h": "c",
        "ov10635_i2c.h": "c",
        "clk.h": "c",
        "avb_verify.h": "c",
        "hb_reg.h": "c",
        "input.h": "c",
        "inno_gpio.h": "c",
        "hash_map": "c",
        "hash_set": "c",
        "cache.h": "c",
        "cpu_func.h": "c",
        "houmo800_reg.h": "c",
        "hm_sysctl.h": "c",
        "deque": "c",
        "string": "c",
        "unordered_map": "c",
        "vector": "c",
        "debug.h": "c",
        "compiler.h": "c",
        "malloc.h": "c",
        "serial_hm800.h": "c",
        "serial.h": "c",
        "err.h": "c",
        "kconfig.h": "c",
        "spl.h": "c",
        "hm_bootdev.h": "c",
        "stdbool.h": "c",
        "log.h": "c",
        "size.h": "c",
        "ctype.h": "c",
        "sizes.h": "c",
        "pinctrl-utils.h": "c",
        "wait.h": "c",
        "reset-controller.h": "c",
        "hal_interface.h": "c",
        "dmaengine.h": "c",
        "dma-mapping.h": "c",
        "dw-axi-dmac.h": "c",
        "kernel.h": "c"
    },
    "C_Cpp.default.intelliSenseMode": "linux-gcc-arm",
    "C_Cpp.intelliSenseEngine": "Disabled",
    "clangd.path": "/home/ru.tang/.vscode-server/data/User/globalStorage/llvm-vs-code-extensions.vscode-clangd/clangd_13.0.0/bin/clangd",
    "clangd.onConfigChanged": "restart",
    "clangd.arguments": [
        "--clang-tidy",
        "--clang-tidy-checks=performance-*,bugprone-*",
        // "--compile-commands-dir=${workspaceFolder}/.vscode/",
        "--background-index",
        "--completion-style=detailed",
        "--enable-config", "--function-arg-placeholders=false",
        "--all-scopes-completion",
        "--header-insertion-decorators",
        "--header-insertion=never",
        "--log=verbose",
        "--pch-storage=memory",
        "--pretty", "--ranking-model=decision_forest",
        "--cross-file-rename",
        "-j=16"
        ],
    "clangd.checkUpdates": false,
}

你可能感兴趣的:(vscode,linux,驱动开发,嵌入式,编辑器)